]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
btrfs: Factor out metadata_uuid code from find_fsid.
authorSu Yue <Damenly_Su@gmx.com>
Fri, 10 Jan 2020 12:11:33 +0000 (14:11 +0200)
committerDavid Sterba <dsterba@suse.com>
Thu, 23 Jan 2020 16:24:38 +0000 (17:24 +0100)
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>
fs/btrfs/volumes.c

index d9957688338bc207d3cd99c027630e181758b410..d48274451452fa67c84b49190b249e264d68a6c5 100644 (file)
@@ -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);
        }