]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix choose_lock_state() on xlocked object
authorSage Weil <sage.weil@dreamhost.com>
Tue, 12 Apr 2011 22:10:54 +0000 (15:10 -0700)
committerSage Weil <sage@newdream.net>
Wed, 13 Apr 2011 20:58:18 +0000 (13:58 -0700)
This crops up on inodes during clientreplay when we reconnect the cap
on the newly created (and still xlocked) object.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/CInode.h

index 307fef43c6ec4fd1a38c21eb3fea777ed9b033c2..73e693b63194627f615321e73628c5becaebfc34 100644 (file)
@@ -824,17 +824,21 @@ public:
     int shift = lock->get_cap_shift();
     int issued = (allissued >> shift) & lock->get_cap_mask();
     if (is_auth()) {
-      if (issued & CEPH_CAP_GEXCL)
-       lock->set_state(LOCK_EXCL);
-      else if (issued & CEPH_CAP_GWR)
-       lock->set_state(LOCK_MIX);
-      else if (lock->is_dirty()) {
-       if (is_replicated())
+      if (lock->is_xlocked()) {
+       // do nothing here
+      } else {
+       if (issued & CEPH_CAP_GEXCL)
+         lock->set_state(LOCK_EXCL);
+       else if (issued & CEPH_CAP_GWR)
          lock->set_state(LOCK_MIX);
-       else
-         lock->set_state(LOCK_LOCK);
-      } else
-       lock->set_state(LOCK_SYNC);
+       else if (lock->is_dirty()) {
+         if (is_replicated())
+           lock->set_state(LOCK_MIX);
+         else
+           lock->set_state(LOCK_LOCK);
+       } else
+         lock->set_state(LOCK_SYNC);
+      }
     } else {
       // our states have already been chosen during rejoin.
       if (lock->is_xlocked())