diff options
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r-- | kernel/cgroup.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 358e77564e6f..fe00b3b983a8 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -2039,10 +2039,13 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) | |||
2039 | struct cgroup *cgrp; | 2039 | struct cgroup *cgrp; |
2040 | struct cgroup_iter it; | 2040 | struct cgroup_iter it; |
2041 | struct task_struct *tsk; | 2041 | struct task_struct *tsk; |
2042 | |||
2042 | /* | 2043 | /* |
2043 | * Validate dentry by checking the superblock operations | 2044 | * Validate dentry by checking the superblock operations, |
2045 | * and make sure it's a directory. | ||
2044 | */ | 2046 | */ |
2045 | if (dentry->d_sb->s_op != &cgroup_ops) | 2047 | if (dentry->d_sb->s_op != &cgroup_ops || |
2048 | !S_ISDIR(dentry->d_inode->i_mode)) | ||
2046 | goto err; | 2049 | goto err; |
2047 | 2050 | ||
2048 | ret = 0; | 2051 | ret = 0; |
@@ -2472,10 +2475,7 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
2472 | mutex_unlock(&cgroup_mutex); | 2475 | mutex_unlock(&cgroup_mutex); |
2473 | return -EBUSY; | 2476 | return -EBUSY; |
2474 | } | 2477 | } |
2475 | 2478 | mutex_unlock(&cgroup_mutex); | |
2476 | parent = cgrp->parent; | ||
2477 | root = cgrp->root; | ||
2478 | sb = root->sb; | ||
2479 | 2479 | ||
2480 | /* | 2480 | /* |
2481 | * Call pre_destroy handlers of subsys. Notify subsystems | 2481 | * Call pre_destroy handlers of subsys. Notify subsystems |
@@ -2483,7 +2483,14 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
2483 | */ | 2483 | */ |
2484 | cgroup_call_pre_destroy(cgrp); | 2484 | cgroup_call_pre_destroy(cgrp); |
2485 | 2485 | ||
2486 | if (cgroup_has_css_refs(cgrp)) { | 2486 | mutex_lock(&cgroup_mutex); |
2487 | parent = cgrp->parent; | ||
2488 | root = cgrp->root; | ||
2489 | sb = root->sb; | ||
2490 | |||
2491 | if (atomic_read(&cgrp->count) | ||
2492 | || !list_empty(&cgrp->children) | ||
2493 | || cgroup_has_css_refs(cgrp)) { | ||
2487 | mutex_unlock(&cgroup_mutex); | 2494 | mutex_unlock(&cgroup_mutex); |
2488 | return -EBUSY; | 2495 | return -EBUSY; |
2489 | } | 2496 | } |