btrfs: factor out loop logic from btrfs_free_extra_devids
authorNikolay Borisov <nborisov@suse.com>
Thu, 16 Jul 2020 07:17:04 +0000 (10:17 +0300)
committerDavid Sterba <dsterba@suse.com>
Wed, 7 Oct 2020 10:06:57 +0000 (12:06 +0200)
This prepares the code to switching seeds devices to a proper list.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/volumes.c

index a028a64b4add7f6b0fcb31b67b5dededbe9c82ed..309b575613fe0797dba14dd373d85d4b9a96c30a 100644 (file)
@@ -1036,28 +1036,21 @@ error:
        return ERR_PTR(ret);
 }
 
-/*
- * After we have read the system tree and know devids belonging to
- * this filesystem, remove the device which does not belong there.
- */
-void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, int step)
+static void __btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices,
+                                     int step, struct btrfs_device **latest_dev)
 {
        struct btrfs_device *device, *next;
-       struct btrfs_device *latest_dev = NULL;
 
-       mutex_lock(&uuid_mutex);
-again:
        /* This is the initialized path, it is safe to release the devices. */
        list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) {
-               if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
-                                                       &device->dev_state)) {
+               if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state)) {
                        if (!test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
-                            &device->dev_state) &&
+                                     &device->dev_state) &&
                            !test_bit(BTRFS_DEV_STATE_MISSING,
                                      &device->dev_state) &&
-                            (!latest_dev ||
-                             device->generation > latest_dev->generation)) {
-                               latest_dev = device;
+                           (!*latest_dev ||
+                            device->generation > (*latest_dev)->generation)) {
+                               *latest_dev = device;
                        }
                        continue;
                }
@@ -1095,6 +1088,19 @@ again:
                btrfs_free_device(device);
        }
 
+}
+
+/*
+ * After we have read the system tree and know devids belonging to this
+ * filesystem, remove the device which does not belong there.
+ */
+void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, int step)
+{
+       struct btrfs_device *latest_dev = NULL;
+
+       mutex_lock(&uuid_mutex);
+again:
+       __btrfs_free_extra_devids(fs_devices, step, &latest_dev);
        if (fs_devices->seed) {
                fs_devices = fs_devices->seed;
                goto again;