From e05f14319a69224077b3aec52be6c2964eb40731 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 11 Jan 2018 16:22:12 +0800 Subject: [PATCH] client: release revoking Fc after invalidate cache this issue is likely revealed by commit 7bc1fa04 "client: avoid adding checked inode to the delayed_caps" Fixes: http://tracker.ceph.com/issues/22652 Signed-off-by: "Yan, Zheng" --- src/client/Client.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 4c296f76aba..75de6d89d48 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3384,8 +3384,10 @@ void Client::check_caps(Inode *in, unsigned flags) return; // guard if at end of func if ((revoking & (CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO)) && - (used & CEPH_CAP_FILE_CACHE) && !(used & CEPH_CAP_FILE_BUFFER)) - _release(in); + (used & CEPH_CAP_FILE_CACHE) && !(used & CEPH_CAP_FILE_BUFFER)) { + if (_release(in)) + used &= ~CEPH_CAP_FILE_CACHE; + } if (!in->cap_snaps.empty()) flush_snaps(in); @@ -3710,8 +3712,11 @@ void Client::_invalidate_inode_cache(Inode *in) ldout(cct, 10) << "_invalidate_inode_cache " << *in << dendl; // invalidate our userspace inode cache - if (cct->_conf->client_oc) + if (cct->_conf->client_oc) { objectcacher->release_set(&in->oset); + if (!objectcacher->set_is_empty(&in->oset)) + lderr(cct) << "failed to invalidate cache for " << *in << dendl; + } _schedule_invalidate_callback(in, 0, 0); } -- 2.39.5