On Fri, Mar 08, 2024 at 09:53:07PM +0530, Anand Jain wrote:
It's a bit complex, as Boris discovered and has provided a testcase for here:
https://lore.kernel.org/fstests/f40e347d5a4b4b28201b1a088d38a3c75dd10ebd.170...
In essence:
- Create two devices, d1 and d2.
- Both devices will be scanned into the kernel by Mfks.
- Use an external method to alter the devt of the d2 device.
- Mount using d1.
- You end up with a 2 devices Btrfs with an incorrect device->devt.
- Delete d1.
- Now you have a single-device Btrfs on d2 with a stale device->devt.
But how do you get mismatching devices in this exact place?
- bdev->bd_dev is immutable and never updated - device->devt can be changed by device_list_add, but if that happens underneath us here between btrfs_get_bdev_and_sb and the code a few lines below the call to it in btrfs_open_one_device there is a huge synchronization problem