summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-05-27 04:16:51 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-06-29 17:49:23 -0400
commit18e9710ee59ce3bd2a2512ddcd3f7ceebe8b8d17 (patch)
treea09b5ebcb9460ad374b798258b8f46dd370cad88
parentedab5fe38c2c17a7d7ea5f82e1d9503bfc79a8ac (diff)
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: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--drivers/block/loop.c4
-rw-r--r--drivers/target/target_core_file.c2
-rw-r--r--fs/coda/file.c2
-rw-r--r--fs/read_write.c29
-rw-r--r--include/linux/fs.h3
5 files changed, 15 insertions, 25 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index ebbd0c3fe0ed..b64649bec64e 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -342,7 +342,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
342 342
343 rq_for_each_segment(bvec, rq, iter) { 343 rq_for_each_segment(bvec, rq, iter) {
344 iov_iter_bvec(&i, ITER_BVEC, &bvec, 1, bvec.bv_len); 344 iov_iter_bvec(&i, ITER_BVEC, &bvec, 1, bvec.bv_len);
345 len = vfs_iter_read(lo->lo_backing_file, &i, &pos); 345 len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
346 if (len < 0) 346 if (len < 0)
347 return len; 347 return len;
348 348
@@ -383,7 +383,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq,
383 b.bv_len = bvec.bv_len; 383 b.bv_len = bvec.bv_len;
384 384
385 iov_iter_bvec(&i, ITER_BVEC, &b, 1, b.bv_len); 385 iov_iter_bvec(&i, ITER_BVEC, &b, 1, b.bv_len);
386 len = vfs_iter_read(lo->lo_backing_file, &i, &pos); 386 len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
387 if (len < 0) { 387 if (len < 0) {
388 ret = len; 388 ret = len;
389 goto out_free_page; 389 goto out_free_page;
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index 73b8f93a5fef..2befc0d7fdb1 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -275,7 +275,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
275 if (is_write) 275 if (is_write)
276 ret = vfs_iter_write(fd, &iter, &pos); 276 ret = vfs_iter_write(fd, &iter, &pos);
277 else 277 else
278 ret = vfs_iter_read(fd, &iter, &pos); 278 ret = vfs_iter_read(fd, &iter, &pos, 0);
279 279
280 if (is_write) { 280 if (is_write) {
281 if (ret < 0 || ret != data_length) { 281 if (ret < 0 || ret != data_length) {
diff --git a/fs/coda/file.c b/fs/coda/file.c
index 9d956cd6d46f..f1102822bcfd 100644
--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -34,7 +34,7 @@ coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
34 34
35 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 35 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
36 36
37 return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos); 37 return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos, 0);
38} 38}
39 39
40static ssize_t 40static ssize_t
diff --git a/fs/read_write.c b/fs/read_write.c
index 64b61a032a56..4dab30b62f0e 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -356,26 +356,6 @@ out_putf:
356} 356}
357#endif 357#endif
358 358
359ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos)
360{
361 struct kiocb kiocb;
362 ssize_t ret;
363
364 if (!file->f_op->read_iter)
365 return -EINVAL;
366
367 init_sync_kiocb(&kiocb, file);
368 kiocb.ki_pos = *ppos;
369
370 iter->type |= READ;
371 ret = call_read_iter(file, &kiocb, iter);
372 BUG_ON(ret == -EIOCBQUEUED);
373 if (ret > 0)
374 *ppos = kiocb.ki_pos;
375 return ret;
376}
377EXPORT_SYMBOL(vfs_iter_read);
378
379ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos) 359ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos)
380{ 360{
381 struct kiocb kiocb; 361 struct kiocb kiocb;
@@ -944,6 +924,15 @@ out:
944 return ret; 924 return ret;
945} 925}
946 926
927ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
928 int flags)
929{
930 if (!file->f_op->read_iter)
931 return -EINVAL;
932 return do_iter_read(file, iter, ppos, flags);
933}
934EXPORT_SYMBOL(vfs_iter_read);
935
947static ssize_t do_iter_write(struct file *file, struct iov_iter *iter, 936static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
948 loff_t *pos, int flags) 937 loff_t *pos, int flags)
949{ 938{
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 803e5a9b2654..3f6a4f4efb32 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2789,7 +2789,8 @@ extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
2789extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *); 2789extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *);
2790extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); 2790extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
2791 2791
2792ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); 2792ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
2793 int flags);
2793ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); 2794ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos);
2794 2795
2795/* fs/block_dev.c */ 2796/* fs/block_dev.c */