Commit 18e9710e authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro

fs: implement vfs_iter_read using do_iter_read

De-dupliate some code and allow for passing the flags argument to
vfs_iter_read.  Additional it properly updates atime now.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent edab5fe3
...@@ -342,7 +342,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq, ...@@ -342,7 +342,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
rq_for_each_segment(bvec, rq, iter) { rq_for_each_segment(bvec, rq, iter) {
iov_iter_bvec(&i, ITER_BVEC, &bvec, 1, bvec.bv_len); iov_iter_bvec(&i, ITER_BVEC, &bvec, 1, bvec.bv_len);
len = vfs_iter_read(lo->lo_backing_file, &i, &pos); len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
if (len < 0) if (len < 0)
return len; return len;
...@@ -383,7 +383,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq, ...@@ -383,7 +383,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq,
b.bv_len = bvec.bv_len; b.bv_len = bvec.bv_len;
iov_iter_bvec(&i, ITER_BVEC, &b, 1, b.bv_len); iov_iter_bvec(&i, ITER_BVEC, &b, 1, b.bv_len);
len = vfs_iter_read(lo->lo_backing_file, &i, &pos); len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
if (len < 0) { if (len < 0) {
ret = len; ret = len;
goto out_free_page; goto out_free_page;
......
...@@ -275,7 +275,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd, ...@@ -275,7 +275,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
if (is_write) if (is_write)
ret = vfs_iter_write(fd, &iter, &pos); ret = vfs_iter_write(fd, &iter, &pos);
else else
ret = vfs_iter_read(fd, &iter, &pos); ret = vfs_iter_read(fd, &iter, &pos, 0);
if (is_write) { if (is_write) {
if (ret < 0 || ret != data_length) { if (ret < 0 || ret != data_length) {
......
...@@ -34,7 +34,7 @@ coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to) ...@@ -34,7 +34,7 @@ coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos); return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos, 0);
} }
static ssize_t static ssize_t
......
...@@ -356,26 +356,6 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high, ...@@ -356,26 +356,6 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
} }
#endif #endif
ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos)
{
struct kiocb kiocb;
ssize_t ret;
if (!file->f_op->read_iter)
return -EINVAL;
init_sync_kiocb(&kiocb, file);
kiocb.ki_pos = *ppos;
iter->type |= READ;
ret = call_read_iter(file, &kiocb, iter);
BUG_ON(ret == -EIOCBQUEUED);
if (ret > 0)
*ppos = kiocb.ki_pos;
return ret;
}
EXPORT_SYMBOL(vfs_iter_read);
ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos) ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos)
{ {
struct kiocb kiocb; struct kiocb kiocb;
...@@ -944,6 +924,15 @@ static ssize_t do_iter_read(struct file *file, struct iov_iter *iter, ...@@ -944,6 +924,15 @@ static ssize_t do_iter_read(struct file *file, struct iov_iter *iter,
return ret; return ret;
} }
ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
int flags)
{
if (!file->f_op->read_iter)
return -EINVAL;
return do_iter_read(file, iter, ppos, flags);
}
EXPORT_SYMBOL(vfs_iter_read);
static ssize_t do_iter_write(struct file *file, struct iov_iter *iter, static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
loff_t *pos, int flags) loff_t *pos, int flags)
{ {
......
...@@ -2789,7 +2789,8 @@ extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); ...@@ -2789,7 +2789,8 @@ extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *); extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *);
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);
ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
int flags);
ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos);
/* fs/block_dev.c */ /* fs/block_dev.c */
......
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