|
@@ -901,13 +901,10 @@ static void cgroup_diput(struct dentry *dentry, struct inode *inode)
|
|
|
mutex_unlock(&cgroup_mutex);
|
|
|
|
|
|
/*
|
|
|
- * We want to drop the active superblock reference from the
|
|
|
- * cgroup creation after all the dentry refs are gone -
|
|
|
- * kill_sb gets mighty unhappy otherwise. Mark
|
|
|
- * dentry->d_fsdata with cgroup_diput() to tell
|
|
|
- * cgroup_d_release() to call deactivate_super().
|
|
|
+ * Drop the active superblock reference that we took when we
|
|
|
+ * created the cgroup
|
|
|
*/
|
|
|
- dentry->d_fsdata = cgroup_diput;
|
|
|
+ deactivate_super(cgrp->root->sb);
|
|
|
|
|
|
/*
|
|
|
* if we're getting rid of the cgroup, refcount should ensure
|
|
@@ -933,13 +930,6 @@ static int cgroup_delete(const struct dentry *d)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-static void cgroup_d_release(struct dentry *dentry)
|
|
|
-{
|
|
|
- /* did cgroup_diput() tell me to deactivate super? */
|
|
|
- if (dentry->d_fsdata == cgroup_diput)
|
|
|
- deactivate_super(dentry->d_sb);
|
|
|
-}
|
|
|
-
|
|
|
static void remove_dir(struct dentry *d)
|
|
|
{
|
|
|
struct dentry *parent = dget(d->d_parent);
|
|
@@ -1547,7 +1537,6 @@ static int cgroup_get_rootdir(struct super_block *sb)
|
|
|
static const struct dentry_operations cgroup_dops = {
|
|
|
.d_iput = cgroup_diput,
|
|
|
.d_delete = cgroup_delete,
|
|
|
- .d_release = cgroup_d_release,
|
|
|
};
|
|
|
|
|
|
struct inode *inode =
|
|
@@ -3894,8 +3883,12 @@ static void css_dput_fn(struct work_struct *work)
|
|
|
{
|
|
|
struct cgroup_subsys_state *css =
|
|
|
container_of(work, struct cgroup_subsys_state, dput_work);
|
|
|
+ struct dentry *dentry = css->cgroup->dentry;
|
|
|
+ struct super_block *sb = dentry->d_sb;
|
|
|
|
|
|
- dput(css->cgroup->dentry);
|
|
|
+ atomic_inc(&sb->s_active);
|
|
|
+ dput(dentry);
|
|
|
+ deactivate_super(sb);
|
|
|
}
|
|
|
|
|
|
static void init_cgroup_css(struct cgroup_subsys_state *css,
|