cgroup add cftype->open/release() callbacks
authorTejun Heo <tj@kernel.org>
Tue, 27 Dec 2016 19:49:03 +0000 (14:49 -0500)
committerTejun Heo <tj@kernel.org>
Tue, 27 Dec 2016 19:49:03 +0000 (14:49 -0500)
Pipe the newly added kernfs->open/release() callbacks through cftype.
While at it, as cleanup operations now can be performed from
->release() instead of ->seq_stop(), make the latter optional.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Acked-by: Zefan Li <lizefan@huawei.com>
include/linux/cgroup-defs.h
kernel/cgroup.c

index 861b4677fc5b41134f96da33710a79735b827fe0..8a916dc96e847e9eb2cebe27ae24aacf01933e25 100644 (file)
@@ -388,6 +388,9 @@ struct cftype {
        struct list_head node;          /* anchored at ss->cfts */
        struct kernfs_ops *kf_ops;
 
+       int (*open)(struct kernfs_open_file *of);
+       void (*release)(struct kernfs_open_file *of);
+
        /*
         * read_u64() is a shortcut for the common case of returning a
         * single integer. Use it in place of read()
index 2ee9ec3051b20774b118a57e4609f30e87bf82be..87167e40c4faf059b61559e263d3369f4309bfe5 100644 (file)
@@ -3503,6 +3503,23 @@ static int cgroup_events_show(struct seq_file *seq, void *v)
        return 0;
 }
 
+static int cgroup_file_open(struct kernfs_open_file *of)
+{
+       struct cftype *cft = of->kn->priv;
+
+       if (cft->open)
+               return cft->open(of);
+       return 0;
+}
+
+static void cgroup_file_release(struct kernfs_open_file *of)
+{
+       struct cftype *cft = of->kn->priv;
+
+       if (cft->release)
+               cft->release(of);
+}
+
 static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
                                 size_t nbytes, loff_t off)
 {
@@ -3553,7 +3570,8 @@ static void *cgroup_seqfile_next(struct seq_file *seq, void *v, loff_t *ppos)
 
 static void cgroup_seqfile_stop(struct seq_file *seq, void *v)
 {
-       seq_cft(seq)->seq_stop(seq, v);
+       if (seq_cft(seq)->seq_stop)
+               seq_cft(seq)->seq_stop(seq, v);
 }
 
 static int cgroup_seqfile_show(struct seq_file *m, void *arg)
@@ -3575,12 +3593,16 @@ static int cgroup_seqfile_show(struct seq_file *m, void *arg)
 
 static struct kernfs_ops cgroup_kf_single_ops = {
        .atomic_write_len       = PAGE_SIZE,
+       .open                   = cgroup_file_open,
+       .release                = cgroup_file_release,
        .write                  = cgroup_file_write,
        .seq_show               = cgroup_seqfile_show,
 };
 
 static struct kernfs_ops cgroup_kf_ops = {
        .atomic_write_len       = PAGE_SIZE,
+       .open                   = cgroup_file_open,
+       .release                = cgroup_file_release,
        .write                  = cgroup_file_write,
        .seq_start              = cgroup_seqfile_start,
        .seq_next               = cgroup_seqfile_next,