From: John Spray Date: Tue, 25 Oct 2016 11:30:42 +0000 (+0100) Subject: Merge pull request #11517 from ukernel/wip-17562 X-Git-Tag: v11.1.0~516 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bbdfd1375e8d2d0b8db59fd805aeb2a5c8ea2563;p=ceph.git Merge pull request #11517 from ukernel/wip-17562 Fix #17562 (backtrace check fails when scrubbing directory created by fsstress) Reviewed-by: John Spray Reviewed-by: Greg Farnum --- bbdfd1375e8d2d0b8db59fd805aeb2a5c8ea2563 diff --cc src/mds/CInode.cc index faded754b712,feb4530c5741..d6c024c28fc9 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@@ -3845,27 -3840,13 +3845,23 @@@ void CInode::validate_disk_state(CInode 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) {