Skip to content

Commit

Permalink
cgroup: CGRP_ROOT_SUBSYS_BOUND should be ignored when comparing mount…
Browse files Browse the repository at this point in the history
… options

1672d04 ("cgroup: fix cgroupfs_root early destruction path")
introduced CGRP_ROOT_SUBSYS_BOUND which is used to mark completion of
subsys binding on a new root; however, this broke remounts.
cgroup_remount() doesn't allow changing root options via remount and
CGRP_ROOT_SUBSYS_BOUND, which is set on all fully initialized roots,
makes the function reject all remounts.

Fix it by putting the options part in the lower 16 bits of root->flags
and masking the comparions.  While at it, make cgroup_remount() emit
an error message explaining why it's rejecting a remount request, so
that it's less of a mystery.

Signed-off-by: Tejun Heo <tj@kernel.org>
  • Loading branch information
Tejun Heo committed Jun 28, 2013
1 parent e2bd416 commit 0ce6cba
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
6 changes: 5 additions & 1 deletion include/linux/cgroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,11 @@ enum {

CGRP_ROOT_NOPREFIX = (1 << 1), /* mounted subsystems have no named prefix */
CGRP_ROOT_XATTR = (1 << 2), /* supports extended attributes */
CGRP_ROOT_SUBSYS_BOUND = (1 << 3), /* subsystems finished binding */

/* mount options live below bit 16 */
CGRP_ROOT_OPTION_MASK = (1 << 16) - 1,

CGRP_ROOT_SUBSYS_BOUND = (1 << 16), /* subsystems finished binding */
};

/*
Expand Down
5 changes: 4 additions & 1 deletion kernel/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1362,8 +1362,11 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data)
removed_mask = root->subsys_mask & ~opts.subsys_mask;

/* Don't allow flags or name to change at remount */
if (opts.flags != root->flags ||
if (((opts.flags ^ root->flags) & CGRP_ROOT_OPTION_MASK) ||
(opts.name && strcmp(opts.name, root->name))) {
pr_err("cgroup: option or name mismatch, new: 0x%lx \"%s\", old: 0x%lx \"%s\"\n",
opts.flags & CGRP_ROOT_OPTION_MASK, opts.name ?: "",
root->flags & CGRP_ROOT_OPTION_MASK, root->name);
ret = -EINVAL;
goto out_unlock;
}
Expand Down

0 comments on commit 0ce6cba

Please sign in to comment.