From 550b8ca35a73eebfa0b2b1bde9f596c44745addc Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Thu, 25 Aug 2011 16:10:03 +0100 Subject: [PATCH] make sure we take the metadata bitmaps into account for the reference counting --- metadata.cc | 1 + metadata.h | 2 +- space_map_disk.h | 11 ++++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/metadata.cc b/metadata.cc index c27502a..82ac2d7 100644 --- a/metadata.cc +++ b/metadata.cc @@ -375,6 +375,7 @@ metadata::check() throw runtime_error(out.str()); } + metadata_sm_->check(metadata_counter); data_sm_->check(metadata_counter); errors->add_child(check_ref_counts("Errors in metadata block reference counts", metadata_counter, metadata_sm_)); diff --git a/metadata.h b/metadata.h index 51c5b9d..3c164f2 100644 --- a/metadata.h +++ b/metadata.h @@ -192,7 +192,7 @@ namespace thin_provisioning { tm_ptr tm_; superblock sb_; - space_map::ptr metadata_sm_; + sm_disk_detail::sm_metadata::ptr metadata_sm_; sm_disk_detail::sm_disk::ptr data_sm_; detail_tree details_; dev_tree mappings_top_level_; diff --git a/space_map_disk.h b/space_map_disk.h index a5f3648..c314e80 100644 --- a/space_map_disk.h +++ b/space_map_disk.h @@ -407,6 +407,13 @@ namespace persistent_data { ::memcpy(dest, &d, sizeof(d)); } + void check(block_counter &counter) { + counter.inc(bitmap_root_); + + for (unsigned i = 0; i < entries_.size(); i++) + counter.inc(entries_[i].blocknr_); + } + private: index_entry find_ie(block_address ie_index) const { return entries_[ie_index]; @@ -422,7 +429,9 @@ namespace persistent_data { metadata_index const *mdi = reinterpret_cast(&rr.data()); - for (unsigned i = 0; i < MAX_METADATA_BITMAPS; i++) + unsigned nr_indexes = div_up(sm_disk_base::get_nr_blocks(), + sm_disk_base::get_entries_per_block()); + for (unsigned i = 0; i < nr_indexes; i++) index_entry_traits::unpack(*(mdi->index + i), entries_[i]); }