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 11/16] fs: move permission hook out of do_iter_write()
Date: Wed, 22 Nov 2023 14:27:10 +0200	[thread overview]
Message-ID: <20231122122715.2561213-12-amir73il@gmail.com> (raw)
In-Reply-To: <20231122122715.2561213-1-amir73il@gmail.com>

In many of the vfs helpers, the rw_verity_area() checks are called before
taking sb_start_write(), making them "start-write-safe".
do_iter_write() is an exception to this rule.

do_iter_write() has two callers - vfs_iter_write() and vfs_writev().
Move rw_verify_area() and other checks from do_iter_write() out to
its callers to make them "start-write-safe".

Move also the fsnotify_modify() hook to align with similar pattern
used in vfs_write() and other vfs helpers.

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 | 78 +++++++++++++++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 31 deletions(-)

diff --git a/fs/read_write.c b/fs/read_write.c
index 87ca50f16a23..6c40468efe19 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -852,28 +852,10 @@ EXPORT_SYMBOL(vfs_iter_read);
 static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
 			     loff_t *pos, rwf_t flags)
 {
-	size_t tot_len;
-	ssize_t ret = 0;
-
-	if (!(file->f_mode & FMODE_WRITE))
-		return -EBADF;
-	if (!(file->f_mode & FMODE_CAN_WRITE))
-		return -EINVAL;
-
-	tot_len = iov_iter_count(iter);
-	if (!tot_len)
-		return 0;
-	ret = rw_verify_area(WRITE, file, pos, tot_len);
-	if (ret < 0)
-		return ret;
-
 	if (file->f_op->write_iter)
-		ret = do_iter_readv_writev(file, iter, pos, WRITE, flags);
-	else
-		ret = do_loop_readv_writev(file, iter, pos, WRITE, flags);
-	if (ret > 0)
-		fsnotify_modify(file);
-	return ret;
+		return do_iter_readv_writev(file, iter, pos, WRITE, flags);
+
+	return do_loop_readv_writev(file, iter, pos, WRITE, flags);
 }
 
 ssize_t vfs_iocb_iter_write(struct file *file, struct kiocb *iocb,
@@ -907,13 +889,28 @@ EXPORT_SYMBOL(vfs_iocb_iter_write);
 ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos,
 		       rwf_t flags)
 {
-	int ret;
+	size_t tot_len;
+	ssize_t ret;
 
+	if (!(file->f_mode & FMODE_WRITE))
+		return -EBADF;
+	if (!(file->f_mode & FMODE_CAN_WRITE))
+		return -EINVAL;
 	if (!file->f_op->write_iter)
 		return -EINVAL;
 
+	tot_len = iov_iter_count(iter);
+	if (!tot_len)
+		return 0;
+
+	ret = rw_verify_area(WRITE, file, ppos, tot_len);
+	if (ret < 0)
+		return ret;
+
 	file_start_write(file);
 	ret = do_iter_write(file, iter, ppos, flags);
+	if (ret > 0)
+		fsnotify_modify(file);
 	file_end_write(file);
 
 	return ret;
@@ -938,20 +935,39 @@ static ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
 }
 
 static ssize_t vfs_writev(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_SOURCE, vec, vlen, ARRAY_SIZE(iovstack), &iov, &iter);
-	if (ret >= 0) {
-		file_start_write(file);
-		ret = do_iter_write(file, &iter, pos, flags);
-		file_end_write(file);
-		kfree(iov);
-	}
+	if (!(file->f_mode & FMODE_WRITE))
+		return -EBADF;
+	if (!(file->f_mode & FMODE_CAN_WRITE))
+		return -EINVAL;
+
+	ret = import_iovec(ITER_SOURCE, 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(WRITE, file, pos, tot_len);
+	if (ret < 0)
+		goto out;
+
+	file_start_write(file);
+	ret = do_iter_write(file, &iter, pos, flags);
+	if (ret > 0)
+		fsnotify_modify(file);
+	file_end_write(file);
+out:
+	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 ` Amir Goldstein [this message]
2023-11-22 14:33   ` [PATCH v2 11/16] fs: move permission hook out of do_iter_write() 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 ` [PATCH v2 12/16] fs: move permission hook out of do_iter_read() Amir Goldstein
2023-11-23 17:13   ` 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-12-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.