btrfs: move missing device handling in a dedicate function
[sfrench/cifs-2.6.git] / fs / btrfs / volumes.c
index b07d382d53a867c19e84f35d59377bfabc23826d..76b6957c619be2d7e27fe86c0e1dea99ed768a93 100644 (file)
@@ -7060,6 +7060,27 @@ static void warn_32bit_meta_chunk(struct btrfs_fs_info *fs_info,
 }
 #endif
 
+static struct btrfs_device *handle_missing_device(struct btrfs_fs_info *fs_info,
+                                                 u64 devid, u8 *uuid)
+{
+       struct btrfs_device *dev;
+
+       if (!btrfs_test_opt(fs_info, DEGRADED)) {
+               btrfs_report_missing_device(fs_info, devid, uuid, true);
+               return ERR_PTR(-ENOENT);
+       }
+
+       dev = add_missing_dev(fs_info->fs_devices, devid, uuid);
+       if (IS_ERR(dev)) {
+               btrfs_err(fs_info, "failed to init missing device %llu: %ld",
+                         devid, PTR_ERR(dev));
+               return dev;
+       }
+       btrfs_report_missing_device(fs_info, devid, uuid, false);
+
+       return dev;
+}
+
 static int read_one_chunk(struct btrfs_key *key, struct extent_buffer *leaf,
                          struct btrfs_chunk *chunk)
 {
@@ -7147,28 +7168,17 @@ static int read_one_chunk(struct btrfs_key *key, struct extent_buffer *leaf,
                                   BTRFS_UUID_SIZE);
                args.uuid = uuid;
                map->stripes[i].dev = btrfs_find_device(fs_info->fs_devices, &args);
-               if (!map->stripes[i].dev &&
-                   !btrfs_test_opt(fs_info, DEGRADED)) {
-                       free_extent_map(em);
-                       btrfs_report_missing_device(fs_info, devid, uuid, true);
-                       return -ENOENT;
-               }
                if (!map->stripes[i].dev) {
-                       map->stripes[i].dev =
-                               add_missing_dev(fs_info->fs_devices, devid,
-                                               uuid);
+                       map->stripes[i].dev = handle_missing_device(fs_info,
+                                                                   devid, uuid);
                        if (IS_ERR(map->stripes[i].dev)) {
                                free_extent_map(em);
-                               btrfs_err(fs_info,
-                                       "failed to init missing dev %llu: %ld",
-                                       devid, PTR_ERR(map->stripes[i].dev));
                                return PTR_ERR(map->stripes[i].dev);
                        }
-                       btrfs_report_missing_device(fs_info, devid, uuid, false);
                }
+
                set_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
                                &(map->stripes[i].dev->dev_state));
-
        }
 
        write_lock(&map_tree->lock);