aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-10 13:27:48 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-10 13:27:48 -0400
commit6618a24ab2313309e9df1cc06cc1f6786a6b6a9c (patch)
tree2a335d8110a87e047676e5fd41f24f547a3f7d05 /fs/btrfs/file.c
parent1d07b6cb96bc17f844a0218ec783f017cc2d29ee (diff)
parentff0fa73247e442518936baa43c3f037b17f10fa7 (diff)
Merge branch 'nowait-aio-btrfs-fixup' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fix from David Sterba: "This fixes a user-visible bug introduced by the nowait-aio patches merged in this cycle" * 'nowait-aio-btrfs-fixup' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: nowait aio: Correct assignment of pos
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index a85d7903fbdd..9e75d8a39aac 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1881,16 +1881,25 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
1881 ssize_t num_written = 0; 1881 ssize_t num_written = 0;
1882 bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host); 1882 bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host);
1883 ssize_t err; 1883 ssize_t err;
1884 loff_t pos = iocb->ki_pos; 1884 loff_t pos;
1885 size_t count = iov_iter_count(from); 1885 size_t count = iov_iter_count(from);
1886 loff_t oldsize; 1886 loff_t oldsize;
1887 int clean_page = 0; 1887 int clean_page = 0;
1888 1888
1889 if ((iocb->ki_flags & IOCB_NOWAIT) && 1889 if (!inode_trylock(inode)) {
1890 (iocb->ki_flags & IOCB_DIRECT)) { 1890 if (iocb->ki_flags & IOCB_NOWAIT)
1891 /* Don't sleep on inode rwsem */
1892 if (!inode_trylock(inode))
1893 return -EAGAIN; 1891 return -EAGAIN;
1892 inode_lock(inode);
1893 }
1894
1895 err = generic_write_checks(iocb, from);
1896 if (err <= 0) {
1897 inode_unlock(inode);
1898 return err;
1899 }
1900
1901 pos = iocb->ki_pos;
1902 if (iocb->ki_flags & IOCB_NOWAIT) {
1894 /* 1903 /*
1895 * We will allocate space in case nodatacow is not set, 1904 * We will allocate space in case nodatacow is not set,
1896 * so bail 1905 * so bail
@@ -1901,13 +1910,6 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
1901 inode_unlock(inode); 1910 inode_unlock(inode);
1902 return -EAGAIN; 1911 return -EAGAIN;
1903 } 1912 }
1904 } else
1905 inode_lock(inode);
1906
1907 err = generic_write_checks(iocb, from);
1908 if (err <= 0) {
1909 inode_unlock(inode);
1910 return err;
1911 } 1913 }
1912 1914
1913 current->backing_dev_info = inode_to_bdi(inode); 1915 current->backing_dev_info = inode_to_bdi(inode);