From cb336f2e10c86ed5b9a22ec44a191e22929676a3 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 22 Feb 2017 16:25:57 +0800 Subject: [PATCH] client: drop cap snaps when auth mds session gets closed Fixes: http://tracker.ceph.com/issues/19022 Signed-off-by: "Yan, Zheng" --- src/client/Client.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index c52d97a25d1..be3d13e4467 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3908,8 +3908,9 @@ void Client::remove_session_caps(MetaSession *s) while (s->caps.size()) { Cap *cap = *s->caps.begin(); Inode *in = cap->inode; - int dirty_caps = 0; + bool dirty_caps = false, cap_snaps = false; if (in->auth_cap == cap) { + cap_snaps = !in->cap_snaps.empty(); dirty_caps = in->dirty_caps | in->flushing_caps; in->wanted_max_size = 0; in->requested_max_size = 0; @@ -3917,6 +3918,10 @@ void Client::remove_session_caps(MetaSession *s) } remove_cap(cap, false); signal_cond_list(in->waitfor_caps); + if (cap_snaps) { + InodeRef tmp_ref(in); + in->cap_snaps.clear(); + } if (dirty_caps) { lderr(cct) << "remove_session_caps still has dirty|flushing caps on " << *in << dendl; if (in->flushing_caps) { -- 2.47.3