From: John Spray Date: Tue, 2 Jun 2015 09:43:19 +0000 (+0100) Subject: mds: additional error error handling in CDir X-Git-Tag: v9.0.3~132^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=ae0a28e24dd6adefa8ec926ab35767b7edf1c6b5;p=ceph.git mds: additional error error handling in CDir Including corruption in fnode+dentries Signed-off-by: John Spray --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 36daf33e12de5..09060a8bbef4b 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1745,10 +1745,21 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, fnode_t got_fnode; { bufferlist::iterator p = hdrbl.begin(); - ::decode(got_fnode, p); + try { + ::decode(got_fnode, p); + } catch (const buffer::error &err) { + derr << "Corrupt fnode in dirfrag " << dirfrag() + << ": " << err << dendl; + clog->warn() << "Corrupt fnode header in " << dirfrag() << ": " + << err; + go_bad(); + return; + } if (!p.end()) { clog->warn() << "header buffer of dir " << dirfrag() << " has " << hdrbl.length() - p.get_off() << " extra bytes\n"; + go_bad(); + return; } } @@ -1797,9 +1808,18 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, snapid_t last; dentry_key_t::decode_helper(p->first, dname, last); - CDentry *dn = _load_dentry( - p->first, dname, last, p->second, pos, snaps, - &force_dirty, &undef_inodes); + CDentry *dn = NULL; + try { + dn = _load_dentry( + p->first, dname, last, p->second, pos, snaps, + &force_dirty, &undef_inodes); + } catch (const buffer::error &err) { + cache->mds->clog->warn() << "Corrupt dentry '" << dname << "' in " + "dir frag " << dirfrag() << ": " + << err; + go_bad(); + return; + } if (dn && want_dn.length() && want_dn == dname) { dout(10) << " touching wanted dn " << *dn << dendl;