From: Xiubo Li Date: Tue, 16 Jun 2020 00:01:28 +0000 (-0400) Subject: mds: fix filelock state when Fsc is issued X-Git-Tag: v14.2.11~37^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F35841%2Fhead;p=ceph.git 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 (cherry picked from commit df682263d3f302333cdd76484bd56902133ed82f) --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 0c79d4f7ac3..44658a8446e 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -2931,9 +2931,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