From: Yan, Zheng Date: Wed, 2 Aug 2017 07:07:31 +0000 (+0800) Subject: mds: properly drop wrlock when finishing snapflush X-Git-Tag: v13.0.1~1021^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7bb562adf58d68aaa256f839dd9ad51badafde40;p=ceph.git mds: properly drop wrlock when finishing snapflush Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index b82beb4e2158..a75110e59664 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())