From: Yan, Zheng Date: Fri, 26 Feb 2016 12:32:49 +0000 (+0800) Subject: mds: remove stray dentry from delayed eval list after calling eval_stray() X-Git-Tag: v10.1.0~175^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F7798%2Fhead;p=ceph.git 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 --- 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.