mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 23:11:27 +00:00
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>
This commit is contained in:
parent
edab5fe38c
commit
18e9710ee5
5 changed files with 15 additions and 25 deletions
|
@ -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,
|
||||||
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,
|
||||||
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)
|
||||||
|
|
||||||
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 @@ out_putf:
|
||||||
}
|
}
|
||||||
#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 @@ out:
|
||||||
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 *);
|
||||||
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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue