diff options
author | Christoph Hellwig <hch@lst.de> | 2017-05-27 04:16:51 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-29 17:49:23 -0400 |
commit | 18e9710ee59ce3bd2a2512ddcd3f7ceebe8b8d17 (patch) | |
tree | a09b5ebcb9460ad374b798258b8f46dd370cad88 | |
parent | edab5fe38c2c17a7d7ea5f82e1d9503bfc79a8ac (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.c | 4 | ||||
-rw-r--r-- | drivers/target/target_core_file.c | 2 | ||||
-rw-r--r-- | fs/coda/file.c | 2 | ||||
-rw-r--r-- | fs/read_write.c | 29 | ||||
-rw-r--r-- | include/linux/fs.h | 3 |
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 | ||
40 | static ssize_t | 40 | static 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 | ||
359 | ssize_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 | } | ||
377 | EXPORT_SYMBOL(vfs_iter_read); | ||
378 | |||
379 | ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos) | 359 | ssize_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 | ||
927 | ssize_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 | } | ||
934 | EXPORT_SYMBOL(vfs_iter_read); | ||
935 | |||
947 | static ssize_t do_iter_write(struct file *file, struct iov_iter *iter, | 936 | static 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 *); | |||
2789 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *); | 2789 | extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *); |
2790 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); | 2790 | extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); |
2791 | 2791 | ||
2792 | ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); | 2792 | ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos, |
2793 | int flags); | ||
2793 | ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); | 2794 | ssize_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 */ |