]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
fs: implement vfs_iter_read using do_iter_read
authorChristoph Hellwig <hch@lst.de>
Sat, 27 May 2017 08:16:51 +0000 (11:16 +0300)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 29 Jun 2017 21:49:23 +0000 (17:49 -0400)
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>
drivers/block/loop.c
drivers/target/target_core_file.c
fs/coda/file.c
fs/read_write.c
include/linux/fs.h

index ebbd0c3fe0ed997973271ba9b57020d2519843d0..b64649bec64ef8ab779f8b1ec58d57946b3f9d8f 100644 (file)
@@ -342,7 +342,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
 
        rq_for_each_segment(bvec, rq, iter) {
                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)
                        return len;
 
@@ -383,7 +383,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq,
                b.bv_len = bvec.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) {
                        ret = len;
                        goto out_free_page;
index 73b8f93a5fefbf18dfe06f763ffc07ceaca059a3..2befc0d7fdb1c9dcde92a64cc4bb075d624018aa 100644 (file)
@@ -275,7 +275,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
        if (is_write)
                ret = vfs_iter_write(fd, &iter, &pos);
        else
-               ret = vfs_iter_read(fd, &iter, &pos);
+               ret = vfs_iter_read(fd, &iter, &pos, 0);
 
        if (is_write) {
                if (ret < 0 || ret != data_length) {
index 9d956cd6d46f93e56b8274e8d5b913071b05bc49..f1102822bcfd586b6a49b97a280dd57685ec2957 100644 (file)
@@ -34,7 +34,7 @@ coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
 
        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
index 64b61a032a5690a1d40785d64b97ce14a8a29922..4dab30b62f0e357e2af9406f59176723cce17729 100644 (file)
@@ -356,26 +356,6 @@ out_putf:
 }
 #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)
 {
        struct kiocb kiocb;
@@ -944,6 +924,15 @@ out:
        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,
                loff_t *pos, int flags)
 {
index 803e5a9b265422d2c2034678331b6d4dd353d1de..3f6a4f4efb3231272acc7efd23d5ba2da4c1d942 100644 (file)
@@ -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_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);
 
 /* fs/block_dev.c */