block: fix locking for struct block_device size updates
authorChristoph Hellwig <hch@lst.de>
Sun, 23 Aug 2020 09:10:42 +0000 (11:10 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 1 Sep 2020 22:49:25 +0000 (16:49 -0600)
commitc2b4bb8cb3741c0bacf3683e4c1ecd04c977ada3
tree1c036d3d5215adea62f0ba3534ac3c8ce5836fe4
parent611bee526b4a89d49f1b9914a770bfdc101d5fb5
block: fix locking for struct block_device size updates

Two different callers use two different mutexes for updating the
block device size, which obviously doesn't help to actually protect
against concurrent updates from the different callers.  In addition
one of the locks, bd_mutex is rather prone to deadlocks with other
parts of the block stack that use it for high level synchronization.

Switch to using a new spinlock protecting just the size updates, as
that is all we need, and make sure everyone does the update through
the proper helper.

This fixes a bug reported with the nvme revalidating disks during a
hot removal operation, which can currently deadlock on bd_mutex.

Reported-by: Xianting Tian <xianting_tian@126.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/partitions/core.c
drivers/block/aoe/aoecmd.c
drivers/md/dm.c
drivers/s390/block/dasd_ioctl.c
fs/block_dev.c
include/linux/blk_types.h