#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 {
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)
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;
::encode(snaplock, bl);
::encode(nestlock, bl);
::encode(flocklock, bl);
+ ::encode(policylock, bl);
}
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)
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)
{
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<Context*>& waiters)
{
xattrlock.decode_state_rejoin(p, waiters);
snaplock.decode_state_rejoin(p, waiters);
flocklock.decode_state_rejoin(p, waiters);
+ policylock.decode_state_rejoin(p, waiters);
}
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++;
static LockType snaplock_type;
static LockType nestlock_type;
static LockType flocklock_type;
+ static LockType policylock_type;
LocalLock versionlock;
SimpleLock authlock;
SimpleLock snaplock;
ScatterLock nestlock;
SimpleLock flocklock;
+ SimpleLock policylock;
SimpleLock* get_lock(int type) {
switch (type) {
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;
}
snaplock.replicate_relax();
nestlock.replicate_relax();
flocklock.replicate_relax();
+ policylock.replicate_relax();
}
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) {
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) {
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;
}
}
case CEPH_LOCK_ISNAP:
case CEPH_LOCK_IXATTR:
case CEPH_LOCK_IFLOCK:
+ case CEPH_LOCK_IPOLICY:
handle_simple_lock(lock, m);
break;
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);
in->nestlock.export_twiddle();
in->xattrlock.export_twiddle();
in->snaplock.export_twiddle();
+ in->policylock.export_twiddle();
// mark auth
assert(in->is_auth());
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;
}
}
case CEPH_LOCK_IXATTR:
case CEPH_LOCK_ISNAP:
case CEPH_LOCK_IFLOCK:
+ case CEPH_LOCK_IPOLICY:
sm = &sm_simplelock;
break;
case CEPH_LOCK_IDFT:
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);
}