• Damien Le Moal's avatar
    block: Fix potential deadlock in blk_ia_range_sysfs_show() · 41e46b3c
    Damien Le Moal authored
    When being read, a sysfs attribute is already protected against removal
    with the kobject node active reference counter. As a result, in
    blk_ia_range_sysfs_show(), there is no need to take the queue sysfs
    lock when reading the value of a range attribute. Using the queue sysfs
    lock in this function creates a potential deadlock situation with the
    disk removal, something that a lockdep signals with a splat when the
    device is removed:
    
    [  760.703551]  Possible unsafe locking scenario:
    [  760.703551]
    [  760.703554]        CPU0                    CPU1
    [  760.703556]        ----                    ----
    [  760.703558]   lock(&q->sysfs_lock);
    [  760.703565]                                lock(kn->active#385);
    [  760.703573]                                lock(&q->sysfs_lock);
    [  760.703579]   lock(kn->active#385);
    [  760.703587]
    [  760.703587]  *** DEADLOCK ***
    
    Solve this by removing the mutex_lock()/mutex_unlock() calls from
    blk_ia_range_sysfs_show().
    
    Fixes: a2247f19 ("block: Add independent access ranges support")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
    Link: https://lore.kernel.org/r/20220603021905.1441419-1-damien.lemoal@opensource.wdc.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    41e46b3c
blk-ia-ranges.c 9.01 KB