|
@@ -6492,6 +6492,7 @@ static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
|
|
|
if (!map->stripes[i].dev &&
|
|
|
!btrfs_test_opt(fs_info, DEGRADED)) {
|
|
|
free_extent_map(em);
|
|
|
+ btrfs_report_missing_device(fs_info, devid, uuid);
|
|
|
return -EIO;
|
|
|
}
|
|
|
if (!map->stripes[i].dev) {
|
|
@@ -6502,8 +6503,7 @@ static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
|
|
|
free_extent_map(em);
|
|
|
return -EIO;
|
|
|
}
|
|
|
- btrfs_warn(fs_info, "devid %llu uuid %pU is missing",
|
|
|
- devid, uuid);
|
|
|
+ btrfs_report_missing_device(fs_info, devid, uuid);
|
|
|
}
|
|
|
map->stripes[i].dev->in_fs_metadata = 1;
|
|
|
}
|
|
@@ -6620,17 +6620,21 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
|
|
|
|
|
|
device = btrfs_find_device(fs_info, devid, dev_uuid, fs_uuid);
|
|
|
if (!device) {
|
|
|
- if (!btrfs_test_opt(fs_info, DEGRADED))
|
|
|
+ if (!btrfs_test_opt(fs_info, DEGRADED)) {
|
|
|
+ btrfs_report_missing_device(fs_info, devid, dev_uuid);
|
|
|
return -EIO;
|
|
|
+ }
|
|
|
|
|
|
device = add_missing_dev(fs_devices, devid, dev_uuid);
|
|
|
if (!device)
|
|
|
return -ENOMEM;
|
|
|
- btrfs_warn(fs_info, "devid %llu uuid %pU missing",
|
|
|
- devid, dev_uuid);
|
|
|
+ btrfs_report_missing_device(fs_info, devid, dev_uuid);
|
|
|
} else {
|
|
|
- if (!device->bdev && !btrfs_test_opt(fs_info, DEGRADED))
|
|
|
- return -EIO;
|
|
|
+ if (!device->bdev) {
|
|
|
+ btrfs_report_missing_device(fs_info, devid, dev_uuid);
|
|
|
+ if (!btrfs_test_opt(fs_info, DEGRADED))
|
|
|
+ return -EIO;
|
|
|
+ }
|
|
|
|
|
|
if(!device->bdev && !device->missing) {
|
|
|
/*
|
|
@@ -6796,6 +6800,12 @@ out_short_read:
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
+void btrfs_report_missing_device(struct btrfs_fs_info *fs_info, u64 devid,
|
|
|
+ u8 *uuid)
|
|
|
+{
|
|
|
+ btrfs_warn_rl(fs_info, "devid %llu uuid %pU is missing", devid, uuid);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Check if all chunks in the fs are OK for read-write degraded mount
|
|
|
*
|