The callers of vfs_iter_write() are required to hold file_start_write(). file_start_write() is a no-op for the S_ISBLK() case, but it is really needed when the backing file is a regular file. We are going to move file_{start,end}_write() into vfs_iter_write(), but we need to fix this first, so that the fix could be backported to stable kernels. Suggested-by: Christoph Hellwig <hch@xxxxxx> Link: https://lore.kernel.org/r/ZV8ETIpM+wZa33B5@xxxxxxxxxxxxx/ Cc: stable@xxxxxxxxxxxxxxx Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> --- Hi Martin, This bug is already fixed by commit "fs: move file_start_write() into vfs_iter_write()" on the vfs.rw branch in Christian's vfs tree, but Christoph suggested that I post a separate backportable fix for the scsi target code. You may decide if this is worth expediting to v6.7-rc or not. If not, then I think it would be best if Christian insert this patch at the bottom of the vfs.rw branch and revert in the later aformentioned commit. If you prefer to expedite it to v6.7-rc, then it's probably best to rebase vfs.rw branch after the fix hits master. Please let us know how you prefer to handle this patch. Thanks, Amir. drivers/target/target_core_file.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 4d447520bab8..4e4cf6c34a77 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -332,11 +332,13 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd, } iov_iter_bvec(&iter, is_write, bvec, sgl_nents, len); - if (is_write) + if (is_write) { + file_start_write(fd); ret = vfs_iter_write(fd, &iter, &pos, 0); - else + file_end_write(fd); + } else { ret = vfs_iter_read(fd, &iter, &pos, 0); - + } if (is_write) { if (ret < 0 || ret != data_length) { pr_err("%s() write returned %d\n", __func__, ret); @@ -467,7 +469,9 @@ fd_execute_write_same(struct se_cmd *cmd) } iov_iter_bvec(&iter, ITER_SOURCE, bvec, nolb, len); + file_start_write(fd_dev->fd_file); ret = vfs_iter_write(fd_dev->fd_file, &iter, &pos, 0); + file_end_write(fd_dev->fd_file); kfree(bvec); if (ret < 0 || ret != len) { -- 2.34.1