Provide an extra function, proc_create_single_write_data() that act like its non-write version but also set a write method in the proc_dir_entry struct. Alse provide a macro proc_create_single_write to reduces the boilerplate code in the callers. Signed-off-by: Qingjie Xing <xqjcool@xxxxxxxxx> --- fs/proc/generic.c | 18 ++++++++++++++++++ include/linux/proc_fs.h | 8 +++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/fs/proc/generic.c b/fs/proc/generic.c index dbe82cf23ee4..0f32a92195fc 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -641,6 +641,7 @@ static const struct proc_ops proc_single_ops = { .proc_read_iter = seq_read_iter, .proc_lseek = seq_lseek, .proc_release = single_release, + .proc_write = proc_simple_write, }; struct proc_dir_entry *proc_create_single_data(const char *name, umode_t mode, @@ -658,6 +659,23 @@ struct proc_dir_entry *proc_create_single_data(const char *name, umode_t mode, } EXPORT_SYMBOL(proc_create_single_data); +struct proc_dir_entry *proc_create_single_write_data(const char *name, + umode_t mode, struct proc_dir_entry *parent, + int (*show)(struct seq_file *, void *), proc_write_t write, + void *data) +{ + struct proc_dir_entry *p; + + p = proc_create_reg(name, mode, &parent, data); + if (!p) + return NULL; + p->proc_ops = &proc_single_ops; + p->single_show = show; + p->write = write; + return proc_register(parent, p); +} +EXPORT_SYMBOL(proc_create_single_write_data); + void proc_set_size(struct proc_dir_entry *de, loff_t size) { de->size = size; diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 0b2a89854440..488d0b76a06f 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -102,7 +102,13 @@ struct proc_dir_entry *proc_create_single_data(const char *name, umode_t mode, int (*show)(struct seq_file *, void *), void *data); #define proc_create_single(name, mode, parent, show) \ proc_create_single_data(name, mode, parent, show, NULL) - +struct proc_dir_entry *proc_create_single_write_data(const char *name, + umode_t mode, struct proc_dir_entry *parent, + int (*show)(struct seq_file *, void *), proc_write_t write, + void *data); +#define proc_create_single_write(name, mode, parent, show, write) \ + proc_create_single_write_data(name, mode, parent, show, write, NULL) + extern struct proc_dir_entry *proc_create_data(const char *, umode_t, struct proc_dir_entry *, const struct proc_ops *, -- 2.43.0