memory_newer = memory_backtrace.compare(results->backtrace.ondisk_value,
&equivalent, &divergent);
- if (equivalent) {
- results->backtrace.passed = true;
+ if (divergent || memory_newer < 0) {
+ // we're divergent, or on-disk version is newer
+ results->backtrace.error_str << "On-disk backtrace is divergent or newer";
} else {
- if (divergent || memory_newer <= 0) {
- // we're divergent, or don't have a newer version to write
- results->backtrace.error_str <<
- "On-disk backtrace is divergent or newer";
- goto next;
- }
+ results->backtrace.passed = true;
}
next:
+
+ if (!results->backtrace.passed && in->scrub_infop->header->get_repair()) {
+ std::string path;
+ in->make_path_string(path);
+ in->mdcache->mds->clog->warn() << "bad backtrace on inode " << *in
+ << ", rewriting it at " << path;
+ in->_mark_dirty_parent(in->mdcache->mds->mdlog->get_current_segment(),
+ false);
+ }
+
// If the inode's number was free in the InoTable, fix that
// (#15619)
{