pass an extra open|create enum to metadata ctr

This commit is contained in:
Joe Thornber 2011-10-28 14:26:06 +01:00
parent 8f9d71ccc8
commit 076131aac1
5 changed files with 19 additions and 7 deletions

View File

@ -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)), : tm_(open_tm(dev_path)),
sb_(read_superblock(tm_->get_bm())), sb_(read_superblock(tm_->get_bm())),
metadata_sm_(open_metadata_sm(tm_, static_cast<void *>(&sb_.metadata_space_map_root_))), metadata_sm_(open_metadata_sm(tm_, static_cast<void *>(&sb_.metadata_space_map_root_))),
@ -107,6 +107,8 @@ metadata::commit()
sb_.data_mapping_root_ = mappings_.get_root(); sb_.data_mapping_root_ = mappings_.get_root();
sb_.device_details_root_ = details_.get_root(); sb_.device_details_root_ = details_.get_root();
// FIXME: copy the space map roots
write_ref superblock = tm_->get_bm()->superblock(SUPERBLOCK_LOCATION); write_ref superblock = tm_->get_bm()->superblock(SUPERBLOCK_LOCATION);
superblock_disk *disk = reinterpret_cast<superblock_disk *>(superblock.data()); superblock_disk *disk = reinterpret_cast<superblock_disk *>(superblock.data());
superblock_traits::pack(sb_, *disk); superblock_traits::pack(sb_, *disk);

View File

@ -124,7 +124,12 @@ namespace thin_provisioning {
// implementation of metadata. Implement more specific interfaces // implementation of metadata. Implement more specific interfaces
// on top of this. // on top of this.
struct metadata { struct metadata {
metadata(std::string const &dev_path); enum open_type {
CREATE,
OPEN
};
metadata(std::string const &dev_path, open_type ot);
void commit(); void commit();

View File

@ -17,7 +17,7 @@ namespace po = boost::program_options;
namespace { namespace {
void dump(string const &path, string const &format) { 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; emitter::ptr e;
if (format == "xml") if (format == "xml")

View File

@ -10,7 +10,7 @@ using namespace thin_provisioning;
namespace { namespace {
int check(string const &path) { int check(string const &path) {
metadata::ptr md(new metadata(path)); metadata::ptr md(new metadata(path, metadata::OPEN));
optional<error_set::ptr> maybe_errors = metadata_check(md); optional<error_set::ptr> maybe_errors = metadata_check(md);
if (maybe_errors) { if (maybe_errors) {

View File

@ -18,11 +18,16 @@ namespace po = boost::program_options;
namespace { namespace {
void restore(string const &backup_file, string const &dev) { 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); emitter::ptr restorer = create_restore_emitter(md);
ifstream in(backup_file.c_str(), ifstream::in); ifstream in(backup_file.c_str(), ifstream::in);
parse_xml(in, restorer); try {
in.close(); parse_xml(in, restorer);
} catch (...) {
in.close();
throw;
}
} }
void usage(po::options_description const &desc) { void usage(po::options_description const &desc) {