]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: fix filelock state when Fsc is issued
authorXiubo Li <xiubli@redhat.com>
Tue, 16 Jun 2020 00:01:28 +0000 (20:01 -0400)
committerXiubo Li <xiubli@redhat.com>
Tue, 16 Jun 2020 00:19:14 +0000 (20:19 -0400)
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 <xiubli@redhat.com>
src/mds/CInode.cc

index 200351f4feac3a88b0bffffba889ed7033867bff..4ed2fbda79a8261d1497cc3c9030f5eeeb15d816 100644 (file)
@@ -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