]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: additional error error handling in CDir
authorJohn Spray <john.spray@redhat.com>
Tue, 2 Jun 2015 09:43:19 +0000 (10:43 +0100)
committerJohn Spray <john.spray@redhat.com>
Thu, 18 Jun 2015 10:19:44 +0000 (11:19 +0100)
Including corruption in fnode+dentries

Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/CDir.cc

index 36daf33e12de5351e2abb6f9513aba7698dc143b..09060a8bbef4b551275c1349617c9407e851fd5f 100644 (file)
@@ -1745,10 +1745,21 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& 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<string, bufferlist>& 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;