From: Yan, Zheng Date: Mon, 23 May 2016 09:40:05 +0000 (+0800) Subject: mds: fix race between StrayManager::{eval_stray,reintegrate_stray} X-Git-Tag: v11.0.0~422^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F9260%2Fhead;p=ceph.git mds: fix race between StrayManager::{eval_stray,reintegrate_stray} StrayManager::eval_stray() is called after Server::respond_to_request() drops locks. So it can race with StrayManager::reintegrate_stray() Fixes: http://tracker.ceph.com/issues/15920 Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 750fb418cef..d41661a9a28 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5569,8 +5569,9 @@ void Server::_unlink_local_finish(MDRequestRef& mdr, // removing a new dn? dn->get_dir()->try_remove_unlinked_dn(dn); - // clean up? - if (straydn) { + // clean up ? + // respond_to_request() drops locks. So stray reintegration can race with us. + if (straydn && !straydn->get_projected_linkage()->is_null()) { // Tip off the MDCache that this dentry is a stray that // might be elegible for purge. mdcache->notify_stray(straydn); @@ -6417,7 +6418,8 @@ void Server::_rename_finish(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, mds->locker->eval(in, CEPH_CAP_LOCKS, true); // clean up? - if (straydn) { + // respond_to_request() drops locks. So stray reintegration can race with us. + if (straydn && !straydn->get_projected_linkage()->is_null()) { mdcache->notify_stray(straydn); } }