From: Yan, Zheng Date: Mon, 21 Apr 2014 08:26:33 +0000 (+0800) Subject: client: check cap ID when handling cap export message X-Git-Tag: v0.80~22^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bad34e90e55fd99b5d1b146e28fa0215efeb186d;p=ceph.git client: check cap ID when handling cap export message handle following sequence of events: - mds0 exports an inode to mds1. client receives the cap import message from mds1. caps from mds0 are removed while handling the cap import message. - mds1 exports an inode to mds0. client receives the cap export message from mds1. handle_cap_export() adds placeholder caps for mds0 - client receives the first cap export message (for exporting inode from mds0 to mds1) Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 688cc84cd7c9..03b6438b2174 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3574,9 +3574,11 @@ void Client::handle_cap_export(MetaSession *session, Inode *in, MClientCaps *m) ldout(cct, 5) << "handle_cap_export ino " << m->get_ino() << " mseq " << m->get_mseq() << " EXPORT from mds." << mds << dendl; - if (in->caps.count(mds)) { - Cap *cap = in->caps[mds]; + Cap *cap = NULL; + if (in->caps.count(mds)) + cap = in->caps[mds]; + if (cap && cap->cap_id == m->get_cap_id()) { if (m->peer.cap_id) { MetaSession *tsession = _get_or_open_mds_session(m->peer.mds); if (in->caps.count(m->peer.mds)) {