Skip to content

Commit abbb658

Browse files
Christoph HellwigAl Viro
authored andcommitted
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>
1 parent 18e9710 commit abbb658

File tree

6 files changed

+16
-26
lines changed

6 files changed

+16
-26
lines changed

drivers/block/loop.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos)
266266
iov_iter_bvec(&i, ITER_BVEC, bvec, 1, bvec->bv_len);
267267

268268
file_start_write(file);
269-
bw = vfs_iter_write(file, &i, ppos);
269+
bw = vfs_iter_write(file, &i, ppos, 0);
270270
file_end_write(file);
271271

272272
if (likely(bw == bvec->bv_len))

drivers/target/target_core_file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
273273

274274
iov_iter_bvec(&iter, ITER_BVEC, bvec, sgl_nents, len);
275275
if (is_write)
276-
ret = vfs_iter_write(fd, &iter, &pos);
276+
ret = vfs_iter_write(fd, &iter, &pos, 0);
277277
else
278278
ret = vfs_iter_read(fd, &iter, &pos, 0);
279279

@@ -409,7 +409,7 @@ fd_execute_write_same(struct se_cmd *cmd)
409409
}
410410

411411
iov_iter_bvec(&iter, ITER_BVEC, bvec, nolb, len);
412-
ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos);
412+
ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos, 0);
413413

414414
kfree(bvec);
415415
if (ret < 0 || ret != len) {

fs/coda/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to)
5151
host_file = cfi->cfi_container;
5252
file_start_write(host_file);
5353
inode_lock(coda_inode);
54-
ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos);
54+
ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0);
5555
coda_inode->i_size = file_inode(host_file)->i_size;
5656
coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
5757
coda_inode->i_mtime = coda_inode->i_ctime = current_time(coda_inode);

fs/read_write.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -356,26 +356,6 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
356356
}
357357
#endif
358358

359-
ssize_t vfs_iter_write(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->write_iter)
365-
return -EINVAL;
366-
367-
init_sync_kiocb(&kiocb, file);
368-
kiocb.ki_pos = *ppos;
369-
370-
iter->type |= WRITE;
371-
ret = call_write_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_write);
378-
379359
int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t count)
380360
{
381361
struct inode *inode;
@@ -962,6 +942,15 @@ static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
962942
return ret;
963943
}
964944

945+
ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos,
946+
int flags)
947+
{
948+
if (!file->f_op->write_iter)
949+
return -EINVAL;
950+
return do_iter_write(file, iter, ppos, flags);
951+
}
952+
EXPORT_SYMBOL(vfs_iter_write);
953+
965954
ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
966955
unsigned long vlen, loff_t *pos, int flags)
967956
{

fs/splice.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
762762

763763
iov_iter_bvec(&from, ITER_BVEC | WRITE, array, n,
764764
sd.total_len - left);
765-
ret = vfs_iter_write(out, &from, &sd.pos);
765+
ret = vfs_iter_write(out, &from, &sd.pos, 0);
766766
if (ret <= 0)
767767
break;
768768

include/linux/fs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2791,7 +2791,8 @@ extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
27912791

27922792
ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
27932793
int flags);
2794-
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,
2795+
int flags);
27952796

27962797
/* fs/block_dev.c */
27972798
extern ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to);

0 commit comments

Comments
 (0)