]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add snaplock
authorSage Weil <sage@newdream.net>
Thu, 3 Jul 2008 17:40:50 +0000 (10:40 -0700)
committerSage Weil <sage@newdream.net>
Thu, 3 Jul 2008 17:51:43 +0000 (10:51 -0700)
src/include/ceph_fs.h
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc
src/mds/SimpleLock.h

index dd05074cc6e5e47ead2609c8a8be8e6dbe77da18..7c25e46baa7404a5aef25659e785e2b378b408a6 100644 (file)
@@ -482,6 +482,7 @@ struct ceph_mds_getmap {
 #define CEPH_LOCK_IDFT        32    /* dir frag tree */
 #define CEPH_LOCK_IDIR        64    /* mds internal */
 #define CEPH_LOCK_IXATTR      128
+#define CEPH_LOCK_ISNAP       256
 #define CEPH_LOCK_INO         2048   /* immutable inode bits; not actually a lock */
 
 #define CEPH_LOCK_ICONTENT    (CEPH_LOCK_IFILE|CEPH_LOCK_IDIR)  /* alias for either filelock or dirlock */
index 7e49b632ec244180258d1ed2761a019a9b77f494..535f0ce477ce810798ff8757b4f2453456f95a17 100644 (file)
@@ -64,8 +64,10 @@ ostream& operator<<(ostream& out, CInode& in)
     assert(in.get_replica_nonce() >= 0);
   }
 
-  if (in.is_symlink()) out << " symlink='" << in.symlink << "'";
-  if (in.is_dir() && !in.dirfragtree.empty()) out << " " << in.dirfragtree;
+  if (in.is_symlink())
+    out << " symlink='" << in.symlink << "'";
+  if (in.is_dir() && !in.dirfragtree.empty())
+    out << " " << in.dirfragtree;
   
   out << " v" << in.get_version();
 
@@ -107,10 +109,11 @@ ostream& operator<<(ostream& out, CInode& in)
   // locks
   out << " " << in.authlock;
   out << " " << in.linklock;
-  out << " " << in.dirfragtreelock;
-  if (in.inode.is_dir())
+  if (in.inode.is_dir()) {
+    out << " " << in.dirfragtreelock;
     out << " " << in.dirlock;
-  else
+    out << " " << in.snaplock;
+  } else
     out << " " << in.filelock;
   out << " " << in.xattrlock;
   
@@ -592,6 +595,10 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
   case CEPH_LOCK_IXATTR:
     ::encode(xattrs, bl);
     break;
+
+  case CEPH_LOCK_ISNAP:
+    encode_snap(bl);
+    break;
   
   default:
     assert(0);
@@ -713,6 +720,10 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
     ::decode(xattrs, p);
     break;
 
+  case CEPH_LOCK_ISNAP:
+    decode_snap(p);
+    break;
+
   default:
     assert(0);
   }
@@ -1041,6 +1052,7 @@ void CInode::encode_export(bufferlist& bl)
   ::encode(filelock, bl);
   ::encode(dirlock, bl);
   ::encode(xattrlock, bl);
+  ::encode(snaplock, bl);
 
   get(PIN_TEMPEXPORTING);
 }
@@ -1084,4 +1096,5 @@ void CInode::decode_import(bufferlist::iterator& p,
   ::decode(filelock, p);
   ::decode(dirlock, p);
   ::decode(xattrlock, p);
+  ::decode(snaplock, p);
 }
index 4a1e349abd2f4367f4b806b64128c055f24714b4..25360c8b87214edb1390a5a8d874f9a0bfcfda98 100644 (file)
@@ -117,6 +117,7 @@ class CInode : public MDSCacheObject {
   static const int WAIT_DIRLOCK_OFFSET         = 4 + 3*SimpleLock::WAIT_BITS; // same
   static const int WAIT_VERSIONLOCK_OFFSET     = 4 + 4*SimpleLock::WAIT_BITS;
   static const int WAIT_XATTRLOCK_OFFSET       = 4 + 5*SimpleLock::WAIT_BITS;
+  static const int WAIT_SNAPLOCK_OFFSET        = 4 + 6*SimpleLock::WAIT_BITS;
 
   static const int WAIT_ANY_MASK       = (0xffffffff);
 
@@ -276,7 +277,8 @@ private:
     dirfragtreelock(this, CEPH_LOCK_IDFT, WAIT_DIRFRAGTREELOCK_OFFSET),
     filelock(this, CEPH_LOCK_IFILE, WAIT_FILELOCK_OFFSET),
     dirlock(this, CEPH_LOCK_IDIR, WAIT_DIRLOCK_OFFSET),
-    xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET)
+    xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET),
+    snaplock(this, CEPH_LOCK_ISNAP, WAIT_SNAPLOCK_OFFSET)
   {
     memset(&inode, 0, sizeof(inode));
     state = 0;  
@@ -414,6 +416,7 @@ public:
   FileLock   filelock;
   ScatterLock dirlock;
   SimpleLock xattrlock;
+  SimpleLock snaplock;
 
   SimpleLock* get_lock(int type) {
     switch (type) {
@@ -423,6 +426,7 @@ public:
     case CEPH_LOCK_IDFT: return &dirfragtreelock;
     case CEPH_LOCK_IDIR: return &dirlock;
     case CEPH_LOCK_IXATTR: return &xattrlock;
+    case CEPH_LOCK_ISNAP: return &snaplock;
     }
     return 0;
   }
@@ -568,6 +572,7 @@ public:
 
     dirlock.replicate_relax();
     xattrlock.replicate_relax();
+    snaplock.replicate_relax();
   }
 
 
@@ -680,6 +685,7 @@ class CInodeDiscover {
   __u32      filelock_state;
   __u32      dirlock_state;
   __u32      xattrlock_state;
+  __u32      snaplock_state;
 
  public:
   CInodeDiscover() {}
@@ -697,6 +703,7 @@ class CInodeDiscover {
     filelock_state = in->filelock.get_replica_state();
     dirlock_state = in->dirlock.get_replica_state();
     xattrlock_state = in->xattrlock.get_replica_state();
+    snaplock_state = in->snaplock.get_replica_state();
   }
   CInodeDiscover(bufferlist::iterator &p) {
     decode(p);
@@ -721,6 +728,7 @@ class CInodeDiscover {
     in->filelock.set_state(filelock_state);
     in->dirlock.set_state(dirlock_state);
     in->xattrlock.set_state(xattrlock_state);
+    in->snaplock.set_state(snaplock_state);
   }
   
   void encode(bufferlist &bl) const {
@@ -735,6 +743,7 @@ class CInodeDiscover {
     ::encode(filelock_state, bl);
     ::encode(dirlock_state, bl);
     ::encode(xattrlock_state, bl);
+    ::encode(snaplock_state, bl);
   }
 
   void decode(bufferlist::iterator &p) {
@@ -749,6 +758,7 @@ class CInodeDiscover {
     ::decode(filelock_state, p);
     ::decode(dirlock_state, p);
     ::decode(xattrlock_state, p);
+    ::decode(snaplock_state, p);
   }  
 
 };
index 0880922ec26344df82d2e8ad7a8165e6e6ffe9b6..1a10d1c435da8d6041a270454e4e1e396b31c00b 100644 (file)
@@ -1476,6 +1476,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info)
   case CEPH_LOCK_IFILE:
   case CEPH_LOCK_IDIR:
   case CEPH_LOCK_IXATTR:
+  case CEPH_LOCK_ISNAP:
     {
       CInode *in = mdcache->get_inode(info.ino);
       if (!in) {
@@ -1489,6 +1490,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info)
       case CEPH_LOCK_IFILE: return &in->filelock;
       case CEPH_LOCK_IDIR: return &in->dirlock;
       case CEPH_LOCK_IXATTR: return &in->xattrlock;
+      case CEPH_LOCK_ISNAP: return &in->snaplock;
       }
     }
 
index 6b59852df8d186b12cd1b3d2bccfcd8a4dfa558e..083f8038d0fb33741994c74890237fef43d9495d 100644 (file)
@@ -29,6 +29,7 @@ inline const char *get_lock_type_name(int t) {
   case CEPH_LOCK_IDFT: return "idft";
   case CEPH_LOCK_IDIR: return "idir";
   case CEPH_LOCK_IXATTR: return "ixattr";
+  case CEPH_LOCK_ISNAP: return "isnap";
   case CEPH_LOCK_INO: return "ino";
   default: assert(0); return 0;
   }