]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add wrlock bits to FileLock
authorSage Weil <sage@newdream.net>
Wed, 13 Feb 2008 11:14:53 +0000 (03:14 -0800)
committerSage Weil <sage@newdream.net>
Wed, 13 Feb 2008 11:14:53 +0000 (03:14 -0800)
src/mds/FileLock.h

index 9fd86ae9be20c669d620e374b2cb14e65324a2f1..cb0151cdf450b68b56909bcc363bc1ab0605e7b2 100644 (file)
@@ -95,8 +95,12 @@ any + statlite(mtime)
 class MDRequest;
 
 class FileLock : public SimpleLock {
+  int num_wrlock;
+
  public:
-  FileLock(MDSCacheObject *o, int t, int wo) : SimpleLock(o, t, wo) { }
+  FileLock(MDSCacheObject *o, int t, int wo) : 
+    SimpleLock(o, t, wo),
+    num_wrlock(0) { }
   
   int get_replica_state() {
     switch (state) {
@@ -155,6 +159,27 @@ class FileLock : public SimpleLock {
       return false;
   }
 
+  // wrlock
+  bool can_wrlock() {
+    return 
+      state == LOCK_LOCK || state == LOCK_GLOCKM || state == LOCK_GLOCKL ||
+      state == LOCK_MIXED || state == LOCK_GMIXEDL ||
+      state == LOCK_LONER || state == LOCK_GLONERM ||
+      state == LOCK_GSYNCM || state == LOCK_GSYNCL;
+  }
+  void get_wrlock() {
+    assert(can_wrlock());
+    if (num_wrlock == 0) parent->get(MDSCacheObject::PIN_LOCK);
+    ++num_wrlock;
+  }
+  void put_wrlock() {
+    --num_wrlock;
+    if (num_wrlock == 0) parent->put(MDSCacheObject::PIN_LOCK);
+  }
+  bool is_wrlocked() { return num_wrlock > 0; }
+  int get_num_wrlocks() { return num_wrlock; }
+
+
   // client caps allowed
   int caps_allowed_ever() {
     if (parent->is_auth())