It was introduced for cgroups virtualization but since we use bindmounts, lets drop it and step back to native per-root @release_agent_path.
Signed-off-by: Cyrill Gorcunov <gorcu...@odin.com> CC: Vladimir Davydov <vdavy...@odin.com> CC: Konstantin Khorenko <khore...@odin.com> CC: Pavel Emelyanov <xe...@odin.com> CC: Andrey Vagin <ava...@odin.com> --- include/linux/cgroup.h | 6 +++--- kernel/cgroup.c | 42 +++++++++++------------------------------- 2 files changed, 14 insertions(+), 34 deletions(-) Index: linux-pcs7.git/include/linux/cgroup.h =================================================================== --- linux-pcs7.git.orig/include/linux/cgroup.h +++ linux-pcs7.git/include/linux/cgroup.h @@ -236,9 +236,6 @@ struct cgroup { struct cgroupfs_root *root; - /* The path to use for release notifications. */ - char *release_agent; - /* Owner VE for fake cgroup hierarchy */ struct ve_struct *cgroup_ve; struct list_head cgroup_ve_list; @@ -364,6 +361,9 @@ struct cgroupfs_root { /* IDs for cgroups in this hierarchy */ struct ida cgroup_ida; + /* The path to use for release notifications. */ + char release_agent_path[PATH_MAX]; + /* The name for this hierarchy - may be empty */ char name[MAX_CGROUP_ROOT_NAMELEN]; }; Index: linux-pcs7.git/kernel/cgroup.c =================================================================== --- linux-pcs7.git.orig/kernel/cgroup.c +++ linux-pcs7.git/kernel/cgroup.c @@ -852,7 +852,6 @@ static void cgroup_free_fn(struct work_s ss->css_free(cgrp); cgrp->root->number_of_cgroups--; - kfree(cgrp->release_agent); mutex_unlock(&cgroup_mutex); /* @@ -1093,7 +1092,6 @@ static int rebind_subsystems(struct cgro static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry) { struct cgroupfs_root *root = dentry->d_sb->s_fs_info; - struct cgroup *top_cgrp; struct cgroup_subsys *ss; mutex_lock(&cgroup_root_mutex); @@ -1106,14 +1104,8 @@ static int cgroup_show_options(struct se if (root->flags & CGRP_ROOT_XATTR) seq_puts(seq, ",xattr"); - /* bindmount to attribute file? */ - if (!S_ISDIR(dentry->d_inode->i_mode)) - dentry = dentry->d_parent; - top_cgrp = dentry->d_fsdata; - /* release_agent is stored on top cgroup */ - top_cgrp = &top_cgrp->root->top_cgroup; - if (top_cgrp->release_agent) - seq_printf(seq, ",release_agent=%s", top_cgrp->release_agent); + if (strlen(root->release_agent_path)) + seq_printf(seq, ",release_agent=%s", root->release_agent_path); if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags)) seq_puts(seq, ",clone_children"); @@ -1388,11 +1380,8 @@ static int cgroup_remount(struct super_b /* re-populate subsystem files */ cgroup_populate_dir(cgrp, false, added_mask); - if (opts.release_agent) { - kfree(cgrp->release_agent); - cgrp->release_agent = opts.release_agent; - opts.release_agent = NULL; - } + if (opts.release_agent) + strcpy(root->release_agent_path, opts.release_agent); out_unlock: kfree(opts.release_agent); kfree(opts.name); @@ -1505,6 +1494,8 @@ static struct cgroupfs_root *cgroup_root root->subsys_mask = opts->subsys_mask; root->flags = opts->flags; ida_init(&root->cgroup_ida); + if (opts->release_agent) + strcpy(root->release_agent_path, opts->release_agent); if (opts->name) strcpy(root->name, opts->name); if (opts->cpuset_clone_children) @@ -1702,9 +1693,7 @@ static struct dentry *cgroup_mount(struc BUG_ON(!list_empty(&root_cgrp->children)); BUG_ON(root->number_of_cgroups != 1); - root_cgrp->release_agent = opts.release_agent; root_cgrp->cgroup_ve = get_exec_env(); - opts.release_agent = NULL; cred = override_creds(&init_cred); cgroup_populate_dir(root_cgrp, true, root->subsys_mask); @@ -2250,23 +2239,16 @@ static int cgroup_procs_write(struct cgr static int cgroup_release_agent_write(struct cgroup *cgrp, struct cftype *cft, const char *buffer) { - char *release_agent; + BUILD_BUG_ON(sizeof(cgrp->root->release_agent_path) < PATH_MAX); if (strlen(buffer) >= PATH_MAX) return -EINVAL; - release_agent = kstrdup(buffer, GFP_KERNEL); - if (!release_agent) - return -ENOMEM; - - if (!cgroup_lock_live_group(cgrp)) { - kfree(release_agent); + if (!cgroup_lock_live_group(cgrp)) return -ENODEV; - } mutex_lock(&cgroup_root_mutex); - kfree(cgrp->release_agent); - cgrp->release_agent = release_agent; + strcpy(cgrp->root->release_agent_path, buffer); mutex_unlock(&cgroup_root_mutex); mutex_unlock(&cgroup_mutex); return 0; @@ -2277,8 +2259,7 @@ static int cgroup_release_agent_show(str { if (!cgroup_lock_live_group(cgrp)) return -ENODEV; - if (cgrp->release_agent) - seq_puts(seq, cgrp->release_agent); + seq_puts(seq, cgrp->root->release_agent_path); seq_putc(seq, '\n'); mutex_unlock(&cgroup_mutex); return 0; @@ -5127,13 +5108,12 @@ static void cgroup_release_agent(struct release_list); list_del_init(&cgrp->release_list); raw_spin_unlock(&release_list_lock); - pathbuf = kmalloc(PAGE_SIZE, GFP_KERNEL); if (!pathbuf) goto continue_free; if (cgroup_path(cgrp, pathbuf, PAGE_SIZE) < 0) goto continue_free; - agentbuf = kstrdup(cgrp->root->top_cgroup.release_agent, GFP_KERNEL); + agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); if (!agentbuf) goto continue_free; _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel