]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
loop: add file_start_write() and file_end_write()
authorMing Lei <ming.lei@redhat.com>
Tue, 27 May 2025 15:34:05 +0000 (23:34 +0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 27 May 2025 16:14:26 +0000 (10:14 -0600)
file_start_write() and file_end_write() should be added around ->write_iter().

Recently we switch to ->write_iter() from vfs_iter_write(), and the
implied file_start_write() and file_end_write() are lost.

Also we never add them for dio code path, so add them back for covering
both.

Cc: Jeff Moyer <jmoyer@redhat.com>
Fixes: f2fed441c69b ("loop: stop using vfs_iter_{read,write} for buffered I/O")
Fixes: bc07c10a3603 ("block: loop: support DIO & AIO")
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20250527153405.837216-1-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c

index e2b1f377f58563f3dc5476a1f6da1c54a050d64b..f8d136684109aa72ac1a897bb4340fcc3907f198 100644 (file)
@@ -308,11 +308,14 @@ end_io:
 static void lo_rw_aio_do_completion(struct loop_cmd *cmd)
 {
        struct request *rq = blk_mq_rq_from_pdu(cmd);
+       struct loop_device *lo = rq->q->queuedata;
 
        if (!atomic_dec_and_test(&cmd->ref))
                return;
        kfree(cmd->bvec);
        cmd->bvec = NULL;
+       if (req_op(rq) == REQ_OP_WRITE)
+               file_end_write(lo->lo_backing_file);
        if (likely(!blk_should_fake_timeout(rq->q)))
                blk_mq_complete_request(rq);
 }
@@ -387,9 +390,10 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
                cmd->iocb.ki_flags = 0;
        }
 
-       if (rw == ITER_SOURCE)
+       if (rw == ITER_SOURCE) {
+               file_start_write(lo->lo_backing_file);
                ret = file->f_op->write_iter(&cmd->iocb, &iter);
-       else
+       else
                ret = file->f_op->read_iter(&cmd->iocb, &iter);
 
        lo_rw_aio_do_completion(cmd);