]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix xlock state asserts for LocalLock
authorSage Weil <sage@newdream.net>
Fri, 24 Sep 2010 22:54:57 +0000 (15:54 -0700)
committerSage Weil <sage@newdream.net>
Fri, 24 Sep 2010 23:27:45 +0000 (16:27 -0700)
The LocalLock (versionlocks) allow xlocking but have only a single state
(LOCK_LOCK).

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/LocalLock.h
src/mds/SimpleLock.h

index 70450e39592f4e553cd945225c281e9459439d51..432fc8100954912d23ce60f15b51ec67bc77f7b0 100644 (file)
@@ -27,6 +27,10 @@ public:
     set_state(LOCK_LOCK); // always.
   }
 
+  bool is_locallock() const {
+    return true;
+  }
+
   bool can_wrlock() {
     return !is_xlocked();
   }
index a5c2390153cbaac940a531aa046885616136af0e..c4a99ab21ce4858d6188bd26a4905b12f1b164b3 100644 (file)
@@ -223,6 +223,9 @@ public:
   virtual bool is_scatterlock() const {
     return false;
   }
+  virtual bool is_locallock() const {
+    return false;
+  }
 
   // parent
   MDSCacheObject *get_parent() { return parent; }
@@ -446,7 +449,7 @@ public:
   // xlock
   void get_xlock(Mutation *who, client_t client) { 
     assert(get_xlock_by() == 0);
-    assert(state == LOCK_XLOCK);
+    assert(state == LOCK_XLOCK || is_locallock());
     parent->get(MDSCacheObject::PIN_LOCK);
     more()->num_xlock++;
     more()->xlock_by = who; 
@@ -454,12 +457,13 @@ public:
   }
   void set_xlock_done() {
     assert(more()->xlock_by);
-    assert(state == LOCK_XLOCK);
-    state = LOCK_XLOCKDONE;
+    assert(state == LOCK_XLOCK || is_locallock());
+    if (!is_locallock())
+      state = LOCK_XLOCKDONE;
     more()->xlock_by = 0;
   }
   void put_xlock() {
-    assert(state == LOCK_XLOCK || state == LOCK_XLOCKDONE);
+    assert(state == LOCK_XLOCK || state == LOCK_XLOCKDONE || is_locallock());
     --more()->num_xlock;
     parent->put(MDSCacheObject::PIN_LOCK);
     if (more()->num_xlock == 0) {