loop: add file_start_write() and file_end_write()
[ Upstream commit 39d86db34e41b96bd86f1955cd0ce6cd9c5fca4c ]
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: bc07c10a36 ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
4bd30962f3
commit
3091d4c0d0
@@ -323,11 +323,14 @@ end_io:
|
|||||||
static void lo_rw_aio_do_completion(struct loop_cmd *cmd)
|
static void lo_rw_aio_do_completion(struct loop_cmd *cmd)
|
||||||
{
|
{
|
||||||
struct request *rq = blk_mq_rq_from_pdu(cmd);
|
struct request *rq = blk_mq_rq_from_pdu(cmd);
|
||||||
|
struct loop_device *lo = rq->q->queuedata;
|
||||||
|
|
||||||
if (!atomic_dec_and_test(&cmd->ref))
|
if (!atomic_dec_and_test(&cmd->ref))
|
||||||
return;
|
return;
|
||||||
kfree(cmd->bvec);
|
kfree(cmd->bvec);
|
||||||
cmd->bvec = NULL;
|
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)))
|
if (likely(!blk_should_fake_timeout(rq->q)))
|
||||||
blk_mq_complete_request(rq);
|
blk_mq_complete_request(rq);
|
||||||
}
|
}
|
||||||
@@ -402,9 +405,10 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
|
|||||||
cmd->iocb.ki_flags = 0;
|
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);
|
ret = file->f_op->write_iter(&cmd->iocb, &iter);
|
||||||
else
|
} else
|
||||||
ret = file->f_op->read_iter(&cmd->iocb, &iter);
|
ret = file->f_op->read_iter(&cmd->iocb, &iter);
|
||||||
|
|
||||||
lo_rw_aio_do_completion(cmd);
|
lo_rw_aio_do_completion(cmd);
|
||||||
|
|||||||
Reference in New Issue
Block a user