Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1723430 > unrolled thread
| Started by | Christoph Hellwig <hch@lst.de> |
|---|---|
| First post | 2017-08-30 17:10 +0200 |
| Last post | 2017-09-01 12:50 +0200 |
| Articles | 15 — 2 participants |
Back to article view | Back to linux.kernel
switch in-kernel read/write calls to kernel_read/write Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
[PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
Re: [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read Al Viro <viro@ZenIV.linux.org.uk> - 2017-08-30 17:50 +0200
Re: [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read Christoph Hellwig <hch@lst.de> - 2017-09-01 12:50 +0200
[PATCH 09/16] net/9p: switch p9_fd_read to kernel_write Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
[PATCH 15/16] fs: unexport vfs_read and vfs_write Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
[PATCH 02/16] autofs4: switch autofs4_write to __kernel_write Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
Re: [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write Al Viro <viro@ZenIV.linux.org.uk> - 2017-08-30 17:40 +0200
Re: [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write Christoph Hellwig <hch@lst.de> - 2017-09-01 12:30 +0200
[PATCH 13/16] lustre: switch to kernel_write Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
[PATCH 03/16] fs: move kernel_write to fs/read_write.c Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
[PATCH 04/16] fs: move kernel_read to fs/read_write.c Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
[PATCH 06/16] fs: fix kernel_write prototype Christoph Hellwig <hch@lst.de> - 2017-08-30 17:10 +0200
Re: [PATCH 06/16] fs: fix kernel_write prototype Al Viro <viro@ZenIV.linux.org.uk> - 2017-08-30 17:40 +0200
Re: [PATCH 06/16] fs: fix kernel_write prototype Christoph Hellwig <hch@lst.de> - 2017-09-01 12:50 +0200
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | switch in-kernel read/write calls to kernel_read/write |
| Message-ID | <ukcMW-1sy-9@gated-at.bofh.it> |
Hi all, this series moves almost all kernel callers of vfs_read/write and friends to the kernel_read/write family that includes the set_fs calls inside the called routines. The exceptions are the integrity code (Mimi has a pending series for that one) and the splice readv code which doesn't fit those helpers. But at least no modular users are left.
[toc] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read |
| Message-ID | <ukcMX-1sy-33@gated-at.bofh.it> |
| In reply to | #1723430 |
Instead of playing with the address limit. This also gains us
validation of the kvec and proper atime updates.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
mm/nommu.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/mm/nommu.c b/mm/nommu.c
index fc184f597d59..379f1022bdea 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1164,17 +1164,8 @@ static int do_mmap_private(struct vm_area_struct *vma,
if (vma->vm_file) {
/* read the contents of a file into the copy */
- mm_segment_t old_fs;
- loff_t fpos;
-
- fpos = vma->vm_pgoff;
- fpos <<= PAGE_SHIFT;
-
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- ret = __vfs_read(vma->vm_file, base, len, &fpos);
- set_fs(old_fs);
-
+ loff_t fpos = vma->vm_pgoff << PAGE_SHIFT;
+ ret = kernel_read(vma->vm_file, base, len, &fpos);
if (ret < 0)
goto error_free;
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Al Viro <viro@ZenIV.linux.org.uk> |
|---|---|
| Date | 2017-08-30 17:50 +0200 |
| Subject | Re: [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read |
| Message-ID | <ukdpE-1Ib-13@gated-at.bofh.it> |
| In reply to | #1723431 |
On Wed, Aug 30, 2017 at 04:59:59PM +0200, Christoph Hellwig wrote: > - fpos = vma->vm_pgoff; > - fpos <<= PAGE_SHIFT; > + loff_t fpos = vma->vm_pgoff << PAGE_SHIFT; Umm... Are you sure it's OK on 32bit hosts?
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-09-01 12:50 +0200 |
| Subject | Re: [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read |
| Message-ID | <ukRGq-2P1-7@gated-at.bofh.it> |
| In reply to | #1723473 |
On Wed, Aug 30, 2017 at 04:41:28PM +0100, Al Viro wrote: > On Wed, Aug 30, 2017 at 04:59:59PM +0200, Christoph Hellwig wrote: > > - fpos = vma->vm_pgoff; > > - fpos <<= PAGE_SHIFT; > > > + loff_t fpos = vma->vm_pgoff << PAGE_SHIFT; > > Umm... Are you sure it's OK on 32bit hosts? It's not. Fixed.
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 09/16] net/9p: switch p9_fd_read to kernel_write |
| Message-ID | <ukcMY-1sy-41@gated-at.bofh.it> |
| In reply to | #1723430 |
Instead of playing with the addressing limits.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
net/9p/trans_fd.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index f12815777beb..903a190319b9 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c
@@ -422,8 +422,7 @@ static void p9_read_work(struct work_struct *work)
static int p9_fd_write(struct p9_client *client, void *v, int len)
{
- int ret;
- mm_segment_t oldfs;
+ ssize_t ret;
struct p9_trans_fd *ts = NULL;
if (client && client->status != Disconnected)
@@ -435,12 +434,7 @@ static int p9_fd_write(struct p9_client *client, void *v, int len)
if (!(ts->wr->f_flags & O_NONBLOCK))
p9_debug(P9_DEBUG_ERROR, "blocking write ...\n");
- oldfs = get_fs();
- set_fs(get_ds());
- /* The cast to a user pointer is valid due to the set_fs() */
- ret = vfs_write(ts->wr, (__force void __user *)v, len, &ts->wr->f_pos);
- set_fs(oldfs);
-
+ ret = kernel_write(ts->wr, v, len, &ts->wr->f_pos);
if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
client->status = Disconnected;
return ret;
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 15/16] fs: unexport vfs_read and vfs_write |
| Message-ID | <ukcMY-1sy-45@gated-at.bofh.it> |
| In reply to | #1723430 |
No modular users left. Given that they take user pointers there is no
good reason to export it to drivers to start with.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/read_write.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/fs/read_write.c b/fs/read_write.c
index 1a10ffff1619..d3ff440d7084 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -454,8 +454,6 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
return ret;
}
-EXPORT_SYMBOL(vfs_read);
-
static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
{
struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
@@ -554,8 +552,6 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
return ret;
}
-EXPORT_SYMBOL(vfs_write);
-
static inline loff_t file_pos_read(struct file *file)
{
return file->f_pos;
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write |
| Message-ID | <ukcMY-1sy-47@gated-at.bofh.it> |
| In reply to | #1723430 |
Instead of playing games with the address limit..
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/autofs4/waitq.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
index 24a58bf9ca72..4ac49d038bf3 100644
--- a/fs/autofs4/waitq.c
+++ b/fs/autofs4/waitq.c
@@ -56,19 +56,14 @@ static int autofs4_write(struct autofs_sb_info *sbi,
struct file *file, const void *addr, int bytes)
{
unsigned long sigpipe, flags;
- mm_segment_t fs;
const char *data = (const char *)addr;
ssize_t wr = 0;
sigpipe = sigismember(¤t->pending.signal, SIGPIPE);
- /* Save pointer to user space and point back to kernel space */
- fs = get_fs();
- set_fs(KERNEL_DS);
-
mutex_lock(&sbi->pipe_mutex);
while (bytes) {
- wr = __vfs_write(file, data, bytes, &file->f_pos);
+ wr = __kernel_write(file, data, bytes, &file->f_pos);
if (wr <= 0)
break;
data += wr;
@@ -76,8 +71,6 @@ static int autofs4_write(struct autofs_sb_info *sbi,
}
mutex_unlock(&sbi->pipe_mutex);
- set_fs(fs);
-
/* Keep the currently executing process from receiving a
* SIGPIPE unless it was already supposed to get one
*/
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Al Viro <viro@ZenIV.linux.org.uk> |
|---|---|
| Date | 2017-08-30 17:40 +0200 |
| Subject | Re: [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write |
| Message-ID | <ukdfX-1Et-9@gated-at.bofh.it> |
| In reply to | #1723434 |
On Wed, Aug 30, 2017 at 04:59:53PM +0200, Christoph Hellwig wrote: > Instead of playing games with the address limit.. I wonder... Do we verify that it's a pipe? If so, ->f_pos can (and should) be left alone...
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-09-01 12:30 +0200 |
| Subject | Re: [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write |
| Message-ID | <ukRn3-2DU-7@gated-at.bofh.it> |
| In reply to | #1723464 |
On Wed, Aug 30, 2017 at 04:30:26PM +0100, Al Viro wrote: > On Wed, Aug 30, 2017 at 04:59:53PM +0200, Christoph Hellwig wrote: > > Instead of playing games with the address limit.. > > I wonder... Do we verify that it's a pipe? If so, ->f_pos can > (and should) be left alone... currently nothing in autofs_dev_ioctl_setpipefd verifies that it's a pipe.
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 13/16] lustre: switch to kernel_write |
| Message-ID | <ukcMY-1sy-49@gated-at.bofh.it> |
| In reply to | #1723430 |
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/staging/lustre/lnet/libcfs/tracefile.c | 10 ++--------
drivers/staging/lustre/lustre/obdclass/kernelcomm.c | 7 +------
2 files changed, 3 insertions(+), 14 deletions(-)
diff --git a/drivers/staging/lustre/lnet/libcfs/tracefile.c b/drivers/staging/lustre/lnet/libcfs/tracefile.c
index d1aa79bb2017..af61dd750033 100644
--- a/drivers/staging/lustre/lnet/libcfs/tracefile.c
+++ b/drivers/staging/lustre/lnet/libcfs/tracefile.c
@@ -731,8 +731,7 @@ int cfs_tracefile_dump_all_pages(char *filename)
__LASSERT_TAGE_INVARIANT(tage);
buf = kmap(tage->page);
- rc = vfs_write(filp, (__force const char __user *)buf,
- tage->used, &filp->f_pos);
+ rc = kernel_write(filp, buf, tage->used, &filp->f_pos);
kunmap(tage->page);
if (rc != (int)tage->used) {
@@ -976,7 +975,6 @@ static int tracefiled(void *arg)
struct tracefiled_ctl *tctl = arg;
struct cfs_trace_page *tage;
struct cfs_trace_page *tmp;
- mm_segment_t __oldfs;
struct file *filp;
char *buf;
int last_loop = 0;
@@ -1014,8 +1012,6 @@ static int tracefiled(void *arg)
__LASSERT(list_empty(&pc.pc_pages));
goto end_loop;
}
- __oldfs = get_fs();
- set_fs(get_ds());
list_for_each_entry_safe(tage, tmp, &pc.pc_pages, linkage) {
static loff_t f_pos;
@@ -1028,8 +1024,7 @@ static int tracefiled(void *arg)
f_pos = i_size_read(file_inode(filp));
buf = kmap(tage->page);
- rc = vfs_write(filp, (__force const char __user *)buf,
- tage->used, &f_pos);
+ rc = kernel_write(filp, buf, tage->used, &f_pos);
kunmap(tage->page);
if (rc != (int)tage->used) {
@@ -1040,7 +1035,6 @@ static int tracefiled(void *arg)
break;
}
}
- set_fs(__oldfs);
filp_close(filp, NULL);
put_pages_on_daemon_list(&pc);
diff --git a/drivers/staging/lustre/lustre/obdclass/kernelcomm.c b/drivers/staging/lustre/lustre/obdclass/kernelcomm.c
index a0f65c470f4d..7afe8471a762 100644
--- a/drivers/staging/lustre/lustre/obdclass/kernelcomm.c
+++ b/drivers/staging/lustre/lustre/obdclass/kernelcomm.c
@@ -52,7 +52,6 @@ int libcfs_kkuc_msg_put(struct file *filp, void *payload)
struct kuc_hdr *kuch = (struct kuc_hdr *)payload;
ssize_t count = kuch->kuc_msglen;
loff_t offset = 0;
- mm_segment_t fs;
int rc = -ENXIO;
if (IS_ERR_OR_NULL(filp))
@@ -63,18 +62,14 @@ int libcfs_kkuc_msg_put(struct file *filp, void *payload)
return rc;
}
- fs = get_fs();
- set_fs(KERNEL_DS);
while (count > 0) {
- rc = vfs_write(filp, (void __force __user *)payload,
- count, &offset);
+ rc = kernel_write(filp, payload, count, &offset);
if (rc < 0)
break;
count -= rc;
payload += rc;
rc = 0;
}
- set_fs(fs);
if (rc < 0)
CWARN("message send failed (%d)\n", rc);
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 03/16] fs: move kernel_write to fs/read_write.c |
| Message-ID | <ukcMY-1sy-55@gated-at.bofh.it> |
| In reply to | #1723430 |
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/read_write.c | 17 ++++++++++++++++-
fs/splice.c | 16 ----------------
2 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/fs/read_write.c b/fs/read_write.c
index 0cc7033aa413..417dbe199505 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -496,9 +496,24 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t
inc_syscw(current);
return ret;
}
-
EXPORT_SYMBOL(__kernel_write);
+ssize_t kernel_write(struct file *file, const char *buf, size_t count,
+ loff_t pos)
+{
+ mm_segment_t old_fs;
+ ssize_t res;
+
+ old_fs = get_fs();
+ set_fs(get_ds());
+ /* The cast to a user pointer is valid due to the set_fs() */
+ res = vfs_write(file, (__force const char __user *)buf, count, &pos);
+ set_fs(old_fs);
+
+ return res;
+}
+EXPORT_SYMBOL(kernel_write);
+
ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;
diff --git a/fs/splice.c b/fs/splice.c
index ae41201d0325..f3084cce0ea6 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -364,22 +364,6 @@ static ssize_t kernel_readv(struct file *file, const struct kvec *vec,
return res;
}
-ssize_t kernel_write(struct file *file, const char *buf, size_t count,
- loff_t pos)
-{
- mm_segment_t old_fs;
- ssize_t res;
-
- old_fs = get_fs();
- set_fs(get_ds());
- /* The cast to a user pointer is valid due to the set_fs() */
- res = vfs_write(file, (__force const char __user *)buf, count, &pos);
- set_fs(old_fs);
-
- return res;
-}
-EXPORT_SYMBOL(kernel_write);
-
static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
struct pipe_inode_info *pipe, size_t len,
unsigned int flags)
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 04/16] fs: move kernel_read to fs/read_write.c |
| Message-ID | <ukcMY-1sy-63@gated-at.bofh.it> |
| In reply to | #1723430 |
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/exec.c | 17 -----------------
fs/read_write.c | 16 ++++++++++++++++
2 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/fs/exec.c b/fs/exec.c
index 62175cbcc801..8adcc5eaa175 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -885,23 +885,6 @@ struct file *open_exec(const char *name)
}
EXPORT_SYMBOL(open_exec);
-int kernel_read(struct file *file, loff_t offset,
- char *addr, unsigned long count)
-{
- mm_segment_t old_fs;
- loff_t pos = offset;
- int result;
-
- old_fs = get_fs();
- set_fs(get_ds());
- /* The cast to a user pointer is valid due to the set_fs() */
- result = vfs_read(file, (void __user *)addr, count, &pos);
- set_fs(old_fs);
- return result;
-}
-
-EXPORT_SYMBOL(kernel_read);
-
int kernel_read_file(struct file *file, void **buf, loff_t *size,
loff_t max_size, enum kernel_read_file_id id)
{
diff --git a/fs/read_write.c b/fs/read_write.c
index 417dbe199505..1ea862bc7efd 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -415,6 +415,22 @@ ssize_t __vfs_read(struct file *file, char __user *buf, size_t count,
}
EXPORT_SYMBOL(__vfs_read);
+int kernel_read(struct file *file, loff_t offset, char *addr,
+ unsigned long count)
+{
+ mm_segment_t old_fs;
+ loff_t pos = offset;
+ int result;
+
+ old_fs = get_fs();
+ set_fs(get_ds());
+ /* The cast to a user pointer is valid due to the set_fs() */
+ result = vfs_read(file, (void __user *)addr, count, &pos);
+ set_fs(old_fs);
+ return result;
+}
+EXPORT_SYMBOL(kernel_read);
+
ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-08-30 17:10 +0200 |
| Subject | [PATCH 06/16] fs: fix kernel_write prototype |
| Message-ID | <ukcMY-1sy-65@gated-at.bofh.it> |
| In reply to | #1723430 |
Make the position an in/out argument like all the other read/write
helpers.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
drivers/mtd/nand/nandsim.c | 2 +-
drivers/target/target_core_alua.c | 3 ++-
drivers/target/target_core_file.c | 3 +--
drivers/target/target_core_pr.c | 3 ++-
fs/ecryptfs/read_write.c | 2 +-
fs/read_write.c | 4 ++--
include/linux/fs.h | 2 +-
kernel/sysctl_binary.c | 9 ++++++---
security/keys/big_key.c | 3 ++-
9 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c
index a8089656879a..3300a77667fb 100644
--- a/drivers/mtd/nand/nandsim.c
+++ b/drivers/mtd/nand/nandsim.c
@@ -1395,7 +1395,7 @@ static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size
if (err)
return err;
noreclaim_flag = memalloc_noreclaim_save();
- tx = kernel_write(file, buf, count, pos);
+ tx = kernel_write(file, buf, count, &pos);
memalloc_noreclaim_restore(noreclaim_flag);
put_pages(ns);
return tx;
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index a91b7c25ffd4..928127642574 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -896,13 +896,14 @@ static int core_alua_write_tpg_metadata(
u32 md_buf_len)
{
struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
+ loff_t pos = 0;
int ret;
if (IS_ERR(file)) {
pr_err("filp_open(%s) for ALUA metadata failed\n", path);
return -ENODEV;
}
- ret = kernel_write(file, md_buf, md_buf_len, 0);
+ ret = kernel_write(file, md_buf, md_buf_len, &pos);
if (ret < 0)
pr_err("Error writing ALUA metadata file: %s\n", path);
fput(file);
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index 24cf11d9e50a..21e65d69ab2e 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -443,13 +443,12 @@ fd_do_prot_fill(struct se_device *se_dev, sector_t lba, sector_t nolb,
for (prot = 0; prot < prot_length;) {
sector_t len = min_t(sector_t, bufsize, prot_length - prot);
- ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot);
+ ssize_t ret = kernel_write(prot_fd, buf, len, &pos);
if (ret != len) {
pr_err("vfs_write to prot file failed: %zd\n", ret);
return ret < 0 ? ret : -ENODEV;
}
- prot += ret;
}
return 0;
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 6d5def64db61..dd2cd8048582 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -1974,6 +1974,7 @@ static int __core_scsi3_write_aptpl_to_file(
char path[512];
u32 pr_aptpl_buf_len;
int ret;
+ loff_t pos = 0;
memset(path, 0, 512);
@@ -1993,7 +1994,7 @@ static int __core_scsi3_write_aptpl_to_file(
pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */
- ret = kernel_write(file, buf, pr_aptpl_buf_len, 0);
+ ret = kernel_write(file, buf, pr_aptpl_buf_len, &pos);
if (ret < 0)
pr_debug("Error writing APTPL metadata file: %s\n", path);
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c
index d8af0e99bfaf..c596e7c03424 100644
--- a/fs/ecryptfs/read_write.c
+++ b/fs/ecryptfs/read_write.c
@@ -47,7 +47,7 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
if (!lower_file)
return -EIO;
- rc = kernel_write(lower_file, data, size, offset);
+ rc = kernel_write(lower_file, data, size, &offset);
mark_inode_dirty_sync(ecryptfs_inode);
return rc;
}
diff --git a/fs/read_write.c b/fs/read_write.c
index 1966fd6e03ce..82f0111b98cf 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -513,7 +513,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t
EXPORT_SYMBOL(__kernel_write);
ssize_t kernel_write(struct file *file, const char *buf, size_t count,
- loff_t pos)
+ loff_t *pos)
{
mm_segment_t old_fs;
ssize_t res;
@@ -521,7 +521,7 @@ ssize_t kernel_write(struct file *file, const char *buf, size_t count,
old_fs = get_fs();
set_fs(get_ds());
/* The cast to a user pointer is valid due to the set_fs() */
- res = vfs_write(file, (__force const char __user *)buf, count, &pos);
+ res = vfs_write(file, (__force const char __user *)buf, count, pos);
set_fs(old_fs);
return res;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 1b9d083adf94..86f50568b758 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2779,7 +2779,7 @@ extern int kernel_read_file_from_path(char *, void **, loff_t *, loff_t,
extern int kernel_read_file_from_fd(int, void **, loff_t *, loff_t,
enum kernel_read_file_id);
extern ssize_t kernel_read(struct file *, char *, size_t, loff_t *);
-extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t);
+extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t *);
extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *);
extern struct file * open_exec(const char *);
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
index 243fa1c28b4a..58ea8c03662e 100644
--- a/kernel/sysctl_binary.c
+++ b/kernel/sysctl_binary.c
@@ -1017,6 +1017,7 @@ static ssize_t bin_intvec(struct file *file,
size_t length = newlen / sizeof(*vec);
char *str, *end;
int i;
+ loff_t pos = 0;
str = buffer;
end = str + BUFSZ;
@@ -1030,7 +1031,7 @@ static ssize_t bin_intvec(struct file *file,
str += scnprintf(str, end - str, "%lu\t", value);
}
- result = kernel_write(file, buffer, str - buffer, 0);
+ result = kernel_write(file, buffer, str - buffer, &pos);
if (result < 0)
goto out_kfree;
}
@@ -1089,6 +1090,7 @@ static ssize_t bin_ulongvec(struct file *file,
size_t length = newlen / sizeof(*vec);
char *str, *end;
int i;
+ loff_t pos = 0;
str = buffer;
end = str + BUFSZ;
@@ -1102,7 +1104,7 @@ static ssize_t bin_ulongvec(struct file *file,
str += scnprintf(str, end - str, "%lu\t", value);
}
- result = kernel_write(file, buffer, str - buffer, 0);
+ result = kernel_write(file, buffer, str - buffer, &pos);
if (result < 0)
goto out_kfree;
}
@@ -1192,6 +1194,7 @@ static ssize_t bin_dn_node_address(struct file *file,
__le16 dnaddr;
char buf[15];
int len;
+ loff_t pos = 0;
result = -EINVAL;
if (newlen != sizeof(dnaddr))
@@ -1205,7 +1208,7 @@ static ssize_t bin_dn_node_address(struct file *file,
le16_to_cpu(dnaddr) >> 10,
le16_to_cpu(dnaddr) & 0x3ff);
- result = kernel_write(file, buf, len, 0);
+ result = kernel_write(file, buf, len, &pos);
if (result < 0)
goto out;
}
diff --git a/security/keys/big_key.c b/security/keys/big_key.c
index 9f4c86cade8e..6acb00f6f22c 100644
--- a/security/keys/big_key.c
+++ b/security/keys/big_key.c
@@ -147,6 +147,7 @@ int big_key_preparse(struct key_preparsed_payload *prep)
* File content is stored encrypted with randomly generated key.
*/
size_t enclen = ALIGN(datalen, crypto_skcipher_blocksize(big_key_skcipher));
+ loff_t pos = 0;
/* prepare aligned data to encrypt */
data = kmalloc(enclen, GFP_KERNEL);
@@ -179,7 +180,7 @@ int big_key_preparse(struct key_preparsed_payload *prep)
goto err_enckey;
}
- written = kernel_write(file, data, enclen, 0);
+ written = kernel_write(file, data, enclen, &pos);
if (written != enclen) {
ret = written;
if (written >= 0)
--
2.11.0
[toc] | [prev] | [next] | [standalone]
| From | Al Viro <viro@ZenIV.linux.org.uk> |
|---|---|
| Date | 2017-08-30 17:40 +0200 |
| Subject | Re: [PATCH 06/16] fs: fix kernel_write prototype |
| Message-ID | <ukdfY-1Et-23@gated-at.bofh.it> |
| In reply to | #1723438 |
On Wed, Aug 30, 2017 at 04:59:57PM +0200, Christoph Hellwig wrote:
> for (prot = 0; prot < prot_length;) {
> sector_t len = min_t(sector_t, bufsize, prot_length - prot);
> - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot);
> + ssize_t ret = kernel_write(prot_fd, buf, len, &pos);
>
> if (ret != len) {
> pr_err("vfs_write to prot file failed: %zd\n", ret);
> return ret < 0 ? ret : -ENODEV;
> }
> - prot += ret;
> }
And that loop will terminate because of...? IOW, the same bug class as in
the kernel_read() patch.
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-09-01 12:50 +0200 |
| Subject | Re: [PATCH 06/16] fs: fix kernel_write prototype |
| Message-ID | <ukRGp-2P1-1@gated-at.bofh.it> |
| In reply to | #1723468 |
On Wed, Aug 30, 2017 at 04:39:00PM +0100, Al Viro wrote:
> On Wed, Aug 30, 2017 at 04:59:57PM +0200, Christoph Hellwig wrote:
>
> > for (prot = 0; prot < prot_length;) {
> > sector_t len = min_t(sector_t, bufsize, prot_length - prot);
> > - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot);
> > + ssize_t ret = kernel_write(prot_fd, buf, len, &pos);
> >
> > if (ret != len) {
> > pr_err("vfs_write to prot file failed: %zd\n", ret);
> > return ret < 0 ? ret : -ENODEV;
> > }
> > - prot += ret;
> > }
>
> And that loop will terminate because of...? IOW, the same bug class as in
> the kernel_read() patch.
Also fixed.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web