diff options
-rw-r--r-- | fs/btrfs/file.c | 26 |
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); |