]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix filelock state when Fsc is issued 35841/head
authorXiubo Li <xiubli@redhat.com>
Tue, 16 Jun 2020 00:01:28 +0000 (20:01 -0400)
committerVicente Cheng <freeze.bilsted@gmail.com>
Tue, 30 Jun 2020 07:29:27 +0000 (07:29 +0000)
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>
(cherry picked from commit df682263d3f302333cdd76484bd56902133ed82f)

src/mds/CInode.cc

index 0c79d4f7ac3bf51c8fca87110d3aeb86c0cd54a3..44658a8446e8628e344496f29d451498d83351a9 100644 (file)
@@ -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