Commit c6730a0e authored by Su Yue's avatar Su Yue Committed by David Sterba

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: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarSu Yue <Damenly_Su@gmx.com>
Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent c0d81c7c
...@@ -441,7 +441,27 @@ static noinline struct btrfs_fs_devices *find_fsid( ...@@ -441,7 +441,27 @@ static noinline struct btrfs_fs_devices *find_fsid(
ASSERT(fsid); ASSERT(fsid);
/* Handle non-split brain cases */
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
if (metadata_fsid) { if (metadata_fsid) {
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0
&& memcmp(metadata_fsid, fs_devices->metadata_uuid,
BTRFS_FSID_SIZE) == 0)
return fs_devices;
} else {
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0)
return fs_devices;
}
}
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 * Handle scanned device having completed its fsid change but
* belonging to a fs_devices that was created by first scanning * belonging to a fs_devices that was created by first scanning
...@@ -450,7 +470,7 @@ static noinline struct btrfs_fs_devices *find_fsid( ...@@ -450,7 +470,7 @@ static noinline struct btrfs_fs_devices *find_fsid(
*/ */
list_for_each_entry(fs_devices, &fs_uuids, fs_list) { list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
if (fs_devices->fsid_change && if (fs_devices->fsid_change &&
memcmp(metadata_fsid, fs_devices->fsid, memcmp(disk_super->metadata_uuid, fs_devices->fsid,
BTRFS_FSID_SIZE) == 0 && BTRFS_FSID_SIZE) == 0 &&
memcmp(fs_devices->fsid, fs_devices->metadata_uuid, memcmp(fs_devices->fsid, fs_devices->metadata_uuid,
BTRFS_FSID_SIZE) == 0) { BTRFS_FSID_SIZE) == 0) {
...@@ -467,28 +487,16 @@ static noinline struct btrfs_fs_devices *find_fsid( ...@@ -467,28 +487,16 @@ static noinline struct btrfs_fs_devices *find_fsid(
if (fs_devices->fsid_change && if (fs_devices->fsid_change &&
memcmp(fs_devices->metadata_uuid, memcmp(fs_devices->metadata_uuid,
fs_devices->fsid, BTRFS_FSID_SIZE) != 0 && fs_devices->fsid, BTRFS_FSID_SIZE) != 0 &&
memcmp(metadata_fsid, fs_devices->metadata_uuid, memcmp(disk_super->metadata_uuid, fs_devices->metadata_uuid,
BTRFS_FSID_SIZE) == 0) { BTRFS_FSID_SIZE) == 0) {
return fs_devices; return fs_devices;
} }
} }
}
/* Handle non-split brain cases */ return find_fsid(disk_super->fsid, disk_super->metadata_uuid);
list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
if (metadata_fsid) {
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0
&& memcmp(metadata_fsid, fs_devices->metadata_uuid,
BTRFS_FSID_SIZE) == 0)
return fs_devices;
} else {
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0)
return fs_devices;
}
}
return NULL;
} }
static int static int
btrfs_get_bdev_and_sb(const char *device_path, fmode_t flags, void *holder, btrfs_get_bdev_and_sb(const char *device_path, fmode_t flags, void *holder,
int flush, struct block_device **bdev, int flush, struct block_device **bdev,
...@@ -744,8 +752,7 @@ static noinline struct btrfs_device *device_list_add(const char *path, ...@@ -744,8 +752,7 @@ static noinline struct btrfs_device *device_list_add(const char *path,
else else
fs_devices = find_fsid_changed(disk_super); fs_devices = find_fsid_changed(disk_super);
} else if (has_metadata_uuid) { } else if (has_metadata_uuid) {
fs_devices = find_fsid(disk_super->fsid, fs_devices = find_fsid_with_metadata_uuid(disk_super);
disk_super->metadata_uuid);
} else { } else {
fs_devices = find_fsid(disk_super->fsid, NULL); fs_devices = find_fsid(disk_super->fsid, NULL);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment