diff options
| author | Ming Lei <[email protected]> | 2025-05-27 15:34:05 +0000 |
|---|---|---|
| committer | Jens Axboe <[email protected]> | 2025-05-27 16:14:26 +0000 |
| commit | 39d86db34e41b96bd86f1955cd0ce6cd9c5fca4c (patch) | |
| tree | 6ab4b609d22f356721f08653dc53f4897a3a28e2 | |
| parent | bcache: reserve more RESERVE_BTREE buckets to prevent allocator hang (diff) | |
| download | kernel-39d86db34e41b96bd86f1955cd0ce6cd9c5fca4c.tar.gz kernel-39d86db34e41b96bd86f1955cd0ce6cd9c5fca4c.zip | |
loop: add file_start_write() and file_end_write()
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 <[email protected]>
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 <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
| -rw-r--r-- | drivers/block/loop.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index e2b1f377f585..f8d136684109 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -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); |
