All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Christian Brauner <brauner@kernel.org>
Cc: Jan Kara <jack@suse.cz>, Josef Bacik <josef@toxicpanda.com>,
	David Howells <dhowells@redhat.com>, Jens Axboe <axboe@kernel.dk>,
	Miklos Szeredi <miklos@szeredi.hu>,
	Al Viro <viro@zeniv.linux.org.uk>,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH v2 12/16] fs: move permission hook out of do_iter_read()
Date: Wed, 22 Nov 2023 14:27:11 +0200	[thread overview]
Message-ID: <20231122122715.2561213-13-amir73il@gmail.com> (raw)
In-Reply-To: <20231122122715.2561213-1-amir73il@gmail.com>

We recently moved fsnotify hook, rw_verify_area() and other checks from
do_iter_write() out to its two callers.

for consistency, do the same thing for do_iter_read() - move the
rw_verify_area() checks and fsnotify hook to the callers vfs_iter_read()
and vfs_readv().

This aligns those vfs helpers with the pattern used in vfs_read() and
vfs_iocb_iter_read() and the vfs write helpers, where all the checks are
in the vfs helpers and the do_* or call_* helpers do the work.

This is needed for fanotify "pre content" events.

Suggested-by: Jan Kara <jack@suse.cz>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 fs/read_write.c | 74 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 48 insertions(+), 26 deletions(-)

diff --git a/fs/read_write.c b/fs/read_write.c
index 6c40468efe19..9410c3e6a04e 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -784,12 +784,27 @@ static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter,
 	return ret;
 }
 
+/*
+ * Low-level helpers don't perform rw sanity checks.
+ * The caller is responsible for that.
+ */
 static ssize_t do_iter_read(struct file *file, struct iov_iter *iter,
-		loff_t *pos, rwf_t flags)
+			    loff_t *pos, rwf_t flags)
+{
+	if (file->f_op->read_iter)
+		return do_iter_readv_writev(file, iter, pos, READ, flags);
+
+	return do_loop_readv_writev(file, iter, pos, READ, flags);
+}
+
+ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,
+			   struct iov_iter *iter)
 {
 	size_t tot_len;
 	ssize_t ret = 0;
 
+	if (!file->f_op->read_iter)
+		return -EINVAL;
 	if (!(file->f_mode & FMODE_READ))
 		return -EBADF;
 	if (!(file->f_mode & FMODE_CAN_READ))
@@ -798,22 +813,20 @@ static ssize_t do_iter_read(struct file *file, struct iov_iter *iter,
 	tot_len = iov_iter_count(iter);
 	if (!tot_len)
 		goto out;
-	ret = rw_verify_area(READ, file, pos, tot_len);
+	ret = rw_verify_area(READ, file, &iocb->ki_pos, tot_len);
 	if (ret < 0)
 		return ret;
 
-	if (file->f_op->read_iter)
-		ret = do_iter_readv_writev(file, iter, pos, READ, flags);
-	else
-		ret = do_loop_readv_writev(file, iter, pos, READ, flags);
+	ret = call_read_iter(file, iocb, iter);
 out:
 	if (ret >= 0)
 		fsnotify_access(file);
 	return ret;
 }
+EXPORT_SYMBOL(vfs_iocb_iter_read);
 
-ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,
-			   struct iov_iter *iter)
+ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
+		      rwf_t flags)
 {
 	size_t tot_len;
 	ssize_t ret = 0;
@@ -828,25 +841,16 @@ ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,
 	tot_len = iov_iter_count(iter);
 	if (!tot_len)
 		goto out;
-	ret = rw_verify_area(READ, file, &iocb->ki_pos, tot_len);
+	ret = rw_verify_area(READ, file, ppos, tot_len);
 	if (ret < 0)
 		return ret;
 
-	ret = call_read_iter(file, iocb, iter);
+	ret = do_iter_read(file, iter, ppos, flags);
 out:
 	if (ret >= 0)
 		fsnotify_access(file);
 	return ret;
 }
-EXPORT_SYMBOL(vfs_iocb_iter_read);
-
-ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
-		rwf_t flags)
-{
-	if (!file->f_op->read_iter)
-		return -EINVAL;
-	return do_iter_read(file, iter, ppos, flags);
-}
 EXPORT_SYMBOL(vfs_iter_read);
 
 static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
@@ -918,19 +922,37 @@ ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos,
 EXPORT_SYMBOL(vfs_iter_write);
 
 static ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
-		  unsigned long vlen, loff_t *pos, rwf_t flags)
+			 unsigned long vlen, loff_t *pos, rwf_t flags)
 {
 	struct iovec iovstack[UIO_FASTIOV];
 	struct iovec *iov = iovstack;
 	struct iov_iter iter;
-	ssize_t ret;
+	size_t tot_len;
+	ssize_t ret = 0;
 
-	ret = import_iovec(ITER_DEST, vec, vlen, ARRAY_SIZE(iovstack), &iov, &iter);
-	if (ret >= 0) {
-		ret = do_iter_read(file, &iter, pos, flags);
-		kfree(iov);
-	}
+	if (!(file->f_mode & FMODE_READ))
+		return -EBADF;
+	if (!(file->f_mode & FMODE_CAN_READ))
+		return -EINVAL;
 
+	ret = import_iovec(ITER_DEST, vec, vlen, ARRAY_SIZE(iovstack), &iov,
+			   &iter);
+	if (ret < 0)
+		return ret;
+
+	tot_len = iov_iter_count(&iter);
+	if (!tot_len)
+		goto out;
+
+	ret = rw_verify_area(READ, file, pos, tot_len);
+	if (ret < 0)
+		goto out;
+
+	ret = do_iter_read(file, &iter, pos, flags);
+out:
+	if (ret >= 0)
+		fsnotify_access(file);
+	kfree(iov);
 	return ret;
 }
 
-- 
2.34.1


  parent reply	other threads:[~2023-11-22 12:27 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-22 12:26 [PATCH v2 00/16] Tidy up file permission hooks Amir Goldstein
2023-11-22 12:27 ` [PATCH v2 01/16] ovl: add permission hooks outside of do_splice_direct() Amir Goldstein
2023-11-23  7:35   ` Christoph Hellwig
2023-11-23 16:28   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 02/16] splice: remove permission hook from do_splice_direct() Amir Goldstein
2023-11-23  7:36   ` Christoph Hellwig
2023-11-23 16:28   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 03/16] splice: move permission hook out of splice_direct_to_actor() Amir Goldstein
2023-11-23  7:36   ` Christoph Hellwig
2023-11-23 16:35   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 04/16] splice: move permission hook out of splice_file_to_pipe() Amir Goldstein
2023-11-23  7:38   ` Christoph Hellwig
2023-11-23 16:37   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 05/16] splice: remove permission hook from iter_file_splice_write() Amir Goldstein
2023-11-23  7:47   ` Christoph Hellwig
2023-11-23 11:20     ` Amir Goldstein
2023-11-23 15:14       ` Christoph Hellwig
2023-11-23 15:41         ` Amir Goldstein
2023-11-23 15:45           ` Christoph Hellwig
2023-11-23 16:22           ` Christian Brauner
2023-11-23 16:53             ` Amir Goldstein
2023-11-23 17:56               ` Christian Brauner
2023-11-22 12:27 ` [PATCH v2 06/16] remap_range: move permission hooks out of do_clone_file_range() Amir Goldstein
2023-11-23  7:47   ` Christoph Hellwig
2023-11-23 16:52   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 07/16] remap_range: move file_start_write() to after permission hook Amir Goldstein
2023-11-23  7:48   ` Christoph Hellwig
2023-11-23 16:53   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 08/16] btrfs: " Amir Goldstein
2023-11-23  7:48   ` Christoph Hellwig
2023-11-23 16:54   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 09/16] coda: change locking order in coda_file_write_iter() Amir Goldstein
2023-11-22 12:27 ` [PATCH v2 10/16] fs: move file_start_write() into vfs_iter_write() Amir Goldstein
2023-11-23  7:50   ` Christoph Hellwig
2023-11-23  8:04     ` Amir Goldstein
2023-11-22 12:27 ` [PATCH v2 11/16] fs: move permission hook out of do_iter_write() Amir Goldstein
2023-11-22 14:33   ` Christian Brauner
2023-11-22 15:25     ` Amir Goldstein
2023-11-23 17:08   ` Jan Kara
2023-11-24  8:45     ` Amir Goldstein
2023-11-22 12:27 ` Amir Goldstein [this message]
2023-11-23 17:13   ` [PATCH v2 12/16] fs: move permission hook out of do_iter_read() Jan Kara
2023-11-24  8:48     ` Amir Goldstein
2023-11-22 12:27 ` [PATCH v2 13/16] fs: move kiocb_start_write() into vfs_iocb_iter_write() Amir Goldstein
2023-11-23 17:30   ` Jan Kara
2023-11-22 12:27 ` [PATCH v2 14/16] fs: create __sb_write_started() helper Amir Goldstein
2023-11-23 17:31   ` Jan Kara
2023-11-24  9:14   ` Amir Goldstein
2023-11-22 12:27 ` [PATCH v2 15/16] fs: create file_write_started() helper Amir Goldstein
2023-11-22 12:27 ` [PATCH v2 16/16] fs: create {sb,file}_write_not_started() helpers Amir Goldstein
2023-11-23 17:35   ` Jan Kara
2023-11-24  8:20     ` Amir Goldstein
2023-12-01 10:11       ` Jan Kara
2023-11-22 14:06 ` [PATCH v2 00/16] Tidy up file permission hooks Josef Bacik
2023-11-22 15:04 ` Christian Brauner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231122122715.2561213-13-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=brauner@kernel.org \
    --cc=dhowells@redhat.com \
    --cc=jack@suse.cz \
    --cc=josef@toxicpanda.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.