From 0cee333e5670f357dd8f2a1fc51855eadba3cb01 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 26 Feb 2016 20:32:49 +0800 Subject: [PATCH] mds: remove stray dentry from delayed eval list after calling eval_stray() 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 --- src/mds/StrayManager.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/mds/StrayManager.cc b/src/mds/StrayManager.cc index 6547a264120..4e9e3961ce4 100644 --- a/src/mds/StrayManager.cc +++ b/src/mds/StrayManager.cc @@ -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. -- 2.47.3