u64 start_pos;
ssize_t num_written = 0;
ssize_t err = 0;
- size_t count;
+ size_t count, ocount;
vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE);
mutex_lock(&inode->i_mutex);
- count = iov_iter_count(iter);
+ ocount = count = iov_iter_count(iter);
current->backing_dev_info = inode->i_mapping->backing_dev_info;
err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
num_written = __btrfs_direct_write(iocb, iter, pos, ppos,
count);
} else {
+ if (count != ocount)
+ iov_iter_shorten(iter, count);
+
num_written = __btrfs_buffered_write(file, iter, pos);
if (num_written > 0)
*ppos = pos + num_written;
int ret, direct_io, appending, rw_level, have_alloc_sem = 0;
int can_do_direct, has_refcount = 0;
ssize_t written = 0;
- size_t count; /* after file limit checks */
+ size_t count, ocount;
loff_t old_size, *ppos = &iocb->ki_pos;
u32 old_clusters;
struct file *file = iocb->ki_filp;
ocfs2_iocb_set_rw_locked(iocb, rw_level);
- count = iov_iter_count(iter);
+ ocount = count = iov_iter_count(iter);
ret = generic_write_checks(file, ppos, &count,
S_ISBLK(inode->i_mode));
if (ret)
goto out_dio;
}
} else {
+ if (count != ocount)
+ iov_iter_shorten(iter, count);
+
current->backing_dev_info = file->f_mapping->backing_dev_info;
written = generic_file_buffered_write_iter(iocb, iter, *ppos,
ppos, 0);
{
struct iovec *iov = (struct iovec *)i->data;
i->nr_segs = iov_shorten(iov, i->nr_segs, count);
+ i->count = count;
return 0;
}