From 7bb562adf58d68aaa256f839dd9ad51badafde40 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 2 Aug 2017 15:07:31 +0800 Subject: [PATCH] mds: properly drop wrlock when finishing snapflush Signed-off-by: "Yan, Zheng" --- src/mds/Locker.cc | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index b82beb4e2158b..a75110e59664d 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1830,18 +1830,21 @@ void Locker::file_update_finish(CInode *in, MutationRef& mut, bool share_max, bo bool gather = false; compact_map >::iterator p = in->client_snap_caps.begin(); while (p != in->client_snap_caps.end()) { - SimpleLock *lock = in->get_lock(p->first); - assert(lock); - dout(10) << " completing client_snap_caps for " << ccap_string(p->first) - << " lock " << *lock << " on " << *in << dendl; - lock->put_wrlock(); - - p->second.erase(client); - if (p->second.empty()) { - gather = true; - in->client_snap_caps.erase(p++); - } else - ++p; + auto q = p->second.find(client); + if (q != p->second.end()) { + SimpleLock *lock = in->get_lock(p->first); + assert(lock); + dout(10) << " completing client_snap_caps for " << ccap_string(p->first) + << " lock " << *lock << " on " << *in << dendl; + lock->put_wrlock(); + + p->second.erase(q); + if (p->second.empty()) { + gather = true; + in->client_snap_caps.erase(p++); + } else + ++p; + } } if (gather) { if (in->client_snap_caps.empty()) -- 2.39.5