]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
loop: clear nowait flag in workqueue context
authorChaitanya Kulkarni <ckulkarnilinux@gmail.com>
Wed, 19 Nov 2025 23:22:33 +0000 (15:22 -0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 20 Nov 2025 14:42:32 +0000 (07:42 -0700)
The loop driver advertises REQ_NOWAIT support through BLK_FEAT_NOWAIT
(enabled by default for all blk-mq devices), and honors the nowait
behavior throughout loop_queue_rq().

However, actual I/O to the backing file is performed in a workqueue,
where blocking is allowed.

To avoid imposing unnecessary non-blocking constraints in this blocking
context, clear the REQ_NOWAIT flag before processing the request in the
workqueue context.

Signed-off-by: Chaitanya Kulkarni <ckulkarnilinux@gmail.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c

index 9b842d767381a11138823e0b4efde3b58b8878fe..dd049764bb0c36a4d5d7bb3baabf207c5b56fda5 100644 (file)
@@ -2060,6 +2060,10 @@ static void loop_handle_cmd(struct loop_cmd *cmd)
                goto failed;
        }
 
+       /* We can block in this context, so ignore REQ_NOWAIT. */
+       if (rq->cmd_flags & REQ_NOWAIT)
+               rq->cmd_flags &= ~REQ_NOWAIT;
+
        if (cmd_blkcg_css)
                kthread_associate_blkcg(cmd_blkcg_css);
        if (cmd_memcg_css)