fs: implement vfs_iter_write using do_iter_write
De-dupliate some code and allow for passing the flags argument to vfs_iter_write. Additionally it now properly updates timestamps. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
18e9710ee5
commit
abbb65899a
6 changed files with 16 additions and 26 deletions
|
@ -266,7 +266,7 @@ static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos)
|
|||
iov_iter_bvec(&i, ITER_BVEC, bvec, 1, bvec->bv_len);
|
||||
|
||||
file_start_write(file);
|
||||
bw = vfs_iter_write(file, &i, ppos);
|
||||
bw = vfs_iter_write(file, &i, ppos, 0);
|
||||
file_end_write(file);
|
||||
|
||||
if (likely(bw == bvec->bv_len))
|
||||
|
|
|
@ -273,7 +273,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
|
|||
|
||||
iov_iter_bvec(&iter, ITER_BVEC, bvec, sgl_nents, len);
|
||||
if (is_write)
|
||||
ret = vfs_iter_write(fd, &iter, &pos);
|
||||
ret = vfs_iter_write(fd, &iter, &pos, 0);
|
||||
else
|
||||
ret = vfs_iter_read(fd, &iter, &pos, 0);
|
||||
|
||||
|
@ -409,7 +409,7 @@ fd_execute_write_same(struct se_cmd *cmd)
|
|||
}
|
||||
|
||||
iov_iter_bvec(&iter, ITER_BVEC, bvec, nolb, len);
|
||||
ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos);
|
||||
ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos, 0);
|
||||
|
||||
kfree(bvec);
|
||||
if (ret < 0 || ret != len) {
|
||||
|
|
|
@ -51,7 +51,7 @@ coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to)
|
|||
host_file = cfi->cfi_container;
|
||||
file_start_write(host_file);
|
||||
inode_lock(coda_inode);
|
||||
ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos);
|
||||
ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0);
|
||||
coda_inode->i_size = file_inode(host_file)->i_size;
|
||||
coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
|
||||
coda_inode->i_mtime = coda_inode->i_ctime = current_time(coda_inode);
|
||||
|
|
|
@ -356,26 +356,6 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
|
|||
}
|
||||
#endif
|
||||
|
||||
ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos)
|
||||
{
|
||||
struct kiocb kiocb;
|
||||
ssize_t ret;
|
||||
|
||||
if (!file->f_op->write_iter)
|
||||
return -EINVAL;
|
||||
|
||||
init_sync_kiocb(&kiocb, file);
|
||||
kiocb.ki_pos = *ppos;
|
||||
|
||||
iter->type |= WRITE;
|
||||
ret = call_write_iter(file, &kiocb, iter);
|
||||
BUG_ON(ret == -EIOCBQUEUED);
|
||||
if (ret > 0)
|
||||
*ppos = kiocb.ki_pos;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(vfs_iter_write);
|
||||
|
||||
int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t count)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
@ -962,6 +942,15 @@ static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos,
|
||||
int flags)
|
||||
{
|
||||
if (!file->f_op->write_iter)
|
||||
return -EINVAL;
|
||||
return do_iter_write(file, iter, ppos, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(vfs_iter_write);
|
||||
|
||||
ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
|
||||
unsigned long vlen, loff_t *pos, int flags)
|
||||
{
|
||||
|
|
|
@ -762,7 +762,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
|
|||
|
||||
iov_iter_bvec(&from, ITER_BVEC | WRITE, array, n,
|
||||
sd.total_len - left);
|
||||
ret = vfs_iter_write(out, &from, &sd.pos);
|
||||
ret = vfs_iter_write(out, &from, &sd.pos, 0);
|
||||
if (ret <= 0)
|
||||
break;
|
||||
|
||||
|
|
|
@ -2791,7 +2791,8 @@ 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,
|
||||
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,
|
||||
int flags);
|
||||
|
||||
/* fs/block_dev.c */
|
||||
extern ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to);
|
||||
|
|
Loading…
Reference in a new issue