]> git.itanic.dy.fi Git - linux-stable/commit
fs: Avoid grabbing sb->s_umount under bdev->bd_holder_lock
authorJan Kara <jack@suse.cz>
Wed, 18 Oct 2023 15:29:24 +0000 (17:29 +0200)
committerChristian Brauner <brauner@kernel.org>
Sat, 28 Oct 2023 11:29:22 +0000 (13:29 +0200)
commitfd1464105cb37a3b50a72c1d2902e97a71950af8
tree1ef7340dc0d2c358a4c8f0e46015e29ca5c2f5ac
parent6306ff39a7fcb7e9c59a00e6860b933b71a2ed3e
fs: Avoid grabbing sb->s_umount under bdev->bd_holder_lock

The implementation of bdev holder operations such as fs_bdev_mark_dead()
and fs_bdev_sync() grab sb->s_umount semaphore under
bdev->bd_holder_lock. This is problematic because it leads to
disk->open_mutex -> sb->s_umount lock ordering which is counterintuitive
(usually we grab higher level (e.g. filesystem) locks first and lower
level (e.g. block layer) locks later) and indeed makes lockdep complain
about possible locking cycles whenever we open a block device while
holding sb->s_umount semaphore. Implement a function
bdev_super_lock_shared() which safely transitions from holding
bdev->bd_holder_lock to holding sb->s_umount on alive superblock without
introducing the problematic lock dependency. We use this function
fs_bdev_sync() and fs_bdev_mark_dead().

Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20231018152924.3858-1-jack@suse.cz
Link: https://lore.kernel.org/r/20231017184823.1383356-1-hch@lst.de
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
block/bdev.c
block/ioctl.c
fs/super.c