btrfs: simplify fsid and metadata_uuid comparisons

Refactor the functions find_fsid() and find_fsid_with_metadata_uuid(),
as they currently share a common set of code to compare the fsid and
metadata_uuid. Create a common helper function, match_fsid_fs_devices().

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Anand Jain 2023-05-24 20:02:40 +08:00 committed by David Sterba
parent 413fb1bc1d
commit 1a89834500

View File

@ -427,6 +427,21 @@ void __exit btrfs_cleanup_fs_uuids(void)
} }
} }
static bool match_fsid_fs_devices(const struct btrfs_fs_devices *fs_devices,
const u8 *fsid, const u8 *metadata_fsid)
{
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) != 0)
return false;
if (!metadata_fsid)
return true;
if (memcmp(metadata_fsid, fs_devices->metadata_uuid, BTRFS_FSID_SIZE) != 0)
return false;
return true;
}
static noinline struct btrfs_fs_devices *find_fsid( static noinline struct btrfs_fs_devices *find_fsid(
const u8 *fsid, const u8 *metadata_fsid) const u8 *fsid, const u8 *metadata_fsid)
{ {
@ -436,15 +451,8 @@ static noinline struct btrfs_fs_devices *find_fsid(
/* Handle non-split brain cases */ /* Handle non-split brain cases */
list_for_each_entry(fs_devices, &fs_uuids, fs_list) { list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
if (metadata_fsid) { if (match_fsid_fs_devices(fs_devices, fsid, metadata_fsid))
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0 return fs_devices;
&& 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; return NULL;
} }
@ -462,14 +470,14 @@ static struct btrfs_fs_devices *find_fsid_with_metadata_uuid(
* at all and the CHANGING_FSID_V2 flag set. * at all and the CHANGING_FSID_V2 flag set.
*/ */
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(disk_super->metadata_uuid, fs_devices->fsid, continue;
BTRFS_FSID_SIZE) == 0 &&
memcmp(fs_devices->fsid, fs_devices->metadata_uuid, if (match_fsid_fs_devices(fs_devices, disk_super->metadata_uuid,
BTRFS_FSID_SIZE) == 0) { fs_devices->fsid))
return fs_devices; return 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 a device that * belonging to a fs_devices that was created by a device that