From 3d098d9f5a05bd2aaff43b05e0b486325443939e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 3 Jul 2008 10:40:50 -0700 Subject: [PATCH] mds: add snaplock --- src/include/ceph_fs.h | 1 + src/mds/CInode.cc | 23 ++++++++++++++++++----- src/mds/CInode.h | 12 +++++++++++- src/mds/Locker.cc | 2 ++ src/mds/SimpleLock.h | 1 + 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index dd05074cc6e5e..7c25e46baa740 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -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 */ diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 7e49b632ec244..535f0ce477ce8 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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); } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 4a1e349abd2f4..25360c8b87214 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -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); } }; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 0880922ec2634..1a10d1c435da8 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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; } } diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index 6b59852df8d18..083f8038d0fb3 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -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; } -- 2.39.5