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 af059c44684d..c98805c35bab 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1705,18 +1705,17 @@ again: | |||
1705 | return num_written ? num_written : ret; | 1705 | return num_written ? num_written : ret; |
1706 | } | 1706 | } |
1707 | 1707 | ||
1708 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, | 1708 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from) |
1709 | struct iov_iter *from, | ||
1710 | loff_t pos) | ||
1711 | { | 1709 | { |
1712 | struct file *file = iocb->ki_filp; | 1710 | struct file *file = iocb->ki_filp; |
1713 | struct inode *inode = file_inode(file); | 1711 | struct inode *inode = file_inode(file); |
1712 | loff_t pos = iocb->ki_pos; | ||
1714 | ssize_t written; | 1713 | ssize_t written; |
1715 | ssize_t written_buffered; | 1714 | ssize_t written_buffered; |
1716 | loff_t endbyte; | 1715 | loff_t endbyte; |
1717 | int err; | 1716 | int err; |
1718 | 1717 | ||
1719 | written = generic_file_direct_write(iocb, from, pos); | 1718 | written = generic_file_direct_write(iocb, from); |
1720 | 1719 | ||
1721 | if (written < 0 || !iov_iter_count(from)) | 1720 | if (written < 0 || !iov_iter_count(from)) |
1722 | return written; | 1721 | return written; |
@@ -1834,7 +1833,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, | |||
1834 | atomic_inc(&BTRFS_I(inode)->sync_writers); | 1833 | atomic_inc(&BTRFS_I(inode)->sync_writers); |
1835 | 1834 | ||
1836 | if (iocb->ki_flags & IOCB_DIRECT) { | 1835 | if (iocb->ki_flags & IOCB_DIRECT) { |
1837 | num_written = __btrfs_direct_write(iocb, from, pos); | 1836 | num_written = __btrfs_direct_write(iocb, from); |
1838 | } else { | 1837 | } else { |
1839 | num_written = __btrfs_buffered_write(file, from, pos); | 1838 | num_written = __btrfs_buffered_write(file, from, pos); |
1840 | if (num_written > 0) | 1839 | if (num_written > 0) |
@@ -1854,11 +1853,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, | |||
1854 | spin_lock(&BTRFS_I(inode)->lock); | 1853 | spin_lock(&BTRFS_I(inode)->lock); |
1855 | BTRFS_I(inode)->last_sub_trans = root->log_transid; | 1854 | BTRFS_I(inode)->last_sub_trans = root->log_transid; |
1856 | spin_unlock(&BTRFS_I(inode)->lock); | 1855 | spin_unlock(&BTRFS_I(inode)->lock); |
1857 | if (num_written > 0) { | 1856 | if (num_written > 0) |
1858 | err = generic_write_sync(file, pos, num_written); | 1857 | num_written = generic_write_sync(iocb, num_written); |
1859 | if (err < 0) | ||
1860 | num_written = err; | ||
1861 | } | ||
1862 | 1858 | ||
1863 | if (sync) | 1859 | if (sync) |
1864 | atomic_dec(&BTRFS_I(inode)->sync_writers); | 1860 | atomic_dec(&BTRFS_I(inode)->sync_writers); |