Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fs: move file_start_write() into vfs_iter_write()

All the callers of vfs_iter_write() call file_start_write() just before
calling vfs_iter_write() except for target_core_file's fd_do_rw().

Move file_start_write() from the callers into vfs_iter_write().
fd_do_rw() calls vfs_iter_write() with a non-regular file, so
file_start_write() is a no-op.

This is needed for fanotify "pre content" events.

Suggested-by: Jan Kara <jack@suse.cz>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://lore.kernel.org/r/20231122122715.2561213-11-amir73il@gmail.com
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Amir Goldstein and committed by
Christian Brauner
269aed70 e389b76a

+13 -18
-2
drivers/block/loop.c
··· 245 245 246 246 iov_iter_bvec(&i, ITER_SOURCE, bvec, 1, bvec->bv_len); 247 247 248 - file_start_write(file); 249 248 bw = vfs_iter_write(file, &i, ppos, 0); 250 - file_end_write(file); 251 249 252 250 if (likely(bw == bvec->bv_len)) 253 251 return 0;
+3 -7
drivers/target/target_core_file.c
··· 332 332 } 333 333 334 334 iov_iter_bvec(&iter, is_write, bvec, sgl_nents, len); 335 - if (is_write) { 336 - file_start_write(fd); 335 + if (is_write) 337 336 ret = vfs_iter_write(fd, &iter, &pos, 0); 338 - file_end_write(fd); 339 - } else { 337 + else 340 338 ret = vfs_iter_read(fd, &iter, &pos, 0); 341 - } 339 + 342 340 if (is_write) { 343 341 if (ret < 0 || ret != data_length) { 344 342 pr_err("%s() write returned %d\n", __func__, ret); ··· 467 469 } 468 470 469 471 iov_iter_bvec(&iter, ITER_SOURCE, bvec, nolb, len); 470 - file_start_write(fd_dev->fd_file); 471 472 ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos, 0); 472 - file_end_write(fd_dev->fd_file); 473 473 474 474 kfree(bvec); 475 475 if (ret < 0 || ret != len) {
-2
fs/coda/file.c
··· 80 80 goto finish_write; 81 81 82 82 inode_lock(coda_inode); 83 - file_start_write(host_file); 84 83 ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0); 85 84 coda_inode->i_size = file_inode(host_file)->i_size; 86 85 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; 87 86 inode_set_mtime_to_ts(coda_inode, inode_set_ctime_current(coda_inode)); 88 - file_end_write(host_file); 89 87 inode_unlock(coda_inode); 90 88 91 89 finish_write:
-2
fs/nfsd/vfs.c
··· 1186 1186 since = READ_ONCE(file->f_wb_err); 1187 1187 if (verf) 1188 1188 nfsd_copy_write_verifier(verf, nn); 1189 - file_start_write(file); 1190 1189 host_err = vfs_iter_write(file, &iter, &pos, flags); 1191 - file_end_write(file); 1192 1190 if (host_err < 0) { 1193 1191 commit_reset_write_verifier(nn, rqstp, host_err); 1194 1192 goto out_nfserr;
-2
fs/overlayfs/file.c
··· 436 436 if (is_sync_kiocb(iocb)) { 437 437 rwf_t rwf = iocb_to_rw_flags(ifl); 438 438 439 - file_start_write(real.file); 440 439 ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, rwf); 441 - file_end_write(real.file); 442 440 /* Update size */ 443 441 ovl_file_modified(file); 444 442 } else {
+10 -3
fs/read_write.c
··· 839 839 EXPORT_SYMBOL(vfs_iter_read); 840 840 841 841 static ssize_t do_iter_write(struct file *file, struct iov_iter *iter, 842 - loff_t *pos, rwf_t flags) 842 + loff_t *pos, rwf_t flags) 843 843 { 844 844 size_t tot_len; 845 845 ssize_t ret = 0; ··· 894 894 EXPORT_SYMBOL(vfs_iocb_iter_write); 895 895 896 896 ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos, 897 - rwf_t flags) 897 + rwf_t flags) 898 898 { 899 + int ret; 900 + 899 901 if (!file->f_op->write_iter) 900 902 return -EINVAL; 901 - return do_iter_write(file, iter, ppos, flags); 903 + 904 + file_start_write(file); 905 + ret = do_iter_write(file, iter, ppos, flags); 906 + file_end_write(file); 907 + 908 + return ret; 902 909 } 903 910 EXPORT_SYMBOL(vfs_iter_write); 904 911