]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: remove stray dentry from delayed eval list after calling eval_stray()
authorYan, Zheng <zyan@redhat.com>
Fri, 26 Feb 2016 12:32:49 +0000 (20:32 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 26 Feb 2016 12:56:34 +0000 (20:56 +0800)
MDCache::trim_inode() calls StrayManager.eval_stray() when trimming a
a stray dentry. After calling StrayManager.eval_stray(), the dentry can
still be in the delayed eval list, which triggers assertion in CDentry's
destructor()

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/StrayManager.cc

index 6547a264120c45bad578c73337c56caf616c3058..4e9e3961ce4fa610310212fef04874f7aeb0f8ab 100644 (file)
@@ -320,12 +320,6 @@ void StrayManager::enqueue(CDentry *dn, bool trunc)
   dn->get(CDentry::PIN_PURGING);
   in->state_set(CInode::STATE_PURGING);
 
-  if (dn->item_stray.is_on_list()) {
-    dn->item_stray.remove_myself();
-    num_strays_delayed--;
-    logger->set(l_mdc_num_strays_delayed, num_strays_delayed);
-  }
-
   /* We must clear this as soon as enqueuing it, to prevent the journal
    * expiry code from seeing a dirty parent and trying to write a backtrace */
   if (!trunc) {
@@ -549,6 +543,15 @@ bool StrayManager::__eval_stray(CDentry *dn, bool delay)
     return false;
   }
 
+  if (dn->item_stray.is_on_list()) {
+    if (delay)
+      return false;
+
+    dn->item_stray.remove_myself();
+    num_strays_delayed--;
+    logger->set(l_mdc_num_strays_delayed, num_strays_delayed);
+  }
+
   // purge?
   if (in->inode.nlink == 0) {
     // past snaprealm parents imply snapped dentry remote links.