]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: move file_start_write() to after permission hook
authorAmir Goldstein <amir73il@gmail.com>
Wed, 22 Nov 2023 12:27:07 +0000 (14:27 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 24 Nov 2023 08:22:28 +0000 (09:22 +0100)
In vfs code, file_start_write() is usually called after the permission
hook in rw_verify_area().  btrfs_ioctl_encoded_write() in an exception
to this rule.

Move file_start_write() to after the rw_verify_area() check in encoded
write to make the permission hook "start-write-safe".

This is needed for fanotify "pre content" events.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://lore.kernel.org/r/20231122122715.2561213-9-amir73il@gmail.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/btrfs/ioctl.c

index 752acff2c73436ae844958cf6b4889b5d964dddd..e691770c25aa3b03f0df82f728a30fa881f12a02 100644 (file)
@@ -4523,29 +4523,29 @@ static int btrfs_ioctl_encoded_write(struct file *file, void __user *argp, bool
        if (ret < 0)
                goto out_acct;
 
-       file_start_write(file);
-
        if (iov_iter_count(&iter) == 0) {
                ret = 0;
-               goto out_end_write;
+               goto out_iov;
        }
        pos = args.offset;
        ret = rw_verify_area(WRITE, file, &pos, args.len);
        if (ret < 0)
-               goto out_end_write;
+               goto out_iov;
 
        init_sync_kiocb(&kiocb, file);
        ret = kiocb_set_rw_flags(&kiocb, 0);
        if (ret)
-               goto out_end_write;
+               goto out_iov;
        kiocb.ki_pos = pos;
 
+       file_start_write(file);
+
        ret = btrfs_do_write_iter(&kiocb, &iter, &args);
        if (ret > 0)
                fsnotify_modify(file);
 
-out_end_write:
        file_end_write(file);
+out_iov:
        kfree(iov);
 out_acct:
        if (ret > 0)