On 9/23/19 5:12 PM, Ming Lei wrote: > cecf5d87ff20 ("block: split .sysfs_lock into two locks") starts to > release & acquire sysfs_lock before registering/un-registering elevator > queue during switching elevator for avoiding potential deadlock from > showing & storing 'queue/iosched' attributes and removing elevator's > kobject. > > Turns out there isn't such deadlock because 'q->sysfs_lock' isn't > required in .show & .store of queue/iosched's attributes, and just > elevator's sysfs lock is acquired in elv_iosched_store() and > elv_iosched_show(). So it is safe to hold queue's sysfs lock when > registering/un-registering elevator queue. > > The biggest issue is that commit cecf5d87ff20 assumes that concurrent > write on 'queue/scheduler' can't happen. However, this assumption isn't > true, because kernfs_fop_write() only guarantees that concurrent write > aren't called on the same open file, but the write could be from > different open on the file. So we can't release & re-acquire queue's > sysfs lock during switching elevator, otherwise use-after-free on > elevator could be triggered. > > Fixes the issue by not releasing queue's sysfs lock during switching > elevator. Applied, thanks Ming. -- Jens Axboe