summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorBoris Burkov <boris@bur.io>2024-03-11 12:13:44 -0700
committerZorro Lang <zlang@kernel.org>2024-04-28 19:08:22 +0800
commitbc9debb83c9867b2cdfd19e3a304616749f1912c (patch)
tree5460d1a6b85b3dd3d9cf42b8081d04fc012f6b64 /common
parentb9785de77fcb7b4c9f58d6d7178a0ef63a059b84 (diff)
btrfs: new test for devt change between mounts
It is possible to confuse the btrfs device cache (fs_devices) by starting with a multi-device filesystem, then removing and re-adding a device in a way which changes its dev_t while the filesystem is unmounted. After this procedure, if we remount, then we are in a funny state where struct btrfs_device's "devt" field does not match the bd_dev of the "bdev" field. I would say this is bad enough, as we have violated a pretty clear invariant. But for style points, we can then remove the extra device from the fs, making it a single device fs, which enables the "temp_fsid" feature, which permits multiple separate mounts of different devices with the same fsid. Since btrfs is confused and *thinks* there are different devices (based on device->devt), it allows a second redundant mount of the same device (not a bind mount!). This then allows us to corrupt the original mount by doing stuff to the one that should be a bind mount. Reviewed-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: Boris Burkov <boris@bur.io> Signed-off-by: Anand Jain <anand.jain@oracle.com> [ use _create_loop_device, renamed $MNT $BIND and rm them before mkdir ] Signed-off-by: Zorro Lang <zlang@kernel.org> [ update the commit id of _fixed_by_kernel_commit ]
Diffstat (limited to 'common')
-rw-r--r--common/config1
1 files changed, 1 insertions, 0 deletions
diff --git a/common/config b/common/config
index 6a0496fd..eac0710e 100644
--- a/common/config
+++ b/common/config
@@ -235,6 +235,7 @@ export BLKZONE_PROG="$(type -P blkzone)"
export GZIP_PROG="$(type -P gzip)"
export BTRFS_IMAGE_PROG="$(type -P btrfs-image)"
export BTRFS_MAP_LOGICAL_PROG=$(type -P btrfs-map-logical)
+export PARTED_PROG="$(type -P parted)"
# use 'udevadm settle' or 'udevsettle' to wait for lv to be settled.
# newer systems have udevadm command but older systems like RHEL5 don't.