Implement ->proc_write_buf() so procfs copies in what is written to the simdisk files before it pins the entry, and take the file name from that copy. The files took up to PAGE_SIZE bytes and keep doing that through ->proc_write_size.
Signed-off-by: Christian Brauner (Amutable) <[email protected]> --- arch/xtensa/platforms/iss/simdisk.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/arch/xtensa/platforms/iss/simdisk.c b/arch/xtensa/platforms/iss/simdisk.c index 7b115e023de9..b2f9e7f3ade3 100644 --- a/arch/xtensa/platforms/iss/simdisk.c +++ b/arch/xtensa/platforms/iss/simdisk.c @@ -241,7 +241,7 @@ static ssize_t proc_read_simdisk(struct file *file, char __user *buf, ssize_t len; char *temp; - /* a write sets at most a page, see proc_write_simdisk() */ + /* a write sets at most a page, see simdisk_proc_ops */ temp = kmalloc(PAGE_SIZE + 2, GFP_KERNEL); if (!temp) return -ENOMEM; @@ -255,40 +255,34 @@ static ssize_t proc_read_simdisk(struct file *file, char __user *buf, return len; } -static ssize_t proc_write_simdisk(struct file *file, const char __user *buf, +static ssize_t proc_write_simdisk(struct file *file, char *buf, size_t count, loff_t *ppos) { - char *tmp; struct simdisk *dev = pde_data(file_inode(file)); int err; - if (count == 0 || count > PAGE_SIZE) + if (count == 0) return -EINVAL; - tmp = memdup_user_nul(buf, count); - if (IS_ERR(tmp)) - return PTR_ERR(tmp); - err = simdisk_detach(dev); if (err != 0) - goto out_free; + return err; - if (count > 0 && tmp[count - 1] == '\n') - tmp[count - 1] = 0; + if (count > 0 && buf[count - 1] == '\n') + buf[count - 1] = 0; - if (tmp[0]) - err = simdisk_attach(dev, tmp); + if (buf[0]) + err = simdisk_attach(dev, buf); if (err == 0) err = count; -out_free: - kfree(tmp); return err; } static const struct proc_ops simdisk_proc_ops = { .proc_read = proc_read_simdisk, - .proc_write = proc_write_simdisk, + .proc_write_buf = proc_write_simdisk, + .proc_write_size = PAGE_SIZE, .proc_lseek = default_llseek, }; -- 2.53.0
