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


Reply via email to