]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: basic xattr map, lock
authorSage Weil <sage@newdream.net>
Mon, 12 May 2008 04:52:13 +0000 (21:52 -0700)
committerSage Weil <sage@newdream.net>
Mon, 19 May 2008 16:06:22 +0000 (09:06 -0700)
src/include/ceph_fs.h
src/mds/CDir.cc
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc
src/mds/SimpleLock.h
src/messages/MClientReply.h

index 7e866cb71639e4006c263f85366be78298014b5d..41ef0c0cc6dba0cea3748e9827956510e3385be4 100644 (file)
@@ -411,7 +411,8 @@ struct ceph_mds_getmap {
 #define CEPH_LOCK_ILINK       16
 #define CEPH_LOCK_IDFT        32    /* dir frag tree */
 #define CEPH_LOCK_IDIR        64    /* mds internal */
-#define CEPH_LOCK_INO         128   /* immutable inode bits; not actually a lock */
+#define CEPH_LOCK_IXATTR      128
+#define CEPH_LOCK_INO         256   /* immutable inode bits; not actually a lock */
 
 #define CEPH_LOCK_ICONTENT    (CEPH_LOCK_IFILE|CEPH_LOCK_IDIR)  /* alias for either filelock or dirlock */
 
@@ -429,6 +430,7 @@ struct ceph_mds_getmap {
 #define CEPH_STAT_MASK_MTIME    CEPH_LOCK_ICONTENT
 #define CEPH_STAT_MASK_SIZE     CEPH_LOCK_ICONTENT
 #define CEPH_STAT_MASK_ATIME    CEPH_LOCK_ICONTENT  /* fixme */
+#define CEPH_STAT_MASK_XATTR    CEPH_LOCK_IXATTR
 #define CEPH_STAT_MASK_INODE_ALL (CEPH_LOCK_ICONTENT|CEPH_LOCK_IAUTH|CEPH_LOCK_ILINK|CEPH_LOCK_INO)
 
 #define CEPH_UTIME_ATIME               1
index 2466b41976ac8b0331c058c86080771ab4f5cd26..e635f8c84d39f78c2ce9ca3a3e382e423f58d9c0 100644 (file)
@@ -942,6 +942,9 @@ void CDir::_fetched(bufferlist &bl)
 
       fragtree_t fragtree;
       ::decode(fragtree, p);
+
+      map<string, bufferptr> xattrs;
+      ::decode(xattrs, p);
       
       if (dn) {
         if (dn->get_inode() == 0) {
@@ -969,7 +972,7 @@ void CDir::_fetched(bufferlist &bl)
          
          // dirfragtree
          in->dirfragtree.swap(fragtree);
-
+         in->xattrs.swap(xattrs);
          // add 
          cache->add_inode( in );
        
@@ -1186,6 +1189,7 @@ void CDir::_commit(version_t want)
       }
 
       ::encode(in->dirfragtree, bl);
+      ::encode(in->xattrs, bl);
     }
   }
   assert(n == 0);
index d78b1b4f02ff3a5202780f2c660d8c7276b6f00d..cc7eaeaf9895a7eb9fbe200814e586da43af1ea1 100644 (file)
@@ -76,6 +76,7 @@ ostream& operator<<(ostream& out, CInode& in)
   out << " " << in.dirfragtreelock;
   out << " " << in.filelock;
   out << " " << in.dirlock;
+  out << " " << in.xattrlock;
   
   if (in.inode.max_size)
     out << " size=" << in.inode.size << "/" << in.inode.max_size;
@@ -533,6 +534,10 @@ void CInode::encode_lock_state(int type, bufferlist& bl)
       ::encode(frag_sizes, bl);
     }
     break;
+
+  case CEPH_LOCK_IXATTR:
+    ::encode(xattrs, bl);
+    break;
   
   default:
     assert(0);
@@ -602,6 +607,10 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
     }
     break;
 
+  case CEPH_LOCK_IXATTR:
+    ::decode(xattrs, p);
+    break;
+
   default:
     assert(0);
   }
@@ -794,6 +803,7 @@ void CInode::encode_export(bufferlist& bl)
   ::encode(inode, bl);
   ::encode(symlink, bl);
   ::encode(dirfragtree, bl);
+  ::encode(xattrs, bl);
 
   bool dirty = is_dirty();
   ::encode(dirty, bl);
@@ -807,6 +817,7 @@ void CInode::encode_export(bufferlist& bl)
   ::encode(dirfragtreelock, bl);
   ::encode(filelock, bl);
   ::encode(dirlock, bl);
+  ::encode(xattrlock, bl);
 
   get(PIN_TEMPEXPORTING);
 }
@@ -833,6 +844,7 @@ void CInode::decode_import(bufferlist::iterator& p,
 
   ::decode(symlink, p);
   ::decode(dirfragtree, p);
+  ::decode(xattrs, p);
 
   bool dirty;
   ::decode(dirty, p);
@@ -849,4 +861,5 @@ void CInode::decode_import(bufferlist::iterator& p,
   ::decode(dirfragtreelock, p);
   ::decode(filelock, p);
   ::decode(dirlock, p);
+  ::decode(xattrlock, p);
 }
index bb0e79767bec0f4040fd1303cd40ea2fcc6810c4..729f32899a6e9abd2d03efba4c119982a0278947 100644 (file)
@@ -117,6 +117,7 @@ class CInode : public MDSCacheObject {
   static const int WAIT_FILELOCK_OFFSET = 5 + 3*SimpleLock::WAIT_BITS;
   static const int WAIT_DIRLOCK_OFFSET = 5 + 4*SimpleLock::WAIT_BITS;
   static const int WAIT_VERSIONLOCK_OFFSET = 5 + 5*SimpleLock::WAIT_BITS;
+  static const int WAIT_XATTRLOCK_OFFSET = 5 + 6*SimpleLock::WAIT_BITS;
 
   static const int WAIT_ANY_MASK       = (0xffffffff);
 
@@ -131,6 +132,7 @@ class CInode : public MDSCacheObject {
   // inode contents proper
   inode_t          inode;        // the inode itself
   string           symlink;      // symlink dest, if symlink
+  map<string, bufferptr> xattrs;
   fragtree_t       dirfragtree;  // dir frag tree, if any.  always consistent with our dirfrag map.
   map<frag_t,int>  dirfrag_size; // size of each dirfrag
 
@@ -250,7 +252,8 @@ public:
     linklock(this, CEPH_LOCK_ILINK, WAIT_LINKLOCK_OFFSET),
     dirfragtreelock(this, CEPH_LOCK_IDFT, WAIT_DIRFRAGTREELOCK_OFFSET),
     filelock(this, CEPH_LOCK_IFILE, WAIT_FILELOCK_OFFSET),
-    dirlock(this, CEPH_LOCK_IDIR, WAIT_DIRLOCK_OFFSET)
+    dirlock(this, CEPH_LOCK_IDIR, WAIT_DIRLOCK_OFFSET),
+    xattrlock(this, CEPH_LOCK_IXATTR, WAIT_XATTRLOCK_OFFSET)
   {
     memset(&inode, 0, sizeof(inode));
     state = 0;  
@@ -336,6 +339,7 @@ public:
   ScatterLock dirfragtreelock;
   FileLock   filelock;
   ScatterLock dirlock;
+  SimpleLock xattrlock;
 
 
   SimpleLock* get_lock(int type) {
@@ -345,6 +349,7 @@ public:
     case CEPH_LOCK_ILINK: return &linklock;
     case CEPH_LOCK_IDFT: return &dirfragtreelock;
     case CEPH_LOCK_IDIR: return &dirlock;
+    case CEPH_LOCK_IXATTR: return &xattrlock;
     }
     return 0;
   }
@@ -469,6 +474,7 @@ public:
       filelock.replicate_relax();
 
     dirlock.replicate_relax();
+    xattrlock.replicate_relax();
   }
 
 
@@ -563,7 +569,7 @@ class CInodeDiscover {
   inode_t    inode;
   string     symlink;
   fragtree_t dirfragtree;
-
+  map<string, bufferptr> xattrs;
   __s32        replica_nonce;
   
   __u32      authlock_state;
@@ -571,6 +577,7 @@ class CInodeDiscover {
   __u32      dirfragtreelock_state;
   __u32      filelock_state;
   __u32      dirlock_state;
+  __u32      xattrlock_state;
 
  public:
   CInodeDiscover() {}
@@ -578,6 +585,7 @@ class CInodeDiscover {
     inode = in->inode;
     symlink = in->symlink;
     dirfragtree = in->dirfragtree;
+    xattrs = in->xattrs;
 
     replica_nonce = nonce;
 
@@ -586,6 +594,7 @@ class CInodeDiscover {
     dirfragtreelock_state = in->dirfragtreelock.get_replica_state();
     filelock_state = in->filelock.get_replica_state();
     dirlock_state = in->dirlock.get_replica_state();
+    xattrlock_state = in->xattrlock.get_replica_state();
   }
   CInodeDiscover(bufferlist::iterator &p) {
     decode(p);
@@ -598,6 +607,7 @@ class CInodeDiscover {
     in->inode = inode;
     in->symlink = symlink;
     in->dirfragtree = dirfragtree;
+    in->xattrs = xattrs;
     in->replica_nonce = replica_nonce;
   }
   void init_inode_locks(CInode *in) {
@@ -606,30 +616,35 @@ class CInodeDiscover {
     in->dirfragtreelock.set_state(dirfragtreelock_state);
     in->filelock.set_state(filelock_state);
     in->dirlock.set_state(dirlock_state);
+    in->xattrlock.set_state(xattrlock_state);
   }
   
   void encode(bufferlist &bl) const {
     ::encode(inode, bl);
     ::encode(symlink, bl);
     ::encode(dirfragtree, bl);
+    ::encode(xattrs, bl);
     ::encode(replica_nonce, bl);
     ::encode(authlock_state, bl);
     ::encode(linklock_state, bl);
     ::encode(dirfragtreelock_state, bl);
     ::encode(filelock_state, bl);
     ::encode(dirlock_state, bl);
+    ::encode(xattrlock_state, bl);
   }
 
   void decode(bufferlist::iterator &p) {
     ::decode(inode, p);
     ::decode(symlink, p);
     ::decode(dirfragtree, p);
+    ::decode(xattrs, p);
     ::decode(replica_nonce, p);
     ::decode(authlock_state, p);
     ::decode(linklock_state, p);
     ::decode(dirfragtreelock_state, p);
     ::decode(filelock_state, p);
     ::decode(dirlock_state, p);
+    ::decode(xattrlock_state, p);
   }  
 
 };
index c24ae74c4f260e41ffb9c06789d3e4d8cacfe95a..4868d969d41cac79cf14edf0630fa6ce9469000e 100644 (file)
@@ -1233,6 +1233,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info)
   case CEPH_LOCK_IDFT:
   case CEPH_LOCK_IFILE:
   case CEPH_LOCK_IDIR:
+  case CEPH_LOCK_IXATTR:
     {
       CInode *in = mdcache->get_inode(info.ino);
       if (!in) {
@@ -1245,6 +1246,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info)
       case CEPH_LOCK_IDFT: return &in->dirfragtreelock;
       case CEPH_LOCK_IFILE: return &in->filelock;
       case CEPH_LOCK_IDIR: return &in->dirlock;
+      case CEPH_LOCK_IXATTR: return &in->xattrlock;
       }
     }
 
index a4464514230129fe85519adce96b9400a0f92d24..ddb865b1ddd8715d8c32e9325356d7dc3eaaf422 100644 (file)
@@ -28,6 +28,7 @@ inline const char *get_lock_type_name(int t) {
   case CEPH_LOCK_ILINK: return "ilink";
   case CEPH_LOCK_IDFT: return "idft";
   case CEPH_LOCK_IDIR: return "idir";
+  case CEPH_LOCK_IXATTR: return "ixattr";
   case CEPH_LOCK_INO: return "ino";
   default: assert(0); return 0;
   }
index 2e0e602e70602e9c9cf3466b3fefbe7d37a1b80d..435da377ae7c9e15690b739c4a92b54c1f27bef0 100644 (file)
@@ -112,6 +112,7 @@ struct InodeStat {
   
   string  symlink;   // symlink content (if symlink)
   fragtree_t dirfragtree;
+  map<string, bufferptr> xattrs;
 
  public:
   InodeStat() {}
@@ -145,6 +146,7 @@ struct InodeStat {
       n--;
     }
     ::decode(symlink, p);
+    ::decode(xattrs, p);
   }
 
   static void encode(bufferlist &bl, CInode *in) {
@@ -176,6 +178,7 @@ struct InodeStat {
       ::encode(p->second, bl);
     }
     ::encode(in->symlink, bl);
+    ::encode(in->xattrs, bl);
   }
   
 };