From df682263d3f302333cdd76484bd56902133ed82f Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 15 Jun 2020 20:01:28 -0400 Subject: [PATCH] mds: fix filelock state when Fsc is issued LOCK_MIX is is a transition state for muti MDSs could do read/write at the same time, but the Fcb caps are not allowed. When the Fsc caps are issued, the lock state should be excl. Fixes: https://tracker.ceph.com/issues/45935 Signed-off-by: Xiubo Li --- src/mds/CInode.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 200351f4fea..4ed2fbda79a 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -3173,9 +3173,12 @@ void CInode::choose_lock_state(SimpleLock *lock, int allissued) } else if (lock->get_state() != LOCK_MIX) { if (issued & (CEPH_CAP_GEXCL | CEPH_CAP_GBUFFER)) lock->set_state(LOCK_EXCL); - else if (issued & CEPH_CAP_GWR) - lock->set_state(LOCK_MIX); - else if (lock->is_dirty()) { + else if (issued & CEPH_CAP_GWR) { + if (issued & (CEPH_CAP_GCACHE | CEPH_CAP_GSHARED)) + lock->set_state(LOCK_EXCL); + else + lock->set_state(LOCK_MIX); + } else if (lock->is_dirty()) { if (is_replicated()) lock->set_state(LOCK_MIX); else