mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-26 23:43:09 +00:00
Fill missing devices so degraded filesystems can be read
When a device is missing, the btrfs tools need to be able to read alternate copies from the remaining devices. This creates placeholder devices that always return -EIO so the tools can limp along. Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
375714fe11
commit
7cd060deea
@ -204,6 +204,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,
|
||||
eb->dev_bytenr = multi->stripes[0].physical;
|
||||
kfree(multi);
|
||||
ret = read_extent_from_disk(eb);
|
||||
|
||||
if (ret == 0 && check_tree_block(root, eb) == 0 &&
|
||||
csum_tree_block(root, eb, 1) == 0 &&
|
||||
verify_parent_transid(eb->tree, eb, parent_transid) == 0) {
|
||||
|
15
volumes.c
15
volumes.c
@ -1159,6 +1159,16 @@ int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset)
|
||||
return readonly;
|
||||
}
|
||||
|
||||
static struct btrfs_device *fill_missing_device(u64 devid)
|
||||
{
|
||||
struct btrfs_device *device;
|
||||
|
||||
device = kzalloc(sizeof(*device), GFP_NOFS);
|
||||
device->devid = devid;
|
||||
device->fd = -1;
|
||||
return device;
|
||||
}
|
||||
|
||||
static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
|
||||
struct extent_buffer *leaf,
|
||||
struct btrfs_chunk *chunk)
|
||||
@ -1209,8 +1219,9 @@ static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
|
||||
map->stripes[i].dev = btrfs_find_device(root, devid, uuid,
|
||||
NULL);
|
||||
if (!map->stripes[i].dev) {
|
||||
kfree(map);
|
||||
return -EIO;
|
||||
map->stripes[i].dev = fill_missing_device(devid);
|
||||
printf("warning, device %llu is missing\n",
|
||||
(unsigned long long)devid);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user