btrfs: use IOMAP_DIO_NOSYNC
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 7 Jun 2022 20:10:01 +0000 (16:10 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 10 Jun 2022 20:04:13 +0000 (16:04 -0400)
... instead of messing with iocb flags

Suggested-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/btrfs/file.c
fs/btrfs/inode.c

index 1fd827b99c1ba2a30ea4f15f29a5f944e41e9578..98f81e304eb1d427e19350e45ec6c5951aa38dc3 100644 (file)
@@ -1848,7 +1848,6 @@ static ssize_t check_direct_IO(struct btrfs_fs_info *fs_info,
 
 static ssize_t btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
 {
-       const bool is_sync_write = (iocb->ki_flags & IOCB_DSYNC);
        struct file *file = iocb->ki_filp;
        struct inode *inode = file_inode(file);
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
@@ -1901,15 +1900,6 @@ relock:
                goto buffered;
        }
 
-       /*
-        * We remove IOCB_DSYNC so that we don't deadlock when iomap_dio_rw()
-        * calls generic_write_sync() (through iomap_dio_complete()), because
-        * that results in calling fsync (btrfs_sync_file()) which will try to
-        * lock the inode in exclusive/write mode.
-        */
-       if (is_sync_write)
-               iocb->ki_flags &= ~IOCB_DSYNC;
-
        /*
         * The iov_iter can be mapped to the same file range we are writing to.
         * If that's the case, then we will deadlock in the iomap code, because
@@ -1964,13 +1954,6 @@ again:
 
        btrfs_inode_unlock(inode, ilock_flags);
 
-       /*
-        * Add back IOCB_DSYNC. Our caller, btrfs_file_write_iter(), will do
-        * the fsync (call generic_write_sync()).
-        */
-       if (is_sync_write)
-               iocb->ki_flags |= IOCB_DSYNC;
-
        /* If 'err' is -ENOTBLK then it means we must fallback to buffered IO. */
        if ((err < 0 && err != -ENOTBLK) || !iov_iter_count(from))
                goto out;
index 81737eff92f3d8129b384b8bcdd3d67ebc1820d5..fbf0aee7d66ab9aaace823dc3976daab6bace70b 100644 (file)
@@ -8152,7 +8152,8 @@ ssize_t btrfs_dio_rw(struct kiocb *iocb, struct iov_iter *iter, size_t done_befo
        struct btrfs_dio_data data;
 
        return iomap_dio_rw(iocb, iter, &btrfs_dio_iomap_ops, &btrfs_dio_ops,
-                           IOMAP_DIO_PARTIAL, &data, done_before);
+                           IOMAP_DIO_PARTIAL | IOMAP_DIO_NOSYNC,
+                           &data, done_before);
 }
 
 static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,