|
|
@@ -1568,10 +1568,11 @@ static noinline int check_can_nocow(struct btrfs_inode *inode, loff_t pos,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static noinline ssize_t __btrfs_buffered_write(struct file *file,
|
|
|
- struct iov_iter *i,
|
|
|
- loff_t pos)
|
|
|
+static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb,
|
|
|
+ struct iov_iter *i)
|
|
|
{
|
|
|
+ struct file *file = iocb->ki_filp;
|
|
|
+ loff_t pos = iocb->ki_pos;
|
|
|
struct inode *inode = file_inode(file);
|
|
|
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
|
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
@@ -1803,7 +1804,7 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
|
|
|
{
|
|
|
struct file *file = iocb->ki_filp;
|
|
|
struct inode *inode = file_inode(file);
|
|
|
- loff_t pos = iocb->ki_pos;
|
|
|
+ loff_t pos;
|
|
|
ssize_t written;
|
|
|
ssize_t written_buffered;
|
|
|
loff_t endbyte;
|
|
|
@@ -1814,8 +1815,8 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
|
|
|
if (written < 0 || !iov_iter_count(from))
|
|
|
return written;
|
|
|
|
|
|
- pos += written;
|
|
|
- written_buffered = __btrfs_buffered_write(file, from, pos);
|
|
|
+ pos = iocb->ki_pos;
|
|
|
+ written_buffered = btrfs_buffered_write(iocb, from);
|
|
|
if (written_buffered < 0) {
|
|
|
err = written_buffered;
|
|
|
goto out;
|
|
|
@@ -1952,7 +1953,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
|
|
if (iocb->ki_flags & IOCB_DIRECT) {
|
|
|
num_written = __btrfs_direct_write(iocb, from);
|
|
|
} else {
|
|
|
- num_written = __btrfs_buffered_write(file, from, pos);
|
|
|
+ num_written = btrfs_buffered_write(iocb, from);
|
|
|
if (num_written > 0)
|
|
|
iocb->ki_pos = pos + num_written;
|
|
|
if (clean_page)
|