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) <brauner@kernel.org>
---
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