* [PATCH] block: use trylock to avoid lockdep circular dependency in sysfs
@ 2026-03-05 3:15 Ming Lei
2026-03-05 11:02 ` Jens Axboe
2026-03-05 11:08 ` Jens Axboe
0 siblings, 2 replies; 3+ messages in thread
From: Ming Lei @ 2026-03-05 3:15 UTC (permalink / raw)
To: Jens Axboe, linux-block; +Cc: Ming Lei, Yi Zhang
Use trylock instead of blocking lock acquisition for update_nr_hwq_lock
in queue_requests_store() and elv_iosched_store() to avoid circular lock
dependency with kernfs active reference during concurrent disk deletion:
update_nr_hwq_lock -> kn->active (via del_gendisk -> kobject_del)
kn->active -> update_nr_hwq_lock (via sysfs write path)
Return -EBUSY when the lock is not immediately available.
Reported-and-tested-by: Yi Zhang <yi.zhang@redhat.com>
Closes: https://lore.kernel.org/linux-block/CAHj4cs-em-4acsHabMdT=jJhXkCzjnprD-aQH1OgrZo4nTnmMw@mail.gmail.com/
Fixes: 626ff4f8ebcb ("blk-mq: convert to serialize updating nr_requests with update_nr_hwq_lock")
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
block/blk-sysfs.c | 8 +++++++-
block/elevator.c | 12 +++++++++++-
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index f3b1968c80ce..55a1bbfef7d4 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -78,8 +78,14 @@ queue_requests_store(struct gendisk *disk, const char *page, size_t count)
/*
* Serialize updating nr_requests with concurrent queue_requests_store()
* and switching elevator.
+ *
+ * Use trylock to avoid circular lock dependency with kernfs active
+ * reference during concurrent disk deletion:
+ * update_nr_hwq_lock -> kn->active (via del_gendisk -> kobject_del)
+ * kn->active -> update_nr_hwq_lock (via this sysfs write path)
*/
- down_write(&set->update_nr_hwq_lock);
+ if (!down_write_trylock(&set->update_nr_hwq_lock))
+ return -EBUSY;
if (nr == q->nr_requests)
goto unlock;
diff --git a/block/elevator.c b/block/elevator.c
index ebe2a1fcf011..3bcd37c2aa34 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -807,7 +807,16 @@ ssize_t elv_iosched_store(struct gendisk *disk, const char *buf,
elv_iosched_load_module(ctx.name);
ctx.type = elevator_find_get(ctx.name);
- down_read(&set->update_nr_hwq_lock);
+ /*
+ * Use trylock to avoid circular lock dependency with kernfs active
+ * reference during concurrent disk deletion:
+ * update_nr_hwq_lock -> kn->active (via del_gendisk -> kobject_del)
+ * kn->active -> update_nr_hwq_lock (via this sysfs write path)
+ */
+ if (!down_read_trylock(&set->update_nr_hwq_lock)) {
+ ret = -EBUSY;
+ goto out;
+ }
if (!blk_queue_no_elv_switch(q)) {
ret = elevator_change(q, &ctx);
if (!ret)
@@ -817,6 +826,7 @@ ssize_t elv_iosched_store(struct gendisk *disk, const char *buf,
}
up_read(&set->update_nr_hwq_lock);
+out:
if (ctx.type)
elevator_put(ctx.type);
return ret;
--
2.47.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] block: use trylock to avoid lockdep circular dependency in sysfs
2026-03-05 3:15 [PATCH] block: use trylock to avoid lockdep circular dependency in sysfs Ming Lei
@ 2026-03-05 11:02 ` Jens Axboe
2026-03-05 11:08 ` Jens Axboe
1 sibling, 0 replies; 3+ messages in thread
From: Jens Axboe @ 2026-03-05 11:02 UTC (permalink / raw)
To: linux-block, Ming Lei; +Cc: Yi Zhang
On Thu, 05 Mar 2026 11:15:50 +0800, Ming Lei wrote:
> Use trylock instead of blocking lock acquisition for update_nr_hwq_lock
> in queue_requests_store() and elv_iosched_store() to avoid circular lock
> dependency with kernfs active reference during concurrent disk deletion:
>
> update_nr_hwq_lock -> kn->active (via del_gendisk -> kobject_del)
> kn->active -> update_nr_hwq_lock (via sysfs write path)
>
> [...]
Applied, thanks!
[1/1] block: use trylock to avoid lockdep circular dependency in sysfs
commit: ce8ee8583ed83122405eabaa8fb351be4d9dc65c
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] block: use trylock to avoid lockdep circular dependency in sysfs
2026-03-05 3:15 [PATCH] block: use trylock to avoid lockdep circular dependency in sysfs Ming Lei
2026-03-05 11:02 ` Jens Axboe
@ 2026-03-05 11:08 ` Jens Axboe
1 sibling, 0 replies; 3+ messages in thread
From: Jens Axboe @ 2026-03-05 11:08 UTC (permalink / raw)
To: Ming Lei, linux-block; +Cc: Yi Zhang
On 3/4/26 8:15 PM, Ming Lei wrote:
> Use trylock instead of blocking lock acquisition for update_nr_hwq_lock
> in queue_requests_store() and elv_iosched_store() to avoid circular lock
> dependency with kernfs active reference during concurrent disk deletion:
>
> update_nr_hwq_lock -> kn->active (via del_gendisk -> kobject_del)
> kn->active -> update_nr_hwq_lock (via sysfs write path)
>
> Return -EBUSY when the lock is not immediately available.
This does mean that scripts can get spurious -EBUSY they now need to
handle. Which probably isn't a big real world problem. While it isn't a
hard thing to fix up in a script, it can potentially break existing
setups.
Not sure I see a good way around that however, without queueing these
to a clean context and having the store helpers wait on eg work item
being processed and completed.
Hopefully this will never be a thing and we'll never need to discuss
this issue, I'll get this one applied for now.
--
Jens Axboe
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-03-05 11:08 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-05 3:15 [PATCH] block: use trylock to avoid lockdep circular dependency in sysfs Ming Lei
2026-03-05 11:02 ` Jens Axboe
2026-03-05 11:08 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox