superblock_checker.* -> superblock.*, remove metadata_disk_structures.* and rearrange namespaces a bit.

This commit is contained in:
Joe Thornber 2013-05-21 12:46:07 +01:00
parent 4e61578508
commit 553f73b826
14 changed files with 188 additions and 223 deletions

View File

@ -54,10 +54,9 @@ SOURCE=\
thin-provisioning/mapping_tree.cc \ thin-provisioning/mapping_tree.cc \
thin-provisioning/metadata.cc \ thin-provisioning/metadata.cc \
thin-provisioning/metadata_checker.cc \ thin-provisioning/metadata_checker.cc \
thin-provisioning/metadata_disk_structures.cc \
thin-provisioning/metadata_dumper.cc \ thin-provisioning/metadata_dumper.cc \
thin-provisioning/restore_emitter.cc \ thin-provisioning/restore_emitter.cc \
thin-provisioning/superblock_checker.cc \ thin-provisioning/superblock.cc \
thin-provisioning/superblock_validator.cc \ thin-provisioning/superblock_validator.cc \
thin-provisioning/thin_pool.cc \ thin-provisioning/thin_pool.cc \
thin-provisioning/xml_format.cc thin-provisioning/xml_format.cc
@ -139,8 +138,7 @@ THIN_CHECK_SOURCE=\
thin-provisioning/file_utils.cc \ thin-provisioning/file_utils.cc \
thin-provisioning/metadata.cc \ thin-provisioning/metadata.cc \
thin-provisioning/metadata_checker.cc \ thin-provisioning/metadata_checker.cc \
thin-provisioning/metadata_disk_structures.cc \ thin-provisioning/superblock.cc \
thin-provisioning/superblock_checker.cc \
thin-provisioning/superblock_validator.cc thin-provisioning/superblock_validator.cc
THIN_DEBUG_OBJECTS=$(subst .cc,.o,$(THIN_DEBUG_SOURCE)) THIN_DEBUG_OBJECTS=$(subst .cc,.o,$(THIN_DEBUG_SOURCE))

View File

@ -19,6 +19,8 @@
#ifndef REF_COUNTER_H #ifndef REF_COUNTER_H
#define REF_COUNTER_H #define REF_COUNTER_H
#include <boost/shared_ptr.hpp>
//---------------------------------------------------------------- //----------------------------------------------------------------
namespace persistent_data { namespace persistent_data {

View File

@ -37,6 +37,8 @@ using namespace thin_provisioning;
//---------------------------------------------------------------- //----------------------------------------------------------------
namespace { namespace {
using namespace superblock_detail;
unsigned const METADATA_CACHE_SIZE = 1024; unsigned const METADATA_CACHE_SIZE = 1024;
block_manager<>::ptr open_bm(string const &dev_path, bool writeable) { block_manager<>::ptr open_bm(string const &dev_path, bool writeable) {

View File

@ -25,9 +25,9 @@
#include "persistent-data/space-maps/disk.h" #include "persistent-data/space-maps/disk.h"
#include "persistent-data/transaction_manager.h" #include "persistent-data/transaction_manager.h"
#include "thin-provisioning/metadata_disk_structures.h"
#include "thin-provisioning/device_tree.h" #include "thin-provisioning/device_tree.h"
#include "thin-provisioning/mapping_tree.h" #include "thin-provisioning/mapping_tree.h"
#include "thin-provisioning/superblock.h"
//---------------------------------------------------------------- //----------------------------------------------------------------
@ -77,7 +77,7 @@ namespace thin_provisioning {
tm_ptr tm_; tm_ptr tm_;
superblock sb_; superblock_detail::superblock sb_;
checked_space_map::ptr metadata_sm_; checked_space_map::ptr metadata_sm_;
checked_space_map::ptr data_sm_; checked_space_map::ptr data_sm_;

View File

@ -25,7 +25,7 @@ using namespace persistent_data;
using namespace thin_provisioning; using namespace thin_provisioning;
//---------------------------------------------------------------- //----------------------------------------------------------------
#if 0
void void
metadata_damage::set_message(std::string const &message) metadata_damage::set_message(std::string const &message)
{ {
@ -436,3 +436,4 @@ thin_provisioning::metadata_check(std::string const &dev_path)
//---------------------------------------------------------------- //----------------------------------------------------------------
#endif #endif
#endif

View File

@ -29,7 +29,18 @@
//---------------------------------------------------------------- //----------------------------------------------------------------
namespace thin_provisioning { namespace thin_provisioning {
class metadata_damage_visitor; // FIXME: should take a block manager or transaction manager
void check_metadata(std::string const &path);
#if 0
// Base class for all types of metadata damage. Used in reporting. // Base class for all types of metadata damage. Used in reporting.
class metadata_damage { class metadata_damage {
@ -143,22 +154,7 @@ namespace thin_provisioning {
typedef std::deque<metadata_damage::ptr> damage_list; typedef std::deque<metadata_damage::ptr> damage_list;
typedef boost::shared_ptr<damage_list> damage_list_ptr; typedef boost::shared_ptr<damage_list> damage_list_ptr;
#endif
//--------------------------------
class checker {
public:
typedef persistent_data::block_manager<> block_manager;
typedef boost::shared_ptr<checker> ptr;
checker(block_manager::ptr bm);
virtual ~checker() {};
virtual damage_list_ptr check() = 0;
protected:
block_manager::ptr bm_;
};
} }
//---------------------------------------------------------------- //----------------------------------------------------------------

View File

@ -1,114 +0,0 @@
// Copyright (C) 2011 Red Hat, Inc. All rights reserved.
//
// This file is part of the thin-provisioning-tools source.
//
// thin-provisioning-tools is free software: you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// thin-provisioning-tools is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with thin-provisioning-tools. If not, see
// <http://www.gnu.org/licenses/>.
#ifndef METADATA_DISK_STRUCTURES_H
#define METADATA_DISK_STRUCTURES_H
#include "persistent-data/endian_utils.h"
#include "persistent-data/data-structures/btree.h"
//----------------------------------------------------------------
namespace thin_provisioning {
using namespace base; // FIXME: don't use namespaces in headers.
unsigned const SPACE_MAP_ROOT_SIZE = 128;
typedef unsigned char __u8;
struct superblock_disk {
le32 csum_;
le32 flags_;
le64 blocknr_;
__u8 uuid_[16];
le64 magic_;
le32 version_;
le32 time_;
le64 trans_id_;
/* root for userspace's transaction (for migration and friends) */
le64 metadata_snap_;
__u8 data_space_map_root_[SPACE_MAP_ROOT_SIZE];
__u8 metadata_space_map_root_[SPACE_MAP_ROOT_SIZE];
/* 2 level btree mapping (dev_id, (dev block, time)) -> data block */
le64 data_mapping_root_;
/* device detail root mapping dev_id -> device_details */
le64 device_details_root_;
le32 data_block_size_; /* in 512-byte sectors */
le32 metadata_block_size_; /* in 512-byte sectors */
le64 metadata_nr_blocks_;
le32 compat_flags_;
le32 compat_ro_flags_;
le32 incompat_flags_;
} __attribute__ ((packed));
struct superblock {
uint32_t csum_;
uint32_t flags_;
uint64_t blocknr_;
unsigned char uuid_[16];
uint64_t magic_;
uint32_t version_;
uint32_t time_;
uint64_t trans_id_;
/* root for userspace's transaction (for migration and friends) */
uint64_t metadata_snap_;
unsigned char data_space_map_root_[SPACE_MAP_ROOT_SIZE];
unsigned char metadata_space_map_root_[SPACE_MAP_ROOT_SIZE];
/* 2 level btree mapping (dev_id, (dev block, time)) -> data block */
uint64_t data_mapping_root_;
/* device detail root mapping dev_id -> device_details */
uint64_t device_details_root_;
uint32_t data_block_size_; /* in 512-byte sectors */
uint32_t metadata_block_size_; /* in 512-byte sectors */
uint64_t metadata_nr_blocks_;
uint32_t compat_flags_;
uint32_t compat_ro_flags_;
uint32_t incompat_flags_;
};
struct superblock_traits {
typedef superblock_disk disk_type;
typedef superblock value_type;
typedef no_op_ref_counter<superblock> ref_counter;
static void unpack(superblock_disk const &disk, superblock &core);
static void pack(superblock const &core, superblock_disk &disk);
};
block_address const SUPERBLOCK_LOCATION = 0;
}
//----------------------------------------------------------------
#endif

View File

@ -16,7 +16,8 @@
// with thin-provisioning-tools. If not, see // with thin-provisioning-tools. If not, see
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
#include "restore_emitter.h" #include "thin-provisioning/restore_emitter.h"
#include "thin-provisioning/superblock.h"
using namespace boost; using namespace boost;
using namespace std; using namespace std;
@ -25,6 +26,8 @@ using namespace thin_provisioning;
//---------------------------------------------------------------- //----------------------------------------------------------------
namespace { namespace {
using namespace superblock_detail;
class restorer : public emitter { class restorer : public emitter {
public: public:
restorer(metadata::ptr md) restorer(metadata::ptr md)

View File

@ -1,26 +1,8 @@
// Copyright (C) 2011 Red Hat, Inc. All rights reserved. #include "thin-provisioning/superblock.h"
// #include "thin-provisioning/superblock_validator.h"
// This file is part of the thin-provisioning-tools source.
//
// thin-provisioning-tools is free software: you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// thin-provisioning-tools is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with thin-provisioning-tools. If not, see
// <http://www.gnu.org/licenses/>.
#include "thin-provisioning/metadata_disk_structures.h"
#include <string.h>
using namespace thin_provisioning; using namespace thin_provisioning;
using namespace superblock_detail;
//---------------------------------------------------------------- //----------------------------------------------------------------
@ -91,3 +73,40 @@ superblock_traits::pack(superblock const &value, superblock_disk &disk)
} }
//---------------------------------------------------------------- //----------------------------------------------------------------
#if 0
superblock_checker::superblock_checker(block_manager::ptr bm)
: checker(bm)
{
}
// FIXME: Other things to check:
// - magic
// - version
// - 3 * flags (should be zero)
// - in bounds: metadata_snap, data_mapping_root
// - metadata_nr_blocks_ matches what we've been given.
damage_list_ptr
superblock_checker::check()
{
superblock sb;
damage_list_ptr damage(new damage_list);
try {
block_manager::read_ref r = bm_->read_lock(SUPERBLOCK_LOCATION, superblock_validator());
superblock_disk const *sbd = reinterpret_cast<superblock_disk const *>(&r.data());
superblock_traits::unpack(*sbd, sb);
} catch (checksum_error const &e) {
metadata_damage::ptr err(new super_block_corruption);
err->set_message("checksum error");
damage->push_back(err);
}
return damage;
}
//----------------------------------------------------------------
#endif

View File

@ -0,0 +1,108 @@
#ifndef THIN_SUPERBLOCK_H
#define THIN_SUPERBLOCK_H
#include "persistent-data/block.h"
#include "persistent-data/endian_utils.h"
#include "persistent-data/data-structures/ref_counter.h"
//----------------------------------------------------------------
namespace thin_provisioning {
namespace superblock_detail {
using namespace base;
using namespace persistent_data;
unsigned const SPACE_MAP_ROOT_SIZE = 128;
typedef unsigned char __u8;
struct superblock_disk {
le32 csum_;
le32 flags_;
le64 blocknr_;
__u8 uuid_[16];
le64 magic_;
le32 version_;
le32 time_;
le64 trans_id_;
/* root for userspace's transaction (for migration and friends) */
le64 metadata_snap_;
__u8 data_space_map_root_[SPACE_MAP_ROOT_SIZE];
__u8 metadata_space_map_root_[SPACE_MAP_ROOT_SIZE];
/* 2 level btree mapping (dev_id, (dev block, time)) -> data block */
le64 data_mapping_root_;
/* device detail root mapping dev_id -> device_details */
le64 device_details_root_;
le32 data_block_size_; /* in 512-byte sectors */
le32 metadata_block_size_; /* in 512-byte sectors */
le64 metadata_nr_blocks_;
le32 compat_flags_;
le32 compat_ro_flags_;
le32 incompat_flags_;
} __attribute__ ((packed));
struct superblock {
uint32_t csum_;
uint32_t flags_;
uint64_t blocknr_;
unsigned char uuid_[16];
uint64_t magic_;
uint32_t version_;
uint32_t time_;
uint64_t trans_id_;
/* root for userspace's transaction (for migration and friends) */
uint64_t metadata_snap_;
unsigned char data_space_map_root_[SPACE_MAP_ROOT_SIZE];
unsigned char metadata_space_map_root_[SPACE_MAP_ROOT_SIZE];
/* 2 level btree mapping (dev_id, (dev block, time)) -> data block */
uint64_t data_mapping_root_;
/* device detail root mapping dev_id -> device_details */
uint64_t device_details_root_;
uint32_t data_block_size_; /* in 512-byte sectors */
uint32_t metadata_block_size_; /* in 512-byte sectors */
uint64_t metadata_nr_blocks_;
uint32_t compat_flags_;
uint32_t compat_ro_flags_;
uint32_t incompat_flags_;
};
struct superblock_traits {
typedef superblock_disk disk_type;
typedef superblock value_type;
typedef no_op_ref_counter<superblock> ref_counter;
static void unpack(superblock_disk const &disk, superblock &core);
static void pack(superblock const &core, superblock_disk &disk);
};
block_address const SUPERBLOCK_LOCATION = 0;
}
#if 0
class superblock_checker : public checker {
public:
superblock_checker(block_manager::ptr bm);
damage_list_ptr check();
};
#endif
}
//----------------------------------------------------------------
#endif

View File

@ -1,43 +0,0 @@
#include "thin-provisioning/superblock_checker.h"
#include "thin-provisioning/metadata_disk_structures.h"
#include "thin-provisioning/superblock_validator.h"
using namespace thin_provisioning;
//----------------------------------------------------------------
superblock_checker::superblock_checker(block_manager::ptr bm)
: checker(bm)
{
}
// FIXME: Other things to check:
// - magic
// - version
// - 3 * flags (should be zero)
// - in bounds: metadata_snap, data_mapping_root
// - metadata_nr_blocks_ matches what we've been given.
damage_list_ptr
superblock_checker::check()
{
superblock sb;
damage_list_ptr damage(new damage_list);
try {
block_manager::read_ref r = bm_->read_lock(SUPERBLOCK_LOCATION, superblock_validator());
superblock_disk const *sbd = reinterpret_cast<superblock_disk const *>(&r.data());
superblock_traits::unpack(*sbd, sb);
} catch (checksum_error const &e) {
metadata_damage::ptr err(new super_block_corruption);
err->set_message("checksum error");
damage->push_back(err);
}
return damage;
}
//----------------------------------------------------------------

View File

@ -1,18 +0,0 @@
#ifndef THIN_SUPERBLOCK_CHECKER_H
#define THIN_SUPERBLOCK_CHECKER_H
#include "thin-provisioning/metadata_checker.h"
//----------------------------------------------------------------
namespace thin_provisioning {
class superblock_checker : public checker {
public:
superblock_checker(block_manager::ptr bm);
damage_list_ptr check();
};
}
//----------------------------------------------------------------
#endif

View File

@ -1,12 +1,17 @@
#include "thin-provisioning/superblock_validator.h" #include "persistent-data/checksum.h"
#include "persistent-data/errors.h"
#include "thin-provisioning/metadata_disk_structures.h" #include "thin-provisioning/superblock_validator.h"
#include "thin-provisioning/superblock.h"
using namespace thin_provisioning; using namespace thin_provisioning;
//---------------------------------------------------------------- //----------------------------------------------------------------
namespace { namespace {
using namespace persistent_data;
using namespace superblock_detail;
uint32_t const VERSION = 1; uint32_t const VERSION = 1;
unsigned const SECTOR_TO_BLOCK_SHIFT = 3; unsigned const SECTOR_TO_BLOCK_SHIFT = 3;
uint32_t const SUPERBLOCK_CSUM_SEED = 160774; uint32_t const SUPERBLOCK_CSUM_SEED = 160774;

View File

@ -29,6 +29,12 @@ using namespace std;
using namespace thin_provisioning; using namespace thin_provisioning;
namespace { namespace {
enum error_state {
NO_ERRORS,
NON_FATAL, // eg, lost blocks
FATAL // needs fixing before pool can be activated
};
int check(string const &path, bool quiet) { int check(string const &path, bool quiet) {
try { try {
optional<error_set::ptr> maybe_errors = metadata_check(path); optional<error_set::ptr> maybe_errors = metadata_check(path);