9e20465fd1
We've had a trickle of users who accidentally activate the same pool on a VM and host at the same time. Typically the host doesn't do any IO, but the kernel will still rewrite the superblock on shutdown. This leaves the superblock pointing to very out of date btree roots and so we get massive metadata loss. This patch changes thin_repair, and thin_dump --repair. They now hunt for the most recent, undamaged and consistent roots of the device and mapping trees, and use that as the starting point of the repair.
73 lines
2.2 KiB
C++
73 lines
2.2 KiB
C++
// 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_DUMPER_H
|
|
#define METADATA_DUMPER_H
|
|
|
|
#include "emitter.h"
|
|
#include "metadata.h"
|
|
|
|
#include <boost/optional.hpp>
|
|
#include <set>
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
namespace thin_provisioning {
|
|
class dump_options {
|
|
public:
|
|
dump_options()
|
|
: skip_mappings_(false) {
|
|
}
|
|
|
|
bool selected_dev(uint64_t dev_id) const {
|
|
return !dev_filter_ || dev_filter_->count(dev_id);
|
|
}
|
|
|
|
void select_dev(uint64_t dev_id) {
|
|
if (!dev_filter_)
|
|
dev_filter_ = dev_set();
|
|
|
|
dev_filter_->insert(dev_id);
|
|
}
|
|
|
|
bool skip_mappings_;
|
|
|
|
using dev_set = std::set<uint64_t>;
|
|
using maybe_dev_set = boost::optional<dev_set>;
|
|
|
|
maybe_dev_set dev_filter_;
|
|
};
|
|
|
|
// Set the @repair flag if your metadata is corrupt, and you'd like
|
|
// the dumper to do it's best to recover info. If not set, any
|
|
// corruption encountered will cause an exception to be thrown.
|
|
void metadata_dump(metadata::ptr md, emitter::ptr e, dump_options const &opts);
|
|
|
|
// We have to provide a different interface for repairing, since
|
|
// the superblock itself may be corrupt, so we wont be able
|
|
// to create the metadata object.
|
|
void metadata_repair(block_manager<>::ptr bm, emitter::ptr e);
|
|
|
|
// Only used by ll_restore, so we leave the repair arg
|
|
void metadata_dump_subtree(metadata::ptr md, emitter::ptr e, bool repair, uint64_t subtree_root);
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
#endif
|