From 076131aac121f4f130401f3237563d6a57a88241 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Fri, 28 Oct 2011 14:26:06 +0100 Subject: [PATCH] pass an extra open|create enum to metadata ctr --- metadata.cc | 4 +++- metadata.h | 7 ++++++- thin_dump.cc | 2 +- thin_repair.cc | 2 +- thin_restore.cc | 11 ++++++++--- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/metadata.cc b/metadata.cc index 54be060..4ddf14e 100644 --- a/metadata.cc +++ b/metadata.cc @@ -82,7 +82,7 @@ namespace { //---------------------------------------------------------------- -metadata::metadata(std::string const &dev_path) +metadata::metadata(std::string const &dev_path, open_type ot) : tm_(open_tm(dev_path)), sb_(read_superblock(tm_->get_bm())), metadata_sm_(open_metadata_sm(tm_, static_cast(&sb_.metadata_space_map_root_))), @@ -107,6 +107,8 @@ metadata::commit() sb_.data_mapping_root_ = mappings_.get_root(); sb_.device_details_root_ = details_.get_root(); + // FIXME: copy the space map roots + write_ref superblock = tm_->get_bm()->superblock(SUPERBLOCK_LOCATION); superblock_disk *disk = reinterpret_cast(superblock.data()); superblock_traits::pack(sb_, *disk); diff --git a/metadata.h b/metadata.h index 494b7d2..39329d7 100644 --- a/metadata.h +++ b/metadata.h @@ -124,7 +124,12 @@ namespace thin_provisioning { // implementation of metadata. Implement more specific interfaces // on top of this. struct metadata { - metadata(std::string const &dev_path); + enum open_type { + CREATE, + OPEN + }; + + metadata(std::string const &dev_path, open_type ot); void commit(); diff --git a/thin_dump.cc b/thin_dump.cc index da89043..d9373e0 100644 --- a/thin_dump.cc +++ b/thin_dump.cc @@ -17,7 +17,7 @@ namespace po = boost::program_options; namespace { void dump(string const &path, string const &format) { - metadata::ptr md(new metadata(path)); + metadata::ptr md(new metadata(path, metadata::OPEN)); emitter::ptr e; if (format == "xml") diff --git a/thin_repair.cc b/thin_repair.cc index 29abf4e..6e99b83 100644 --- a/thin_repair.cc +++ b/thin_repair.cc @@ -10,7 +10,7 @@ using namespace thin_provisioning; namespace { int check(string const &path) { - metadata::ptr md(new metadata(path)); + metadata::ptr md(new metadata(path, metadata::OPEN)); optional maybe_errors = metadata_check(md); if (maybe_errors) { diff --git a/thin_restore.cc b/thin_restore.cc index 43e7b05..21250dc 100644 --- a/thin_restore.cc +++ b/thin_restore.cc @@ -18,11 +18,16 @@ namespace po = boost::program_options; namespace { void restore(string const &backup_file, string const &dev) { - metadata::ptr md(new metadata(dev)); + metadata::ptr md(new metadata(dev, metadata::CREATE)); emitter::ptr restorer = create_restore_emitter(md); ifstream in(backup_file.c_str(), ifstream::in); - parse_xml(in, restorer); - in.close(); + try { + parse_xml(in, restorer); + + } catch (...) { + in.close(); + throw; + } } void usage(po::options_description const &desc) {