From: John Spray Date: Tue, 19 May 2015 10:59:57 +0000 (+0100) Subject: mds: fix corrupt CInode handling X-Git-Tag: v9.0.3~132^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=96770470adc3f4fbd30b4223c431963bfd2d43cb;p=ceph.git mds: fix corrupt CInode handling Were previously catching errors from InodeStore but not the leading magic. Signed-off-by: John Spray --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index a16b8cabe6b2..878b957da3f7 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1057,24 +1057,27 @@ void CInode::_fetched(bufferlist& bl, bufferlist& bl2, Context *fin) fin->complete(-ENOENT); return; } - string magic; - ::decode(magic, p); - dout(10) << " magic is '" << magic << "' (expecting '" << CEPH_FS_ONDISK_MAGIC << "')" << dendl; - if (magic != CEPH_FS_ONDISK_MAGIC) { - dout(0) << "on disk magic '" << magic << "' != my magic '" << CEPH_FS_ONDISK_MAGIC - << "'" << dendl; - fin->complete(-EINVAL); - } else { - try { - decode_store(p); - } catch (buffer::error &err) { - derr << "Corrupt inode 0x" << std::hex << ino() << std::dec - << ": " << err << dendl; + + // Attempt decode + try { + string magic; + ::decode(magic, p); + dout(10) << " magic is '" << magic << "' (expecting '" + << CEPH_FS_ONDISK_MAGIC << "')" << dendl; + if (magic != CEPH_FS_ONDISK_MAGIC) { + dout(0) << "on disk magic '" << magic << "' != my magic '" << CEPH_FS_ONDISK_MAGIC + << "'" << dendl; fin->complete(-EINVAL); - return; + } else { + decode_store(p); + dout(10) << "_fetched " << *this << dendl; + fin->complete(0); } - dout(10) << "_fetched " << *this << dendl; - fin->complete(0); + } catch (buffer::error &err) { + derr << "Corrupt inode 0x" << std::hex << ino() << std::dec + << ": " << err << dendl; + fin->complete(-EINVAL); + return; } }