From 96770470adc3f4fbd30b4223c431963bfd2d43cb Mon Sep 17 00:00:00 2001 From: John Spray Date: Tue, 19 May 2015 11:59:57 +0100 Subject: [PATCH] mds: fix corrupt CInode handling Were previously catching errors from InodeStore but not the leading magic. Signed-off-by: John Spray --- src/mds/CInode.cc | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index a16b8cabe6b..878b957da3f 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; } } -- 2.47.3