Btrfs-progs: Introduce metadump_v2

The METADUMP super flag makes us skip doing the chunk tree reading which isn't
helpful for the new restore since we have a valid chunk tree.  But we still want
to have a way for the kernel to know that this is a metadump restore so it
doesn't do things like verify data checksums.  We also want to skip some of the
device extent checks in fsck since those will obviously not match.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fb.com>
This commit is contained in:
Josef Bacik 2015-02-06 13:03:12 -05:00
parent c7e3b63b7e
commit 797a937e5d
3 changed files with 11 additions and 2 deletions

View File

@ -1455,6 +1455,7 @@ static int update_super(struct mdrestore_struct *mdres, u8 *buffer)
struct btrfs_chunk *chunk; struct btrfs_chunk *chunk;
struct btrfs_disk_key *disk_key; struct btrfs_disk_key *disk_key;
struct btrfs_key key; struct btrfs_key key;
u64 flags = btrfs_super_flags(super);
u32 new_array_size = 0; u32 new_array_size = 0;
u32 array_size; u32 array_size;
u32 cur = 0; u32 cur = 0;
@ -1510,6 +1511,8 @@ static int update_super(struct mdrestore_struct *mdres, u8 *buffer)
if (mdres->clear_space_cache) if (mdres->clear_space_cache)
btrfs_set_super_cache_generation(super, 0); btrfs_set_super_cache_generation(super, 0);
flags |= BTRFS_SUPER_FLAG_METADUMP_V2;
btrfs_set_super_flags(super, flags);
btrfs_set_super_sys_array_size(super, new_array_size); btrfs_set_super_sys_array_size(super, new_array_size);
csum_block(buffer, BTRFS_SUPER_INFO_SIZE); csum_block(buffer, BTRFS_SUPER_INFO_SIZE);

View File

@ -7426,6 +7426,7 @@ static int check_chunk_refs(struct chunk_record *chunk_rec,
u64 devid; u64 devid;
u64 offset; u64 offset;
u64 length; u64 length;
int metadump_v2 = 0;
int i; int i;
int ret = 0; int ret = 0;
@ -7438,7 +7439,8 @@ static int check_chunk_refs(struct chunk_record *chunk_rec,
cache); cache);
if (chunk_rec->length != block_group_rec->offset || if (chunk_rec->length != block_group_rec->offset ||
chunk_rec->offset != block_group_rec->objectid || chunk_rec->offset != block_group_rec->objectid ||
chunk_rec->type_flags != block_group_rec->flags) { (!metadump_v2 &&
chunk_rec->type_flags != block_group_rec->flags)) {
if (!silent) if (!silent)
fprintf(stderr, fprintf(stderr,
"Chunk[%llu, %u, %llu]: length(%llu), offset(%llu), type(%llu) mismatch with block group[%llu, %u, %llu]: offset(%llu), objectid(%llu), flags(%llu)\n", "Chunk[%llu, %u, %llu]: length(%llu), offset(%llu), type(%llu) mismatch with block group[%llu, %u, %llu]: offset(%llu), objectid(%llu), flags(%llu)\n",
@ -7472,6 +7474,9 @@ static int check_chunk_refs(struct chunk_record *chunk_rec,
ret = 1; ret = 1;
} }
if (metadump_v2)
return ret;
length = calc_stripe_length(chunk_rec->type_flags, chunk_rec->length, length = calc_stripe_length(chunk_rec->type_flags, chunk_rec->length,
chunk_rec->num_stripes); chunk_rec->num_stripes);
for (i = 0; i < chunk_rec->num_stripes; ++i) { for (i = 0; i < chunk_rec->num_stripes; ++i) {
@ -7538,7 +7543,7 @@ int check_chunks(struct cache_tree *chunk_cache,
cache); cache);
err = check_chunk_refs(chunk_rec, block_group_cache, err = check_chunk_refs(chunk_rec, block_group_cache,
dev_extent_cache, silent); dev_extent_cache, silent);
if (err) if (err < 0)
ret = err; ret = err;
if (err == 0 && good) if (err == 0 && good)
list_add_tail(&chunk_rec->list, good); list_add_tail(&chunk_rec->list, good);

View File

@ -309,6 +309,7 @@ static inline unsigned long btrfs_chunk_item_size(int num_stripes)
#define BTRFS_HEADER_FLAG_RELOC (1ULL << 1) #define BTRFS_HEADER_FLAG_RELOC (1ULL << 1)
#define BTRFS_SUPER_FLAG_SEEDING (1ULL << 32) #define BTRFS_SUPER_FLAG_SEEDING (1ULL << 32)
#define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33) #define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33)
#define BTRFS_SUPER_FLAG_METADUMP_V2 (1ULL << 34)
#define BTRFS_BACKREF_REV_MAX 256 #define BTRFS_BACKREF_REV_MAX 256
#define BTRFS_BACKREF_REV_SHIFT 56 #define BTRFS_BACKREF_REV_SHIFT 56