aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);