diff options
Diffstat (limited to 'kernel/cgroup.c')
| -rw-r--r-- | kernel/cgroup.c | 31 | 
1 files changed, 16 insertions, 15 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 2a9926275f8..a7c9e6ddb97 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -1686,11 +1686,14 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,  		 */  		cgroup_drop_root(opts.new_root); -		if (((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) && -		    root->flags != opts.flags) { -			pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); -			ret = -EINVAL; -			goto drop_new_super; +		if (root->flags != opts.flags) { +			if ((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) { +				pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); +				ret = -EINVAL; +				goto drop_new_super; +			} else { +				pr_warning("cgroup: new mount options do not match the existing superblock, will be ignored\n"); +			}  		}  		/* no subsys rebinding, so refcounts don't change */ @@ -2699,13 +2702,14 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,  		goto out;  	} +	cfe->type = (void *)cft; +	cfe->dentry = dentry; +	dentry->d_fsdata = cfe; +	simple_xattrs_init(&cfe->xattrs); +  	mode = cgroup_file_mode(cft);  	error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb);  	if (!error) { -		cfe->type = (void *)cft; -		cfe->dentry = dentry; -		dentry->d_fsdata = cfe; -		simple_xattrs_init(&cfe->xattrs);  		list_add_tail(&cfe->node, &parent->files);  		cfe = NULL;  	} @@ -2953,11 +2957,8 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,  	WARN_ON_ONCE(!rcu_read_lock_held());  	/* if first iteration, pretend we just visited @cgroup */ -	if (!pos) { -		if (list_empty(&cgroup->children)) -			return NULL; +	if (!pos)  		pos = cgroup; -	}  	/* visit the first child if exists */  	next = list_first_or_null_rcu(&pos->children, struct cgroup, sibling); @@ -2965,14 +2966,14 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,  		return next;  	/* no child, visit my or the closest ancestor's next sibling */ -	do { +	while (pos != cgroup) {  		next = list_entry_rcu(pos->sibling.next, struct cgroup,  				      sibling);  		if (&next->sibling != &pos->parent->children)  			return next;  		pos = pos->parent; -	} while (pos != cgroup); +	}  	return NULL;  }  |