Merge branch 'merge.nfs-fs_parse.1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / kernel / cgroup / cgroup.c
index a70a37e..db552b9 100644 (file)
@@ -3050,8 +3050,6 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp)
                for_each_subsys(ss, ssid) {
                        struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
 
-                       WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt));
-
                        if (!(cgroup_ss_mask(dsct) & (1 << ss->id)))
                                continue;
 
@@ -3061,6 +3059,8 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp)
                                        return PTR_ERR(css);
                        }
 
+                       WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt));
+
                        if (css_visible(css)) {
                                ret = css_populate_dir(css);
                                if (ret)
@@ -3096,11 +3096,11 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp)
                for_each_subsys(ss, ssid) {
                        struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
 
-                       WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt));
-
                        if (!css)
                                continue;
 
+                       WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt));
+
                        if (css->parent &&
                            !(cgroup_ss_mask(dsct) & (1 << ss->id))) {
                                kill_css(css);
@@ -3387,7 +3387,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file *of, char *buf,
        if (strcmp(strstrip(buf), "threaded"))
                return -EINVAL;
 
-       cgrp = cgroup_kn_lock_live(of->kn, false);
+       /* drain dying csses before we re-apply (threaded) subtree control */
+       cgrp = cgroup_kn_lock_live(of->kn, true);
        if (!cgrp)
                return -ENOENT;
 
@@ -6283,12 +6284,13 @@ void cgroup_sk_free(struct sock_cgroup_data *skcd)
 
 #ifdef CONFIG_CGROUP_BPF
 int cgroup_bpf_attach(struct cgroup *cgrp, struct bpf_prog *prog,
-                     enum bpf_attach_type type, u32 flags)
+                     struct bpf_prog *replace_prog, enum bpf_attach_type type,
+                     u32 flags)
 {
        int ret;
 
        mutex_lock(&cgroup_mutex);
-       ret = __cgroup_bpf_attach(cgrp, prog, type, flags);
+       ret = __cgroup_bpf_attach(cgrp, prog, replace_prog, type, flags);
        mutex_unlock(&cgroup_mutex);
        return ret;
 }