diff options
Diffstat (limited to 'chunk-recover.c')
-rw-r--r-- | chunk-recover.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/chunk-recover.c b/chunk-recover.c index 1d30db51..f3e7774e 100644 --- a/chunk-recover.c +++ b/chunk-recover.c @@ -40,6 +40,7 @@ #include "utils.h" #include "btrfsck.h" #include "commands.h" +#include "rescue.h" struct recover_control { int verbose; @@ -759,7 +760,7 @@ static int scan_one_device(void *dev_scan_struct) rc->nodesize) break; - if (memcmp_extent_buffer(buf, rc->fs_devices->fsid, + if (memcmp_extent_buffer(buf, rc->fs_devices->metadata_uuid, btrfs_header_fsid(), BTRFS_FSID_SIZE)) { bytenr += rc->sectorsize; @@ -1155,7 +1156,7 @@ static int __rebuild_chunk_root(struct btrfs_trans_handle *trans, btrfs_set_header_level(cow, 0); btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV); btrfs_set_header_owner(cow, BTRFS_CHUNK_TREE_OBJECTID); - write_extent_buffer(cow, root->fs_info->fsid, + write_extent_buffer(cow, root->fs_info->fs_devices->metadata_uuid, btrfs_header_fsid(), BTRFS_FSID_SIZE); write_extent_buffer(cow, root->fs_info->chunk_tree_uuid, @@ -1192,7 +1193,8 @@ static int __rebuild_device_items(struct btrfs_trans_handle *trans, btrfs_set_stack_device_io_width(dev_item, dev->io_width); btrfs_set_stack_device_sector_size(dev_item, dev->sector_size); memcpy(dev_item->uuid, dev->uuid, BTRFS_UUID_SIZE); - memcpy(dev_item->fsid, dev->fs_devices->fsid, BTRFS_UUID_SIZE); + memcpy(dev_item->fsid, dev->fs_devices->metadata_uuid, + BTRFS_FSID_SIZE); ret = btrfs_insert_item(trans, root, &key, dev_item, sizeof(*dev_item)); @@ -1432,6 +1434,7 @@ open_ctree_with_broken_chunk(struct recover_control *rc) struct btrfs_fs_info *fs_info; struct btrfs_super_block *disk_super; struct extent_buffer *eb; + u64 features; int ret; fs_info = btrfs_new_fs_info(1, BTRFS_SUPER_INFO_OFFSET); @@ -1455,7 +1458,7 @@ open_ctree_with_broken_chunk(struct recover_control *rc) goto out_devices; } - memcpy(fs_info->fsid, &disk_super->fsid, BTRFS_FSID_SIZE); + ASSERT(!memcmp(disk_super->fsid, rc->fs_devices->fsid, BTRFS_FSID_SIZE)); fs_info->sectorsize = btrfs_super_sectorsize(disk_super); fs_info->nodesize = btrfs_super_nodesize(disk_super); fs_info->stripesize = btrfs_super_stripesize(disk_super); @@ -1464,6 +1467,13 @@ open_ctree_with_broken_chunk(struct recover_control *rc) if (ret) goto out_devices; + features = btrfs_super_incompat_flags(disk_super); + + if (features & BTRFS_FEATURE_INCOMPAT_METADATA_UUID) + ASSERT(!memcmp(disk_super->metadata_uuid, + fs_info->fs_devices->metadata_uuid, + BTRFS_FSID_SIZE)); + btrfs_setup_root(fs_info->chunk_root, fs_info, BTRFS_CHUNK_TREE_OBJECTID); |