From 2815aeace9df510814c2e5d78b3a2ef398440501 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Tue, 16 Feb 2016 14:08:43 +0000 Subject: [PATCH] [thin_repair] fix regression in thin_repair When opening the corrupted metadata we don't need to touch the space maps. This used to be achieved by pretending we were opening a metadata snap at block 0 (superblock location). But got changed in the recent rationalisation of the metadata constructors. This patch introduces a bool to the metadata OPEN constructor that says whether the space maps are needed or not. --- thin-provisioning/metadata.cc | 6 ++++-- thin-provisioning/metadata.h | 2 +- thin-provisioning/thin_repair.cc | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/thin-provisioning/metadata.cc b/thin-provisioning/metadata.cc index 723a813..77e0428 100644 --- a/thin-provisioning/metadata.cc +++ b/thin-provisioning/metadata.cc @@ -112,12 +112,14 @@ metadata::metadata(block_manager<>::ptr bm, open_type ot, } } -metadata::metadata(block_manager<>::ptr bm) +metadata::metadata(block_manager<>::ptr bm, bool read_space_maps) { tm_ = open_tm(bm); sb_ = read_superblock(tm_->get_bm(), SUPERBLOCK_LOCATION); - open_space_maps(); + if (read_space_maps) + open_space_maps(); + open_btrees(); } diff --git a/thin-provisioning/metadata.h b/thin-provisioning/metadata.h index d020542..0af2e38 100644 --- a/thin-provisioning/metadata.h +++ b/thin-provisioning/metadata.h @@ -74,7 +74,7 @@ namespace thin_provisioning { // ii) Read the metadata snap as given in the superblock // iii) Read the metadata snap given on command line, checking it matches superblock. // - metadata(block_manager<>::ptr bm); // (i) + metadata(block_manager<>::ptr bm, bool read_space_maps = true); // (i) metadata(block_manager<>::ptr, boost::optional metadata_snap); // (ii) and (iii) diff --git a/thin-provisioning/thin_repair.cc b/thin-provisioning/thin_repair.cc index abae4ca..194f431 100644 --- a/thin-provisioning/thin_repair.cc +++ b/thin-provisioning/thin_repair.cc @@ -23,7 +23,7 @@ namespace { emitter::ptr e = create_restore_emitter(new_md); block_manager<>::ptr old_bm = open_bm(old_path, block_manager<>::READ_ONLY); - metadata::ptr old_md(new metadata(old_bm)); + metadata::ptr old_md(new metadata(old_bm, false)); // we don't need to read the space maps metadata_dump(old_md, e, true); } catch (std::exception &e) {