mirror of
https://github.com/ceph/ceph
synced 2025-02-23 02:57:21 +00:00
Merge pull request #32758 from ifed01/wip-ifed-fix-legacy-omap
os/bluestore: upgrade legacy omap to per-pool format automatically. Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
commit
42cf0226bd
@ -6101,6 +6101,20 @@ void BlueStore::_fsck_collections(int64_t* errors)
|
||||
}
|
||||
}
|
||||
|
||||
void BlueStore::_set_per_pool_omap()
|
||||
{
|
||||
per_pool_omap = false;
|
||||
bufferlist bl;
|
||||
db->get(PREFIX_SUPER, "per_pool_omap", &bl);
|
||||
if (bl.length()) {
|
||||
per_pool_omap = true;
|
||||
dout(10) << __func__ << " per_pool_omap=1" << dendl;
|
||||
} else {
|
||||
dout(10) << __func__ << " per_pool_omap not present" << dendl;
|
||||
}
|
||||
_check_no_per_pool_omap_alert();
|
||||
}
|
||||
|
||||
void BlueStore::_open_statfs()
|
||||
{
|
||||
osd_pools.clear();
|
||||
@ -6964,16 +6978,23 @@ int BlueStore::_mount(bool kv_only, bool open_db)
|
||||
|
||||
mempool_thread.init();
|
||||
|
||||
if (!per_pool_stat_collection &&
|
||||
if ((!per_pool_stat_collection || !per_pool_omap) &&
|
||||
cct->_conf->bluestore_fsck_quick_fix_on_mount == true) {
|
||||
|
||||
bool was_per_pool_omap = per_pool_omap;
|
||||
|
||||
dout(1) << __func__ << " quick-fix on mount" << dendl;
|
||||
_fsck_on_open(FSCK_SHALLOW, true);
|
||||
|
||||
//reread statfs
|
||||
//FIXME minor: replace with actual open/close?
|
||||
_open_statfs();
|
||||
|
||||
_check_legacy_statfs_alert();
|
||||
|
||||
//set again as hopefully it has been fixed
|
||||
if (!was_per_pool_omap) {
|
||||
_set_per_pool_omap();
|
||||
}
|
||||
}
|
||||
|
||||
mounted = true;
|
||||
@ -7069,6 +7090,19 @@ int BlueStore::cold_close()
|
||||
return 0;
|
||||
}
|
||||
|
||||
// derr wrapper to limit enormous output and avoid log flooding.
|
||||
// Of limited use where such output is expected for now
|
||||
#define fsck_derr(err_cnt, threshold) \
|
||||
if (err_cnt <= threshold) { \
|
||||
bool need_skip_print = err_cnt == threshold; \
|
||||
derr
|
||||
|
||||
#define fsck_dendl \
|
||||
dendl; \
|
||||
if (need_skip_print) \
|
||||
derr << "more error lines skipped..." << dendl; \
|
||||
}
|
||||
|
||||
int _fsck_sum_extents(
|
||||
const PExtentVector& extents,
|
||||
bool compressed,
|
||||
@ -7239,7 +7273,6 @@ void BlueStore::_fsck_check_pool_statfs(
|
||||
++errors;
|
||||
}
|
||||
if (!per_pool_stat_collection &&
|
||||
cct->_conf->bluestore_fsck_error_on_no_per_pool_stats &&
|
||||
repairer) {
|
||||
// by virtue of running this method, we correct the top-level
|
||||
// error of having global stats
|
||||
@ -7428,6 +7461,11 @@ BlueStore::OnodeRef BlueStore::fsck_check_objects_shallow(
|
||||
*res_statfs);
|
||||
}
|
||||
} // for (auto& i : ref_map)
|
||||
|
||||
if (o->onode.has_omap()) {
|
||||
_fsck_check_object_omap(depth, o, ctx);
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@ -7551,9 +7589,7 @@ public:
|
||||
batch->num_sharded_objects,
|
||||
batch->num_spanning_blobs,
|
||||
nullptr, // used_blocks
|
||||
nullptr, // used_omap_head;
|
||||
nullptr, // used_per_pool_omap_head;
|
||||
nullptr, // used_pgmeta_omap_head;
|
||||
nullptr, //used_omap_head
|
||||
sb_info_lock,
|
||||
*sb_info,
|
||||
batch->expected_store_statfs,
|
||||
@ -7664,6 +7700,7 @@ public:
|
||||
ctx.num_blobs += batch.num_blobs;
|
||||
ctx.num_sharded_objects += batch.num_sharded_objects;
|
||||
ctx.num_spanning_blobs += batch.num_spanning_blobs;
|
||||
|
||||
ctx.expected_store_statfs.add(batch.expected_store_statfs);
|
||||
|
||||
for (auto it = batch.expected_pool_statfs.begin();
|
||||
@ -7676,20 +7713,92 @@ public:
|
||||
};
|
||||
};
|
||||
|
||||
void BlueStore::_fsck_check_object_omap(FSCKDepth depth,
|
||||
OnodeRef& o,
|
||||
const BlueStore::FSCK_ObjectCtx& ctx)
|
||||
{
|
||||
auto& errors = ctx.errors;
|
||||
auto& warnings = ctx.warnings;
|
||||
auto repairer = ctx.repairer;
|
||||
|
||||
ceph_assert(o->onode.has_omap());
|
||||
if (!o->onode.is_perpool_omap() && !o->onode.is_pgmeta_omap()) {
|
||||
if (per_pool_omap) {
|
||||
fsck_derr(errors, MAX_FSCK_ERROR_LINES)
|
||||
<< "fsck error: " << o->oid
|
||||
<< " has omap that is not per-pool or pgmeta"
|
||||
<< fsck_dendl;
|
||||
++errors;
|
||||
} else {
|
||||
const char* w;
|
||||
int64_t num;
|
||||
if (cct->_conf->bluestore_fsck_error_on_no_per_pool_omap) {
|
||||
++errors;
|
||||
num = errors;
|
||||
w = "error";
|
||||
} else {
|
||||
++warnings;
|
||||
num = warnings;
|
||||
w = "warning";
|
||||
}
|
||||
fsck_derr(num, MAX_FSCK_ERROR_LINES)
|
||||
<< "fsck " << w << ": " << o->oid
|
||||
<< " has omap that is not per-pool or pgmeta"
|
||||
<< fsck_dendl;
|
||||
}
|
||||
}
|
||||
if (repairer &&
|
||||
!o->onode.is_perpool_omap() &&
|
||||
!o->onode.is_pgmeta_omap()) {
|
||||
dout(10) << "fsck converting " << o->oid << " omap to per-pool" << dendl;
|
||||
bufferlist h;
|
||||
map<string, bufferlist> kv;
|
||||
int r = _omap_get(o->c, o->oid, &h, &kv);
|
||||
if (r < 0) {
|
||||
derr << " got " << r << " " << cpp_strerror(r) << dendl;
|
||||
} else {
|
||||
KeyValueDB::Transaction txn = db->get_transaction();
|
||||
// remove old keys
|
||||
const string& old_omap_prefix = o->get_omap_prefix();
|
||||
string old_head, old_tail;
|
||||
o->get_omap_header(&old_head);
|
||||
o->get_omap_tail(&old_tail);
|
||||
txn->rm_range_keys(old_omap_prefix, old_head, old_tail);
|
||||
txn->rmkey(old_omap_prefix, old_tail);
|
||||
// set flag
|
||||
o->onode.set_flag(bluestore_onode_t::FLAG_PERPOOL_OMAP);
|
||||
_record_onode(o, txn);
|
||||
const string& new_omap_prefix = o->get_omap_prefix();
|
||||
// head
|
||||
if (h.length()) {
|
||||
string new_head;
|
||||
o->get_omap_header(&new_head);
|
||||
txn->set(new_omap_prefix, new_head, h);
|
||||
}
|
||||
// tail
|
||||
string new_tail;
|
||||
o->get_omap_tail(&new_tail);
|
||||
bufferlist empty;
|
||||
txn->set(new_omap_prefix, new_tail, empty);
|
||||
// values
|
||||
string final_key;
|
||||
o->get_omap_key(string(), &final_key);
|
||||
size_t base_key_len = final_key.size();
|
||||
for (auto& i : kv) {
|
||||
final_key.resize(base_key_len);
|
||||
final_key += i.first;
|
||||
txn->set(new_omap_prefix, final_key, i.second);
|
||||
}
|
||||
db->submit_transaction_sync(txn);
|
||||
repairer->inc_repaired();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BlueStore::_fsck_check_objects(FSCKDepth depth,
|
||||
BlueStore::FSCK_ObjectCtx& ctx)
|
||||
{
|
||||
//no need for the below lock when in non-shallow mode as
|
||||
// there is no multithreading in this case
|
||||
if (depth != FSCK_SHALLOW) {
|
||||
ctx.sb_info_lock = nullptr;
|
||||
}
|
||||
|
||||
auto& errors = ctx.errors;
|
||||
auto& warnings = ctx.warnings;
|
||||
auto used_omap_head = ctx.used_omap_head;
|
||||
auto used_per_pool_omap_head = ctx.used_per_pool_omap_head;
|
||||
auto used_pgmeta_omap_head = ctx.used_pgmeta_omap_head;
|
||||
auto sb_info_lock = ctx.sb_info_lock;
|
||||
auto& sb_info = ctx.sb_info;
|
||||
auto repairer = ctx.repairer;
|
||||
@ -7897,91 +8006,15 @@ void BlueStore::_fsck_check_objects(FSCKDepth depth,
|
||||
}
|
||||
// omap
|
||||
if (o->onode.has_omap()) {
|
||||
ceph_assert(used_omap_head);
|
||||
ceph_assert(used_per_pool_omap_head);
|
||||
ceph_assert(used_pgmeta_omap_head);
|
||||
auto m =
|
||||
o->onode.is_pgmeta_omap() ? used_pgmeta_omap_head :
|
||||
(o->onode.is_perpool_omap() ? used_per_pool_omap_head : used_omap_head);
|
||||
if (m->count(o->onode.nid)) {
|
||||
derr << "fsck error: " << oid << " omap_head " << o->onode.nid
|
||||
<< " already in use" << dendl;
|
||||
ceph_assert(ctx.used_omap_head);
|
||||
if (ctx.used_omap_head->count(o->onode.nid)) {
|
||||
derr << "fsck error: " << o->oid << " omap_head " << o->onode.nid
|
||||
<< " already in use" << dendl;
|
||||
++errors;
|
||||
} else {
|
||||
ctx.used_omap_head->insert(o->onode.nid);
|
||||
}
|
||||
else {
|
||||
m->insert(o->onode.nid);
|
||||
}
|
||||
if (!o->onode.is_perpool_omap() && !o->onode.is_pgmeta_omap()) {
|
||||
if (per_pool_omap) {
|
||||
derr << "fsck error: " << oid
|
||||
<< " has omap that is not per-pool or pgmeta" << dendl;
|
||||
++errors;
|
||||
}
|
||||
else {
|
||||
const char* w;
|
||||
if (cct->_conf->bluestore_fsck_error_on_no_per_pool_omap) {
|
||||
++errors;
|
||||
w = "error";
|
||||
}
|
||||
else {
|
||||
++warnings;
|
||||
w = "warning";
|
||||
}
|
||||
derr << "fsck " << w << ": " << oid
|
||||
<< " has omap that is not per-pool or pgmeta" << dendl;
|
||||
}
|
||||
}
|
||||
if (repairer &&
|
||||
o->onode.has_omap() &&
|
||||
!o->onode.is_perpool_omap() &&
|
||||
!o->oid.is_pgmeta()) {
|
||||
derr << "fsck converting " << oid << " omap to per-pool" << dendl;
|
||||
used_omap_head->erase(o->onode.nid);
|
||||
used_per_pool_omap_head->insert(o->onode.nid);
|
||||
bufferlist h;
|
||||
map<string, bufferlist> kv;
|
||||
int r = _omap_get(c.get(), oid, &h, &kv);
|
||||
if (r < 0) {
|
||||
derr << " got " << r << " " << cpp_strerror(r) << dendl;
|
||||
}
|
||||
else {
|
||||
KeyValueDB::Transaction txn = db->get_transaction();
|
||||
// remove old keys
|
||||
const string& old_omap_prefix = o->get_omap_prefix();
|
||||
string old_head, old_tail;
|
||||
o->get_omap_header(&old_head);
|
||||
o->get_omap_tail(&old_tail);
|
||||
txn->rm_range_keys(old_omap_prefix, old_head, old_tail);
|
||||
txn->rmkey(old_omap_prefix, old_tail);
|
||||
// set flag
|
||||
o->onode.set_flag(bluestore_onode_t::FLAG_PERPOOL_OMAP);
|
||||
_record_onode(o, txn);
|
||||
const string& new_omap_prefix = o->get_omap_prefix();
|
||||
// head
|
||||
if (h.length()) {
|
||||
string new_head;
|
||||
o->get_omap_header(&new_head);
|
||||
txn->set(new_omap_prefix, new_head, h);
|
||||
}
|
||||
// tail
|
||||
string new_tail;
|
||||
o->get_omap_tail(&new_tail);
|
||||
bufferlist empty;
|
||||
txn->set(new_omap_prefix, new_tail, empty);
|
||||
// values
|
||||
string final_key;
|
||||
o->get_omap_key(string(), &final_key);
|
||||
size_t base_key_len = final_key.size();
|
||||
for (auto& i : kv) {
|
||||
final_key.resize(base_key_len);
|
||||
final_key += i.first;
|
||||
txn->set(new_omap_prefix, final_key, i.second);
|
||||
}
|
||||
db->submit_transaction_sync(txn);
|
||||
repairer->inc_repaired();
|
||||
}
|
||||
}
|
||||
} // if (depth != FSCK_SHALLOW && o->onode.has_omap())
|
||||
} // if (o->onode.has_omap())
|
||||
if (depth == FSCK_DEEP) {
|
||||
bufferlist bl;
|
||||
uint64_t max_read_block = cct->_conf->bluestore_fsck_read_bytes_cap;
|
||||
@ -8140,8 +8173,6 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
unsigned repaired = 0;
|
||||
|
||||
uint64_t_btree_t used_omap_head;
|
||||
uint64_t_btree_t used_per_pool_omap_head;
|
||||
uint64_t_btree_t used_pgmeta_omap_head;
|
||||
uint64_t_btree_t used_sbids;
|
||||
|
||||
mempool_dynamic_bitset used_blocks;
|
||||
@ -8270,15 +8301,15 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
num_spanning_blobs,
|
||||
&used_blocks,
|
||||
&used_omap_head,
|
||||
&used_per_pool_omap_head,
|
||||
&used_pgmeta_omap_head,
|
||||
&sb_info_lock,
|
||||
//no need for the below lock when in non-shallow mode as
|
||||
// there is no multithreading in this case
|
||||
depth == FSCK_SHALLOW ? &sb_info_lock : nullptr,
|
||||
sb_info,
|
||||
expected_store_statfs,
|
||||
expected_pool_statfs,
|
||||
repair ? &repairer : nullptr);
|
||||
_fsck_check_objects(depth,
|
||||
ctx);
|
||||
|
||||
_fsck_check_objects(depth, ctx);
|
||||
}
|
||||
|
||||
dout(1) << __func__ << " checking shared_blobs" << dendl;
|
||||
@ -8602,7 +8633,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
errors, warnings, repair ? &repairer : nullptr);
|
||||
|
||||
if (depth != FSCK_SHALLOW) {
|
||||
dout(1) << __func__ << " checking for stray omap data" << dendl;
|
||||
dout(1) << __func__ << " checking for stray omap data " << dendl;
|
||||
it = db->get_iterator(PREFIX_OMAP);
|
||||
if (it) {
|
||||
uint64_t last_omap_head = 0;
|
||||
@ -8611,8 +8642,9 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
_key_decode_u64(it->key().c_str(), &omap_head);
|
||||
if (used_omap_head.count(omap_head) == 0 &&
|
||||
omap_head != last_omap_head) {
|
||||
derr << "fsck error: found stray omap data on omap_head "
|
||||
<< omap_head << dendl;
|
||||
fsck_derr(errors, MAX_FSCK_ERROR_LINES)
|
||||
<< "fsck error: found stray omap data on omap_head "
|
||||
<< omap_head << " " << last_omap_head << " " << used_omap_head.count(omap_head)<< fsck_dendl;
|
||||
++errors;
|
||||
last_omap_head = omap_head;
|
||||
}
|
||||
@ -8624,11 +8656,12 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
for (it->lower_bound(string()); it->valid(); it->next()) {
|
||||
uint64_t omap_head;
|
||||
_key_decode_u64(it->key().c_str(), &omap_head);
|
||||
if (used_pgmeta_omap_head.count(omap_head) == 0 &&
|
||||
if (used_omap_head.count(omap_head) == 0 &&
|
||||
omap_head != last_omap_head) {
|
||||
derr << "fsck error: found stray (pgmeta) omap data on omap_head "
|
||||
<< omap_head << dendl;
|
||||
last_omap_head = omap_head;
|
||||
fsck_derr(errors, MAX_FSCK_ERROR_LINES)
|
||||
<< "fsck error: found stray (pgmeta) omap data on omap_head "
|
||||
<< omap_head << " " << last_omap_head << " " << used_omap_head.count(omap_head) << fsck_dendl;
|
||||
last_omap_head = omap_head;
|
||||
++errors;
|
||||
}
|
||||
}
|
||||
@ -8643,11 +8676,12 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
const char *c = k.c_str();
|
||||
c = _key_decode_u64(c, &pool);
|
||||
c = _key_decode_u64(c, &omap_head);
|
||||
if (used_per_pool_omap_head.count(omap_head) == 0 &&
|
||||
if (used_omap_head.count(omap_head) == 0 &&
|
||||
omap_head != last_omap_head) {
|
||||
derr << "fsck error: found stray (per-pool) omap data on omap_head "
|
||||
<< omap_head << dendl;
|
||||
++errors;
|
||||
fsck_derr(errors, MAX_FSCK_ERROR_LINES)
|
||||
<< "fsck error: found stray (per-pool) omap data on omap_head "
|
||||
<< omap_head << " " << last_omap_head << " " << used_omap_head.count(omap_head) << fsck_dendl;
|
||||
++errors;
|
||||
last_omap_head = omap_head;
|
||||
}
|
||||
}
|
||||
@ -8769,8 +8803,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
|
||||
}
|
||||
}
|
||||
if (repair) {
|
||||
if (!per_pool_omap &&
|
||||
depth != FSCK_SHALLOW) {
|
||||
if (!per_pool_omap) {
|
||||
dout(5) << __func__ << " marking per_pool_omap=1" << dendl;
|
||||
repairer.fix_per_pool_omap(db);
|
||||
}
|
||||
@ -8796,7 +8829,12 @@ out_scan:
|
||||
<< repaired << " repaired, "
|
||||
<< (errors + warnings - (int)repaired) << " remaining in "
|
||||
<< duration << " seconds" << dendl;
|
||||
return errors - (int)repaired;
|
||||
|
||||
// In non-repair mode we should return error count only as
|
||||
// it indicates if store status is OK.
|
||||
// In repair mode both errors and warnings are taken into account
|
||||
// since repaired counter relates to them both.
|
||||
return repair ? errors + warnings - (int)repaired : errors;
|
||||
}
|
||||
|
||||
/// methods to inject various errors fsck can repair
|
||||
@ -10840,17 +10878,7 @@ int BlueStore::_open_super_meta()
|
||||
<< std::dec << dendl;
|
||||
}
|
||||
|
||||
{
|
||||
bufferlist bl;
|
||||
db->get(PREFIX_SUPER, "per_pool_omap", &bl);
|
||||
if (bl.length()) {
|
||||
per_pool_omap = true;
|
||||
dout(10) << __func__ << " per_pool_omap=1" << dendl;
|
||||
} else {
|
||||
dout(10) << __func__ << " per_pool_omap not present" << dendl;
|
||||
}
|
||||
_check_no_per_pool_omap_alert();
|
||||
}
|
||||
_set_per_pool_omap();
|
||||
|
||||
_open_statfs();
|
||||
_set_alloc_sizes();
|
||||
|
@ -2229,6 +2229,7 @@ private:
|
||||
void _set_alloc_sizes();
|
||||
void _set_blob_size();
|
||||
void _set_finisher_num();
|
||||
void _set_per_pool_omap();
|
||||
void _update_osd_memory_options();
|
||||
|
||||
int _open_bdev(bool create);
|
||||
@ -2371,6 +2372,9 @@ public:
|
||||
FSCK_DEEP,
|
||||
FSCK_SHALLOW
|
||||
};
|
||||
enum {
|
||||
MAX_FSCK_ERROR_LINES = 100,
|
||||
};
|
||||
|
||||
private:
|
||||
int _fsck_check_extents(
|
||||
@ -3237,8 +3241,6 @@ public:
|
||||
|
||||
mempool_dynamic_bitset* used_blocks;
|
||||
uint64_t_btree_t* used_omap_head;
|
||||
uint64_t_btree_t* used_per_pool_omap_head;
|
||||
uint64_t_btree_t* used_pgmeta_omap_head;
|
||||
|
||||
ceph::mutex* sb_info_lock;
|
||||
sb_info_map_t& sb_info;
|
||||
@ -3256,8 +3258,6 @@ public:
|
||||
uint64_t& _num_spanning_blobs,
|
||||
mempool_dynamic_bitset* _ub,
|
||||
uint64_t_btree_t* _used_omap_head,
|
||||
uint64_t_btree_t* _used_per_pool_omap_head,
|
||||
uint64_t_btree_t* _used_pgmeta_omap_head,
|
||||
ceph::mutex* _sb_info_lock,
|
||||
sb_info_map_t& _sb_info,
|
||||
store_statfs_t& _store_statfs,
|
||||
@ -3272,8 +3272,6 @@ public:
|
||||
num_spanning_blobs(_num_spanning_blobs),
|
||||
used_blocks(_ub),
|
||||
used_omap_head(_used_omap_head),
|
||||
used_per_pool_omap_head(_used_per_pool_omap_head),
|
||||
used_pgmeta_omap_head(_used_pgmeta_omap_head),
|
||||
sb_info_lock(_sb_info_lock),
|
||||
sb_info(_sb_info),
|
||||
expected_store_statfs(_store_statfs),
|
||||
@ -3294,6 +3292,10 @@ public:
|
||||
const BlueStore::FSCK_ObjectCtx& ctx);
|
||||
|
||||
private:
|
||||
void _fsck_check_object_omap(FSCKDepth depth,
|
||||
OnodeRef& o,
|
||||
const BlueStore::FSCK_ObjectCtx& ctx);
|
||||
|
||||
void _fsck_check_objects(FSCKDepth depth,
|
||||
FSCK_ObjectCtx& ctx);
|
||||
};
|
||||
@ -3483,6 +3485,7 @@ public:
|
||||
++to_repair_cnt;
|
||||
}
|
||||
}
|
||||
// In fact this is the only repairer's method which is thread-safe!!
|
||||
void inc_repaired() {
|
||||
++to_repair_cnt;
|
||||
}
|
||||
@ -3498,7 +3501,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned to_repair_cnt = 0;
|
||||
std::atomic<unsigned> to_repair_cnt = { 0 };
|
||||
KeyValueDB::Transaction fix_per_pool_omap_txn;
|
||||
KeyValueDB::Transaction fix_fm_leaked_txn;
|
||||
KeyValueDB::Transaction fix_fm_false_free_txn;
|
||||
|
@ -431,10 +431,10 @@ int main(int argc, char **argv)
|
||||
r = bluestore.quick_fix();
|
||||
}
|
||||
if (r < 0) {
|
||||
cerr << "error from fsck: " << cpp_strerror(r) << std::endl;
|
||||
cerr << action << " failed: " << cpp_strerror(r) << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
} else if (r > 0) {
|
||||
cerr << action << " found " << r << " error(s)" << std::endl;
|
||||
cerr << action << " status: remaining " << r << " error(s) and warning(s)" << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
cout << action << " success" << std::endl;
|
||||
|
@ -3520,10 +3520,10 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
if (r > 0) {
|
||||
cerr << "fsck found " << r << " errors" << std::endl;
|
||||
cerr << "fsck status: " << r << " remaining error(s) and warning(s)" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
cout << "fsck found no errors" << std::endl;
|
||||
cout << "fsck success" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
if (op == "repair" || op == "repair-deep") {
|
||||
@ -3533,10 +3533,10 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
if (r > 0) {
|
||||
cerr << "repair found " << r << " errors" << std::endl;
|
||||
cerr << "repair status: " << r << " remaining error(s) and warning(s)" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
cout << "repair found no errors" << std::endl;
|
||||
cout << "repair success" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
if (op == "mkfs") {
|
||||
|
Loading…
Reference in New Issue
Block a user