btrfs: Factor out metadata_uuid code from find_fsid.
find_fsid became rather hairy with the introduction of metadata uuid changing feature. Alleviate this by factoring out the metadata uuid specific code in a dedicated function which deals with finding correct fsid for a device with changed uuid. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Su Yue <Damenly_Su@gmx.com> Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
c0d81c7cb2
commit
c6730a0e57
|
@ -441,39 +441,6 @@ static noinline struct btrfs_fs_devices *find_fsid(
|
|||
|
||||
ASSERT(fsid);
|
||||
|
||||
if (metadata_fsid) {
|
||||
/*
|
||||
* Handle scanned device having completed its fsid change but
|
||||
* belonging to a fs_devices that was created by first scanning
|
||||
* a device which didn't have its fsid/metadata_uuid changed
|
||||
* at all and the CHANGING_FSID_V2 flag set.
|
||||
*/
|
||||
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
|
||||
if (fs_devices->fsid_change &&
|
||||
memcmp(metadata_fsid, fs_devices->fsid,
|
||||
BTRFS_FSID_SIZE) == 0 &&
|
||||
memcmp(fs_devices->fsid, fs_devices->metadata_uuid,
|
||||
BTRFS_FSID_SIZE) == 0) {
|
||||
return fs_devices;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Handle scanned device having completed its fsid change but
|
||||
* belonging to a fs_devices that was created by a device that
|
||||
* has an outdated pair of fsid/metadata_uuid and
|
||||
* CHANGING_FSID_V2 flag set.
|
||||
*/
|
||||
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
|
||||
if (fs_devices->fsid_change &&
|
||||
memcmp(fs_devices->metadata_uuid,
|
||||
fs_devices->fsid, BTRFS_FSID_SIZE) != 0 &&
|
||||
memcmp(metadata_fsid, fs_devices->metadata_uuid,
|
||||
BTRFS_FSID_SIZE) == 0) {
|
||||
return fs_devices;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle non-split brain cases */
|
||||
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
|
||||
if (metadata_fsid) {
|
||||
|
@ -489,6 +456,47 @@ static noinline struct btrfs_fs_devices *find_fsid(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct btrfs_fs_devices *find_fsid_with_metadata_uuid(
|
||||
struct btrfs_super_block *disk_super)
|
||||
{
|
||||
|
||||
struct btrfs_fs_devices *fs_devices;
|
||||
|
||||
/*
|
||||
* Handle scanned device having completed its fsid change but
|
||||
* belonging to a fs_devices that was created by first scanning
|
||||
* a device which didn't have its fsid/metadata_uuid changed
|
||||
* at all and the CHANGING_FSID_V2 flag set.
|
||||
*/
|
||||
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
|
||||
if (fs_devices->fsid_change &&
|
||||
memcmp(disk_super->metadata_uuid, fs_devices->fsid,
|
||||
BTRFS_FSID_SIZE) == 0 &&
|
||||
memcmp(fs_devices->fsid, fs_devices->metadata_uuid,
|
||||
BTRFS_FSID_SIZE) == 0) {
|
||||
return fs_devices;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Handle scanned device having completed its fsid change but
|
||||
* belonging to a fs_devices that was created by a device that
|
||||
* has an outdated pair of fsid/metadata_uuid and
|
||||
* CHANGING_FSID_V2 flag set.
|
||||
*/
|
||||
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
|
||||
if (fs_devices->fsid_change &&
|
||||
memcmp(fs_devices->metadata_uuid,
|
||||
fs_devices->fsid, BTRFS_FSID_SIZE) != 0 &&
|
||||
memcmp(disk_super->metadata_uuid, fs_devices->metadata_uuid,
|
||||
BTRFS_FSID_SIZE) == 0) {
|
||||
return fs_devices;
|
||||
}
|
||||
}
|
||||
|
||||
return find_fsid(disk_super->fsid, disk_super->metadata_uuid);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
btrfs_get_bdev_and_sb(const char *device_path, fmode_t flags, void *holder,
|
||||
int flush, struct block_device **bdev,
|
||||
|
@ -744,8 +752,7 @@ static noinline struct btrfs_device *device_list_add(const char *path,
|
|||
else
|
||||
fs_devices = find_fsid_changed(disk_super);
|
||||
} else if (has_metadata_uuid) {
|
||||
fs_devices = find_fsid(disk_super->fsid,
|
||||
disk_super->metadata_uuid);
|
||||
fs_devices = find_fsid_with_metadata_uuid(disk_super);
|
||||
} else {
|
||||
fs_devices = find_fsid(disk_super->fsid, NULL);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue