Re: [PATCH] loop: use kiocb helpers to fix lockdep warning

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 16, 2025 at 7:48 PM Ming Lei <ming.lei@xxxxxxxxxx> wrote:
>
> The lockdep tool can report a circular lock dependency warning in the loop
> driver's AIO read/write path:
>
> ```
> [ 6540.587728] kworker/u96:5/72779 is trying to acquire lock:
> [ 6540.593856] ff110001b5968440 (sb_writers#9){.+.+}-{0:0}, at: loop_process_work+0x11a/0xf70 [loop]
> [ 6540.603786]
> [ 6540.603786] but task is already holding lock:
> [ 6540.610291] ff110001b5968440 (sb_writers#9){.+.+}-{0:0}, at: loop_process_work+0x11a/0xf70 [loop]
> [ 6540.620210]
> [ 6540.620210] other info that might help us debug this:
> [ 6540.627499]  Possible unsafe locking scenario:
> [ 6540.627499]
> [ 6540.634110]        CPU0
> [ 6540.636841]        ----
> [ 6540.639574]   lock(sb_writers#9);
> [ 6540.643281]   lock(sb_writers#9);
> [ 6540.646988]
> [ 6540.646988]  *** DEADLOCK ***
> ```
>
> This patch fixes the issue by using the AIO-specific helpers
> `kiocb_start_write()` and `kiocb_end_write()`. These functions are
> designed to be used with a `kiocb` and manage write sequencing
> correctly for asynchronous I/O without introducing the problematic
> lock dependency.
>
> The `kiocb` is already part of the `loop_cmd` struct, so this change
> also simplifies the completion function `lo_rw_aio_do_completion()` by
> using the `iocb` from the `cmd` struct directly, instead of retrieving
> the loop device from the request queue.
>
> Fixes: 39d86db34e41 ("loop: add file_start_write() and file_end_write()")
> Cc: Changhui Zhong <czhong@xxxxxxxxxx>
> Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx>
> ---
>  drivers/block/loop.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index 500840e4a74e..8d994cae3b83 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -308,14 +308,13 @@ static void lo_complete_rq(struct request *rq)
>  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);
> +               kiocb_end_write(&cmd->iocb);
>         if (likely(!blk_should_fake_timeout(rq->q)))
>                 blk_mq_complete_request(rq);
>  }
> @@ -391,7 +390,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
>         }
>
>         if (rw == ITER_SOURCE) {
> -               file_start_write(lo->lo_backing_file);
> +               kiocb_start_write(&cmd->iocb);
>                 ret = file->f_op->write_iter(&cmd->iocb, &iter);
>         } else
>                 ret = file->f_op->read_iter(&cmd->iocb, &iter);
> --
> 2.50.1
>

Thanks Ming!
Verify that after applying the patch, this warning message is no
longer triggered,






[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux