Commit f8579f86 authored by Al Viro's avatar Al Viro

generic_file_direct_write(): switch to iov_iter

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent e7c24607
...@@ -1669,15 +1669,13 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb, ...@@ -1669,15 +1669,13 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb,
loff_t endbyte; loff_t endbyte;
int err; int err;
written = generic_file_direct_write(iocb, iov, &nr_segs, pos, iov_iter_init(&i, iov, nr_segs, count, 0);
count, ocount); written = generic_file_direct_write(iocb, &i, pos, count, ocount);
if (written < 0 || written == count) if (written < 0 || written == count)
return written; return written;
pos += written; pos += written;
count -= written;
iov_iter_init(&i, iov, nr_segs, count, written);
written_buffered = __btrfs_buffered_write(file, &i, pos); written_buffered = __btrfs_buffered_write(file, &i, pos);
if (written_buffered < 0) { if (written_buffered < 0) {
err = written_buffered; err = written_buffered;
......
...@@ -1235,15 +1235,13 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov, ...@@ -1235,15 +1235,13 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
goto out; goto out;
if (file->f_flags & O_DIRECT) { if (file->f_flags & O_DIRECT) {
written = generic_file_direct_write(iocb, iov, &nr_segs, pos, iov_iter_init(&i, iov, nr_segs, count, 0);
count, ocount); written = generic_file_direct_write(iocb, &i, pos, count, ocount);
if (written < 0 || written == count) if (written < 0 || written == count)
goto out; goto out;
pos += written; pos += written;
count -= written;
iov_iter_init(&i, iov, nr_segs, count, written);
written_buffered = fuse_perform_write(file, mapping, &i, pos); written_buffered = fuse_perform_write(file, mapping, &i, pos);
if (written_buffered < 0) { if (written_buffered < 0) {
err = written_buffered; err = written_buffered;
......
...@@ -2251,6 +2251,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, ...@@ -2251,6 +2251,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
int full_coherency = !(osb->s_mount_opt & int full_coherency = !(osb->s_mount_opt &
OCFS2_MOUNT_COHERENCY_BUFFERED); OCFS2_MOUNT_COHERENCY_BUFFERED);
int unaligned_dio = 0; int unaligned_dio = 0;
struct iov_iter from;
trace_ocfs2_file_aio_write(inode, file, file->f_path.dentry, trace_ocfs2_file_aio_write(inode, file, file->f_path.dentry,
(unsigned long long)OCFS2_I(inode)->ip_blkno, (unsigned long long)OCFS2_I(inode)->ip_blkno,
...@@ -2365,16 +2366,15 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, ...@@ -2365,16 +2366,15 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
if (ret) if (ret)
goto out_dio; goto out_dio;
iov_iter_init(&from, iov, nr_segs, count, 0);
if (direct_io) { if (direct_io) {
written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos, written = generic_file_direct_write(iocb, &from, *ppos,
count, ocount); count, ocount);
if (written < 0) { if (written < 0) {
ret = written; ret = written;
goto out_dio; goto out_dio;
} }
} else { } else {
struct iov_iter from;
iov_iter_init(&from, iov, nr_segs, count, 0);
current->backing_dev_info = file->f_mapping->backing_dev_info; current->backing_dev_info = file->f_mapping->backing_dev_info;
written = generic_perform_write(file, &from, *ppos); written = generic_perform_write(file, &from, *ppos);
if (likely(written >= 0)) if (likely(written >= 0))
......
...@@ -641,6 +641,7 @@ xfs_file_dio_aio_write( ...@@ -641,6 +641,7 @@ xfs_file_dio_aio_write(
int iolock; int iolock;
struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ? struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
mp->m_rtdev_targp : mp->m_ddev_targp; mp->m_rtdev_targp : mp->m_ddev_targp;
struct iov_iter from;
/* DIO must be aligned to device logical sector size */ /* DIO must be aligned to device logical sector size */
if ((pos | count) & target->bt_logical_sectormask) if ((pos | count) & target->bt_logical_sectormask)
...@@ -698,8 +699,8 @@ xfs_file_dio_aio_write( ...@@ -698,8 +699,8 @@ xfs_file_dio_aio_write(
} }
trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0);
ret = generic_file_direct_write(iocb, iovp, iov_iter_init(&from, iovp, nr_segs, count, 0);
&nr_segs, pos, count, ocount); ret = generic_file_direct_write(iocb, &from, pos, count, ocount);
out: out:
xfs_rw_iunlock(ip, iolock); xfs_rw_iunlock(ip, iolock);
......
...@@ -2407,8 +2407,8 @@ int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isbl ...@@ -2407,8 +2407,8 @@ int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isbl
extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t); extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t);
extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long); extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long);
extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t); extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t);
extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *, extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *,
unsigned long *, loff_t, size_t, size_t); loff_t, size_t, size_t);
extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos); extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos);
extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos); extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
......
...@@ -2385,9 +2385,8 @@ int pagecache_write_end(struct file *file, struct address_space *mapping, ...@@ -2385,9 +2385,8 @@ int pagecache_write_end(struct file *file, struct address_space *mapping,
EXPORT_SYMBOL(pagecache_write_end); EXPORT_SYMBOL(pagecache_write_end);
ssize_t ssize_t
generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from,
unsigned long *nr_segs, loff_t pos, loff_t pos, size_t count, size_t ocount)
size_t count, size_t ocount)
{ {
struct file *file = iocb->ki_filp; struct file *file = iocb->ki_filp;
struct address_space *mapping = file->f_mapping; struct address_space *mapping = file->f_mapping;
...@@ -2397,9 +2396,9 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, ...@@ -2397,9 +2396,9 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
pgoff_t end; pgoff_t end;
if (count != ocount) if (count != ocount)
*nr_segs = iov_shorten((struct iovec *)iov, *nr_segs, count); from->nr_segs = iov_shorten((struct iovec *)from->iov, from->nr_segs, count);
write_len = iov_length(iov, *nr_segs); write_len = iov_length(from->iov, from->nr_segs);
end = (pos + write_len - 1) >> PAGE_CACHE_SHIFT; end = (pos + write_len - 1) >> PAGE_CACHE_SHIFT;
written = filemap_write_and_wait_range(mapping, pos, pos + write_len - 1); written = filemap_write_and_wait_range(mapping, pos, pos + write_len - 1);
...@@ -2426,7 +2425,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, ...@@ -2426,7 +2425,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
} }
} }
written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); written = mapping->a_ops->direct_IO(WRITE, iocb, from->iov, pos, from->nr_segs);
/* /*
* Finally, try again to invalidate clean pages which might have been * Finally, try again to invalidate clean pages which might have been
...@@ -2443,6 +2442,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, ...@@ -2443,6 +2442,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
if (written > 0) { if (written > 0) {
pos += written; pos += written;
iov_iter_advance(from, written);
if (pos > i_size_read(inode) && !S_ISBLK(inode->i_mode)) { if (pos > i_size_read(inode) && !S_ISBLK(inode->i_mode)) {
i_size_write(inode, pos); i_size_write(inode, pos);
mark_inode_dirty(inode); mark_inode_dirty(inode);
...@@ -2645,11 +2645,10 @@ ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, ...@@ -2645,11 +2645,10 @@ ssize_t __generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
if (unlikely(file->f_flags & O_DIRECT)) { if (unlikely(file->f_flags & O_DIRECT)) {
loff_t endbyte; loff_t endbyte;
written = generic_file_direct_write(iocb, iov, &from.nr_segs, pos, written = generic_file_direct_write(iocb, &from, pos,
count, ocount); count, ocount);
if (written < 0 || written == count) if (written < 0 || written == count)
goto out; goto out;
iov_iter_advance(&from, written);
/* /*
* direct-io write to a hole: fall through to buffered I/O * direct-io write to a hole: fall through to buffered I/O
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment