• Damien Le Moal's avatar
    block: Unhash a zone write plug only if needed · 79ae35a4
    Damien Le Moal authored
    Fix disk_remove_zone_wplug() to ensure that a zone write plug already
    removed from a disk hash table of zone write plugs is not removed
    again. Do this by checking the BLK_ZONE_WPLUG_UNHASHED flag of the plug
    and calling hlist_del_init_rcu() only if the flag is not set.
    
    Furthermore, since BIO completions can happen at any time, that is,
    decrementing of the zone write plug reference count can happen at any
    time, make sure to use disk_put_zone_wplug() instead of atomic_dec() to
    ensure that the zone write plug is freed when its last reference is
    dropped. In order to do this, disk_remove_zone_wplug() is moved after
    the definition of disk_put_zone_wplug(). disk_should_remove_zone_wplug()
    is moved as well to keep it together with disk_remove_zone_wplug().
    
    To be consistent with this change, add a check in disk_put_zone_wplug()
    to ensure that a zone write plug being freed was already removed from
    the disk hash table.
    
    Fixes: dd291d77 ("block: Introduce zone write plugging")
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Link: https://lore.kernel.org/r/20240501110907.96950-7-dlemoal@kernel.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    79ae35a4
blk-zoned.c 52.8 KB