btrfs: simplify how changed fsid and metadata_uuid is checked
authorAnand Jain <anand.jain@oracle.com>
Wed, 24 May 2023 12:02:41 +0000 (20:02 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:29 +0000 (13:59 +0200)
We often check if the metadata_uuid is not the same as fsid, and then we
check if the given fsid matches the metadata_uuid. This patch refactors
this logic into function match_fsid_changed and utilize it.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/volumes.c

index 1affe63..a4bfec0 100644 (file)
@@ -457,6 +457,19 @@ static noinline struct btrfs_fs_devices *find_fsid(
        return NULL;
 }
 
+/*
+ * First check if the metadata_uuid is different from the fsid in the given
+ * fs_devices. Then check if the given fsid is the same as the metadata_uuid
+ * in the fs_devices. If it is, return true; otherwise, return false.
+ */
+static inline bool check_fsid_changed(const struct btrfs_fs_devices *fs_devices,
+                                     const u8 *fsid)
+{
+       return memcmp(fs_devices->fsid, fs_devices->metadata_uuid,
+                     BTRFS_FSID_SIZE) != 0 &&
+              memcmp(fs_devices->metadata_uuid, fsid, BTRFS_FSID_SIZE) == 0;
+}
+
 static struct btrfs_fs_devices *find_fsid_with_metadata_uuid(
                                struct btrfs_super_block *disk_super)
 {
@@ -485,13 +498,11 @@ static struct btrfs_fs_devices *find_fsid_with_metadata_uuid(
         * 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) {
+               if (!fs_devices->fsid_change)
+                       continue;
+
+               if (check_fsid_changed(fs_devices, disk_super->metadata_uuid))
                        return fs_devices;
-               }
        }
 
        return find_fsid(disk_super->fsid, disk_super->metadata_uuid);
@@ -682,18 +693,16 @@ static struct btrfs_fs_devices *find_fsid_inprogress(
        struct btrfs_fs_devices *fs_devices;
 
        list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
-               if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid,
-                          BTRFS_FSID_SIZE) != 0 &&
-                   memcmp(fs_devices->metadata_uuid, disk_super->fsid,
-                          BTRFS_FSID_SIZE) == 0 && !fs_devices->fsid_change) {
+               if (fs_devices->fsid_change)
+                       continue;
+
+               if (check_fsid_changed(fs_devices,  disk_super->fsid))
                        return fs_devices;
-               }
        }
 
        return find_fsid(disk_super->fsid, NULL);
 }
 
-
 static struct btrfs_fs_devices *find_fsid_changed(
                                        struct btrfs_super_block *disk_super)
 {
@@ -710,10 +719,7 @@ static struct btrfs_fs_devices *find_fsid_changed(
         */
        list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
                /* Changed UUIDs */
-               if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid,
-                          BTRFS_FSID_SIZE) != 0 &&
-                   memcmp(fs_devices->metadata_uuid, disk_super->metadata_uuid,
-                          BTRFS_FSID_SIZE) == 0 &&
+               if (check_fsid_changed(fs_devices, disk_super->metadata_uuid) &&
                    memcmp(fs_devices->fsid, disk_super->fsid,
                           BTRFS_FSID_SIZE) != 0)
                        return fs_devices;
@@ -744,11 +750,10 @@ static struct btrfs_fs_devices *find_fsid_reverted_metadata(
         * fs_devices equal to the FSID of the disk.
         */
        list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
-               if (memcmp(fs_devices->fsid, fs_devices->metadata_uuid,
-                          BTRFS_FSID_SIZE) != 0 &&
-                   memcmp(fs_devices->metadata_uuid, disk_super->fsid,
-                          BTRFS_FSID_SIZE) == 0 &&
-                   fs_devices->fsid_change)
+               if (!fs_devices->fsid_change)
+                       continue;
+
+               if (check_fsid_changed(fs_devices, disk_super->fsid))
                        return fs_devices;
        }