diff --git a/drivers/block/loop.c b/drivers/block/loop.c index ebbd0c3fe0ed997973271ba9b57020d2519843d0..b64649bec64ef8ab779f8b1ec58d57946b3f9d8f 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, 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; diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 73b8f93a5fefbf18dfe06f763ffc07ceaca059a3..2befc0d7fdb1c9dcde92a64cc4bb075d624018aa 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, 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) { diff --git a/fs/coda/file.c b/fs/coda/file.c index 9d956cd6d46f93e56b8274e8d5b913071b05bc49..f1102822bcfd586b6a49b97a280dd57685ec2957 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) 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 diff --git a/fs/read_write.c b/fs/read_write.c index 64b61a032a5690a1d40785d64b97ce14a8a29922..4dab30b62f0e357e2af9406f59176723cce17729 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -356,26 +356,6 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high, } #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 @@ static ssize_t do_iter_read(struct file *file, struct iov_iter *iter, 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) { diff --git a/include/linux/fs.h b/include/linux/fs.h index 803e5a9b265422d2c2034678331b6d4dd353d1de..3f6a4f4efb3231272acc7efd23d5ba2da4c1d942 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 *); 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 */