Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

block: move removing elevator after deleting disk->queue_kobj

When blk_unregister_queue() is called from add_disk() failure path,
there is race in registering/unregistering elevator queue kobject
from the two code paths, because commit 559dc11143eb ("block: move
elv_register[unregister]_queue out of elevator_lock") moves elevator
queue register/unregister out of elevator lock.

Fix the race by removing elevator after deleting disk->queue_kobj,
because kobject_del(&disk->queue_kobj) drains in-progress sysfs
show()/store() of all attributes.

Fixes: 559dc11143eb ("block: move elv_register[unregister]_queue out of elevator_lock")
Reported-by: Nilay Shroff <nilay@linux.ibm.com>
Suggested-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Link: https://lore.kernel.org/r/20250508085807.3175112-3-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Ming Lei and committed by
Jens Axboe
824afb9b 8336d18c

+3 -3
+3 -3
block/blk-sysfs.c
··· 948 948 blk_mq_sysfs_unregister(disk); 949 949 blk_crypto_sysfs_unregister(disk); 950 950 951 - if (queue_is_mq(q)) 952 - elevator_set_none(q); 953 - 954 951 mutex_lock(&q->sysfs_lock); 955 952 disk_unregister_independent_access_ranges(disk); 956 953 mutex_unlock(&q->sysfs_lock); ··· 955 958 /* Now that we've deleted all child objects, we can delete the queue. */ 956 959 kobject_uevent(&disk->queue_kobj, KOBJ_REMOVE); 957 960 kobject_del(&disk->queue_kobj); 961 + 962 + if (queue_is_mq(q)) 963 + elevator_set_none(q); 958 964 959 965 blk_debugfs_remove(disk); 960 966 }