From 74cc299b23814eb4ac4a0110bf7c5023d5a5b72e Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 13 Jan 2020 15:21:44 +0800 Subject: [PATCH] mds: check inode type when deciding if filelock should be in EXCL state Conditions for regular file and directory are different. Signed-off-by: "Yan, Zheng" --- src/mds/CInode.cc | 5 +++-- src/mds/Locker.cc | 11 ++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 3f0ea1f4357ff..57908d996518d 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -3096,8 +3096,9 @@ client_t CInode::calc_ideal_loner() client_t loner = -1; for (const auto &p : client_caps) { if (!p.second.is_stale() && - ((p.second.wanted() & (CEPH_CAP_ANY_WR|CEPH_CAP_FILE_WR|CEPH_CAP_FILE_RD)) || - (inode.is_dir() && !has_subtree_root_dirfrag()))) { + (is_dir() ? + !has_subtree_or_exporting_dirfrag() : + (p.second.wanted() & (CEPH_CAP_ANY_WR|CEPH_CAP_FILE_RD)))) { if (n) return -1; n++; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 79ec9dc4711f9..2b14c22e9bd65 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -5297,8 +5297,8 @@ void Locker::file_eval(ScatterLock *lock, bool *need_issue) << " xlocker_issued=" << gcap_string(xlocker_issued) << dendl; if (!((loner_wanted|loner_issued) & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) || - (other_wanted & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GRD)) || - (in->inode.is_dir() && in->multiple_nonstale_caps())) { // FIXME.. :/ + (other_wanted & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GRD)) || + (in->is_dir() && in->multiple_nonstale_caps())) { // FIXME.. :/ dout(20) << " should lose it" << dendl; // we should lose it. // loner other want @@ -5326,9 +5326,10 @@ void Locker::file_eval(ScatterLock *lock, bool *need_issue) else if (lock->get_state() != LOCK_EXCL && !lock->is_rdlocked() && //!lock->is_waiter_for(SimpleLock::WAIT_WR) && - ((wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) || - (in->inode.is_dir() && !in->has_subtree_or_exporting_dirfrag())) && - in->get_target_loner() >= 0) { + in->get_target_loner() >= 0 && + (in->is_dir() ? + !in->has_subtree_or_exporting_dirfrag() : + (wanted & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GBUFFER)))) { dout(7) << "file_eval stable, bump to loner " << *lock << " on " << *lock->get_parent() << dendl; file_excl(lock, need_issue); -- 2.39.5