From: Greg Farnum Date: Wed, 22 Sep 2010 21:48:39 +0000 (-0700) Subject: mds: add policylock to the inodes. X-Git-Tag: v0.22~69^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0277823597155487d096d5771161074b6b63e3c5;p=ceph.git mds: add policylock to the inodes. This will be used to cover per-directory default file distribution policies, and maybe other things that come up. --- diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 8c06e0de1e4..ba122f3794f 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -262,6 +262,7 @@ extern const char *ceph_mds_state_name(int s); #define CEPH_LOCK_IXATTR 2048 #define CEPH_LOCK_IFLOCK 4096 /* advisory file locks */ #define CEPH_LOCK_INO 8192 /* immutable inode bits; not a lock */ +#define CEPH_LOCK_IPOLICY 16384 /* policy lock on dirs. MDS internal */ /* client_session ops */ enum { diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index f8799cf6122..99e8237d2fe 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -58,6 +58,7 @@ LockType CInode::xattrlock_type(CEPH_LOCK_IXATTR); LockType CInode::snaplock_type(CEPH_LOCK_ISNAP); LockType CInode::nestlock_type(CEPH_LOCK_INEST); LockType CInode::flocklock_type(CEPH_LOCK_IFLOCK); +LockType CInode::policylock_type(CEPH_LOCK_IPOLICY); //int cinode_pins[CINODE_NUM_PINS]; // counts ostream& CInode::print_db_line_prefix(ostream& out) @@ -164,6 +165,8 @@ ostream& operator<<(ostream& out, CInode& in) out << " " << in.snaplock; if (!in.nestlock.is_sync_and_unlocked()) out << " " << in.nestlock; + if (!in.policylock.is_sync_and_unlocked()) + out << " " << in.policylock; } else { if (!in.flocklock.is_sync_and_unlocked()) out << " " << in.flocklock; @@ -2146,6 +2149,7 @@ void CInode::_encode_locks_full(bufferlist& bl) ::encode(snaplock, bl); ::encode(nestlock, bl); ::encode(flocklock, bl); + ::encode(policylock, bl); } void CInode::_decode_locks_full(bufferlist::iterator& p) { @@ -2157,6 +2161,7 @@ void CInode::_decode_locks_full(bufferlist::iterator& p) ::decode(snaplock, p); ::decode(nestlock, p); ::decode(flocklock, p); + ::decode(policylock, p); } void CInode::_encode_locks_state_for_replica(bufferlist& bl) @@ -2169,6 +2174,7 @@ void CInode::_encode_locks_state_for_replica(bufferlist& bl) xattrlock.encode_state_for_replica(bl); snaplock.encode_state_for_replica(bl); flocklock.encode_state_for_replica(bl); + policylock.encode_state_for_replica(bl); } void CInode::_decode_locks_state(bufferlist::iterator& p, bool is_new) { @@ -2180,6 +2186,7 @@ void CInode::_decode_locks_state(bufferlist::iterator& p, bool is_new) xattrlock.decode_state(p, is_new); snaplock.decode_state(p, is_new); flocklock.decode_state(p, is_new); + policylock.decode_state(p, is_new); } void CInode::_decode_locks_rejoin(bufferlist::iterator& p, list& waiters) { @@ -2191,6 +2198,7 @@ void CInode::_decode_locks_rejoin(bufferlist::iterator& p, list& waite xattrlock.decode_state_rejoin(p, waiters); snaplock.decode_state_rejoin(p, waiters); flocklock.decode_state_rejoin(p, waiters); + policylock.decode_state_rejoin(p, waiters); } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index cacd9a6a13d..08ff5fbd6d8 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -400,6 +400,7 @@ private: snaplock(this, &snaplock_type), nestlock(this, &nestlock_type), flocklock(this, &flocklock_type), + policylock(this, &policylock_type), loner_cap(-1), want_loner_cap(-1) { g_num_ino++; @@ -573,6 +574,7 @@ public: static LockType snaplock_type; static LockType nestlock_type; static LockType flocklock_type; + static LockType policylock_type; LocalLock versionlock; SimpleLock authlock; @@ -583,6 +585,7 @@ public: SimpleLock snaplock; ScatterLock nestlock; SimpleLock flocklock; + SimpleLock policylock; SimpleLock* get_lock(int type) { switch (type) { @@ -594,6 +597,7 @@ public: case CEPH_LOCK_ISNAP: return &snaplock; case CEPH_LOCK_INEST: return &nestlock; case CEPH_LOCK_IFLOCK: return &flocklock; + case CEPH_LOCK_IPOLICY: return &policylock; } return 0; } @@ -929,6 +933,7 @@ public: snaplock.replicate_relax(); nestlock.replicate_relax(); flocklock.replicate_relax(); + policylock.replicate_relax(); } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 9714f4f44ff..f4d8b2d99ba 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -630,6 +630,8 @@ bool Locker::eval(CInode *in, int mask) eval_any(&in->nestlock, &need_issue); if (mask & CEPH_LOCK_IFLOCK) eval_any(&in->flocklock, &need_issue); + if (mask & CEPH_LOCK_IPOLICY) + eval_any(&in->policylock, &need_issue); // drop loner? if (in->is_auth() && in->get_loner() >= 0 && in->get_wanted_loner() < 0) { @@ -2592,6 +2594,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info) case CEPH_LOCK_IXATTR: case CEPH_LOCK_ISNAP: case CEPH_LOCK_IFLOCK: + case CEPH_LOCK_IPOLICY: { CInode *in = mdcache->get_inode(info.ino, info.snapid); if (!in) { @@ -2607,6 +2610,7 @@ SimpleLock *Locker::get_lock(int lock_type, MDSCacheObjectInfo &info) case CEPH_LOCK_IXATTR: return &in->xattrlock; case CEPH_LOCK_ISNAP: return &in->snaplock; case CEPH_LOCK_IFLOCK: return &in->flocklock; + case CEPH_LOCK_IPOLICY: return &in->policylock; } } @@ -2639,6 +2643,7 @@ void Locker::handle_lock(MLock *m) case CEPH_LOCK_ISNAP: case CEPH_LOCK_IXATTR: case CEPH_LOCK_IFLOCK: + case CEPH_LOCK_IPOLICY: handle_simple_lock(lock, m); break; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 95710178519..78d7c7fce2b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -5319,6 +5319,7 @@ void MDCache::inode_remove_replica(CInode *in, int from) if (in->nestlock.remove_replica(from)) mds->locker->eval_gather(&in->nestlock); if (in->flocklock.remove_replica(from)) mds->locker->eval_gather(&in->flocklock); + if (in->policylock.remove_replica(from)) mds->locker->eval_gather(&in->policylock); // trim? maybe_eval_stray(in); diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index c9c6ad4bdef..0b46daa5b0f 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -1027,6 +1027,7 @@ void Migrator::finish_export_inode(CInode *in, utime_t now, list& fini in->nestlock.export_twiddle(); in->xattrlock.export_twiddle(); in->snaplock.export_twiddle(); + in->policylock.export_twiddle(); // mark auth assert(in->is_auth()); diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index 2e06b279d73..2e385a93835 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -33,6 +33,7 @@ inline const char *get_lock_type_name(int t) { case CEPH_LOCK_ISNAP: return "isnap"; case CEPH_LOCK_INO: return "ino"; case CEPH_LOCK_IFLOCK: return "iflock"; + case CEPH_LOCK_IPOLICY: return "ipolicy"; default: assert(0); return 0; } } @@ -60,6 +61,7 @@ struct LockType { case CEPH_LOCK_IXATTR: case CEPH_LOCK_ISNAP: case CEPH_LOCK_IFLOCK: + case CEPH_LOCK_IPOLICY: sm = &sm_simplelock; break; case CEPH_LOCK_IDFT: @@ -238,6 +240,7 @@ public: case CEPH_LOCK_ISNAP: return 8 + 8*SimpleLock::WAIT_BITS; case CEPH_LOCK_INEST: return 8 + 9*SimpleLock::WAIT_BITS; case CEPH_LOCK_IFLOCK: return 8 +10*SimpleLock::WAIT_BITS; + case CEPH_LOCK_IPOLICY: return 8 +11*SimpleLock::WAIT_BITS; default: assert(0); }