diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 8d7b5a45c005..ea9f10bb089c 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1703,18 +1703,17 @@ again: | |||
1703 | return num_written ? num_written : ret; | 1703 | return num_written ? num_written : ret; |
1704 | } | 1704 | } |
1705 | 1705 | ||
1706 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, | 1706 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from) |
1707 | struct iov_iter *from, | ||
1708 | loff_t pos) | ||
1709 | { | 1707 | { |
1710 | struct file *file = iocb->ki_filp; | 1708 | struct file *file = iocb->ki_filp; |
1711 | struct inode *inode = file_inode(file); | 1709 | struct inode *inode = file_inode(file); |
1710 | loff_t pos = iocb->ki_pos; | ||
1712 | ssize_t written; | 1711 | ssize_t written; |
1713 | ssize_t written_buffered; | 1712 | ssize_t written_buffered; |
1714 | loff_t endbyte; | 1713 | loff_t endbyte; |
1715 | int err; | 1714 | int err; |
1716 | 1715 | ||
1717 | written = generic_file_direct_write(iocb, from, pos); | 1716 | written = generic_file_direct_write(iocb, from); |
1718 | 1717 | ||
1719 | if (written < 0 || !iov_iter_count(from)) | 1718 | if (written < 0 || !iov_iter_count(from)) |
1720 | return written; | 1719 | return written; |
@@ -1832,7 +1831,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, | |||
1832 | atomic_inc(&BTRFS_I(inode)->sync_writers); | 1831 | atomic_inc(&BTRFS_I(inode)->sync_writers); |
1833 | 1832 | ||
1834 | if (iocb->ki_flags & IOCB_DIRECT) { | 1833 | if (iocb->ki_flags & IOCB_DIRECT) { |
1835 | num_written = __btrfs_direct_write(iocb, from, pos); | 1834 | num_written = __btrfs_direct_write(iocb, from); |
1836 | } else { | 1835 | } else { |
1837 | num_written = __btrfs_buffered_write(file, from, pos); | 1836 | num_written = __btrfs_buffered_write(file, from, pos); |
1838 | if (num_written > 0) | 1837 | if (num_written > 0) |
@@ -1852,11 +1851,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, | |||
1852 | spin_lock(&BTRFS_I(inode)->lock); | 1851 | spin_lock(&BTRFS_I(inode)->lock); |
1853 | BTRFS_I(inode)->last_sub_trans = root->log_transid; | 1852 | BTRFS_I(inode)->last_sub_trans = root->log_transid; |
1854 | spin_unlock(&BTRFS_I(inode)->lock); | 1853 | spin_unlock(&BTRFS_I(inode)->lock); |
1855 | if (num_written > 0) { | 1854 | if (num_written > 0) |
1856 | err = generic_write_sync(file, pos, num_written); | 1855 | num_written = generic_write_sync(iocb, num_written); |
1857 | if (err < 0) | ||
1858 | num_written = err; | ||
1859 | } | ||
1860 | 1856 | ||
1861 | if (sync) | 1857 | if (sync) |
1862 | atomic_dec(&BTRFS_I(inode)->sync_writers); | 1858 | atomic_dec(&BTRFS_I(inode)->sync_writers); |