This patch makes lxc to detect a specific cgroup dedicated to lxc
which is mounted with the lxc name. That allows to mount different
cgroup in different places with different options (aka subsystems)
and assign one to be used by lxc. If no such mount point is found,
the first cgroup mount point is used.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
---
 doc/lxc.sgml.in  |   31 ++++++++++++++++++++-----------
 src/lxc/cgroup.c |   25 ++++++++++++++++---------
 2 files changed, 36 insertions(+), 20 deletions(-)

Index: lxc/src/lxc/cgroup.c
===================================================================
--- lxc.orig/src/lxc/cgroup.c
+++ lxc/src/lxc/cgroup.c
@@ -58,11 +58,20 @@ static int get_cgroup_mount(const char *
         }
 
         while ((mntent = getmntent(file))) {
-                if (strcmp(mntent->mnt_type, "cgroup"))
-                        continue;
-                strcpy(mnt, mntent->mnt_dir);
-                err = 0;
-                break;
+
+		/* there is a cgroup mounted named "lxc" */
+		if (!strcmp(mntent->mnt_fsname, "lxc") &&
+		    !strcmp(mntent->mnt_type, "cgroup")) {
+			strcpy(mnt, mntent->mnt_dir);
+			err = 0;
+			break;
+		}
+
+		/* fallback to the first non-lxc cgroup found */
+                if (!strcmp(mntent->mnt_type, "cgroup") && err) {
+			strcpy(mnt, mntent->mnt_dir);
+			err = 0;
+		}
         };
 
         fclose(file);
@@ -87,8 +96,7 @@ int lxc_rename_nsgroup(const char *name,
 
 	ret = rename(oldname, newname);
 	if (ret)
-		SYSERROR("failed to rename cgroup %s->%s",
-				 oldname, newname);
+		SYSERROR("failed to rename cgroup %s->%s", oldname, newname);
 	return ret;
 }
 
@@ -110,8 +118,7 @@ int lxc_link_nsgroup(const char *name)
 	unlink(lxc);
 	ret = symlink(nsgroup, lxc);
 	if (ret)
-		SYSERROR("failed to create symlink %s->%s",
-				 nsgroup, lxc);
+		SYSERROR("failed to create symlink %s->%s", nsgroup, lxc);
       return ret;
 }
 
Index: lxc/doc/lxc.sgml.in
===================================================================
--- lxc.orig/doc/lxc.sgml.in
+++ lxc/doc/lxc.sgml.in
@@ -126,27 +126,36 @@ Foundation, Inc., 59 Temple Place, Suite
       </programlisting>
 
       <para>
-	For the moment the easiest way to have all the features in the
-	kernel is to use the git tree at:
-	<systemitem>
-	  git://git.kernel.org/pub/scm/linux/kernel/git/daveh/linux-2.6-lxc.git
-	</systemitem>
 
-	But the kernel version >= 2.6.27 shipped with the distros, may
+	The kernel version >= 2.6.27 shipped with the distros, will
 	work with <command>lxc</command>, this one will have less
 	functionalities but enough to be interesting.
 
-	The planned kernel version which <command>lxc</command> should
-	be fully functionaly is 2.6.29.
+	With the kernel 2.6.29, <command>lxc</command> is fully
+	functional.
       </para>
 
       <para>
 	Before using the <command>lxc</command>, your system should be
 	configured with the file capabilities, otherwise you will need
-	to run the <command>lxc</command> commands as root. The
-	control group should be mounted anywhere, eg:
-	<command>mount -t cgroup cgroup /cgroup</command>
+	to run the <command>lxc</command> commands as root.
       </para>
+
+      <para>
+	  The control group can be mounted anywhere, eg:
+	  <command>mount -t cgroup cgroup /cgroup</command>.
+
+	  If you want to dedicate a specific cgroup mount point
+	  for <command>lxc</command>, that is to have different cgroups
+	  mounted at different places with different options but
+	  let <command>lxc</command> to use one location, you can bind
+	  the mount point with the <option>lxc</option> name, eg:
+	  <command>mount -t cgroup lxc /cgroup4lxc</command> or
+	  <command>mount -t cgroup -ons,cpuset,freezer,devices
+	  lxc /cgroup4lxc</command>
+
+      </para>
+
   </refsect1>
 
   <refsect1>



