Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1723430 > unrolled thread

switch in-kernel read/write calls to kernel_read/write

Started byChristoph Hellwig <hch@lst.de>
First post2017-08-30 17:10 +0200
Last post2017-09-01 12:50 +0200
Articles 15 — 2 participants

Back to article view | Back to linux.kernel


Contents

  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

#1723430 — switch in-kernel read/write calls to kernel_read/write

FromChristoph Hellwig <hch@lst.de>
Date2017-08-30 17:10 +0200
Subjectswitch 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]


#1723431 — [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723473 — Re: [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read

FromAl Viro <viro@ZenIV.linux.org.uk>
Date2017-08-30 17:50 +0200
SubjectRe: [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]


#1724960 — Re: [PATCH 08/16] mm/nommu: switch do_mmap_private to kernel_read

FromChristoph Hellwig <hch@lst.de>
Date2017-09-01 12:50 +0200
SubjectRe: [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]


#1723432 — [PATCH 09/16] net/9p: switch p9_fd_read to kernel_write

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723433 — [PATCH 15/16] fs: unexport vfs_read and vfs_write

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723434 — [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write

FromChristoph Hellwig <hch@lst.de>
Date2017-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(&current->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]


#1723464 — Re: [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write

FromAl Viro <viro@ZenIV.linux.org.uk>
Date2017-08-30 17:40 +0200
SubjectRe: [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]


#1724946 — Re: [PATCH 02/16] autofs4: switch autofs4_write to __kernel_write

FromChristoph Hellwig <hch@lst.de>
Date2017-09-01 12:30 +0200
SubjectRe: [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]


#1723435 — [PATCH 13/16] lustre: switch to kernel_write

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723436 — [PATCH 03/16] fs: move kernel_write to fs/read_write.c

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723437 — [PATCH 04/16] fs: move kernel_read to fs/read_write.c

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723438 — [PATCH 06/16] fs: fix kernel_write prototype

FromChristoph Hellwig <hch@lst.de>
Date2017-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]


#1723468 — Re: [PATCH 06/16] fs: fix kernel_write prototype

FromAl Viro <viro@ZenIV.linux.org.uk>
Date2017-08-30 17:40 +0200
SubjectRe: [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]


#1724959 — Re: [PATCH 06/16] fs: fix kernel_write prototype

FromChristoph Hellwig <hch@lst.de>
Date2017-09-01 12:50 +0200
SubjectRe: [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