Commit f9ab5b5b0f5be506640321d710b0acd3dca6154a

Authored by Li Zefan
Committed by Linus Torvalds
1 parent 8ca739e369

cgroups: forbid noprefix if mounting more than just cpuset subsystem

The 'noprefix' option was introduced for backwards-compatibility of
cpuset, but actually it can be used when mounting other subsystems.

This results in possibility of name collision, and now the collision can
really happen, because we have 'stat' file in both memory and cpuacct
subsystem:

	# mount -t cgroup -o noprefix,memory,cpuacct xxx /mnt

Cgroup will happily mount the 2 subsystems, but only 'stat' file of memory
subsys can be seen.

We don't want users to use nopreifx, and also want to avoid name
collision, so we change to allow noprefix only if mounting just the cpuset
subsystem.

[akpm@linux-foundation.org: fix shift for cpuset_subsys_id >= 32]
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Paul Menage <menage@google.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Acked-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 14 additions and 0 deletions Side-by-side Diff

... ... @@ -843,7 +843,12 @@
843 843 struct cgroup_sb_opts *opts)
844 844 {
845 845 char *token, *o = data ?: "all";
  846 + unsigned long mask = (unsigned long)-1;
846 847  
  848 +#ifdef CONFIG_CPUSETS
  849 + mask = ~(1UL << cpuset_subsys_id);
  850 +#endif
  851 +
847 852 opts->subsys_bits = 0;
848 853 opts->flags = 0;
849 854 opts->release_agent = NULL;
... ... @@ -886,6 +891,15 @@
886 891 return -ENOENT;
887 892 }
888 893 }
  894 +
  895 + /*
  896 + * Option noprefix was introduced just for backward compatibility
  897 + * with the old cpuset, so we allow noprefix only if mounting just
  898 + * the cpuset subsystem.
  899 + */
  900 + if (test_bit(ROOT_NOPREFIX, &opts->flags) &&
  901 + (opts->subsys_bits & mask))
  902 + return -EINVAL;
889 903  
890 904 /* We can't have an empty hierarchy */
891 905 if (!opts->subsys_bits)