return;
}
- if (in && lock->get_state() != LOCK_EXCL)
- in->loner_cap = -1;
-
switch (lock->get_state()) {
// to mixed
case LOCK_TSYN_MIX:
lock->get_parent()->auth_unpin(lock);
}
+ if (in)
+ in->try_drop_loner();
+
lock->set_state(next);
lock->finish_waiters(SimpleLock::WAIT_STABLE|SimpleLock::WAIT_WR|SimpleLock::WAIT_RD|SimpleLock::WAIT_XLOCK);
}
-
// ------------------
// rdlock
lock->encode_locked_state(data);
send_lock_message(lock, LOCK_AC_SYNC, data);
}
-
+ if (in)
+ in->try_drop_loner();
lock->set_state(LOCK_SYNC);
lock->finish_waiters(SimpleLock::WAIT_RD|SimpleLock::WAIT_STABLE);
return true;
if (gather) {
lock->get_parent()->auth_pin(lock);
} else {
+ if (in)
+ in->try_drop_loner();
lock->set_state(LOCK_LOCK);
- in->loner_cap = -1;
lock->finish_waiters(FileLock::WAIT_XLOCK|FileLock::WAIT_WR|FileLock::WAIT_STABLE);
}
}
lock->encode_locked_state(data);
send_lock_message(lock, LOCK_AC_SCATTER, data);
}
+
+ ((CInode *)lock->get_parent())->try_drop_loner();
+
lock->set_state(LOCK_MIX);
lock->finish_waiters(ScatterLock::WAIT_WR|ScatterLock::WAIT_STABLE);
return true;
}
// do tempsync
+ ((CInode *)lock->get_parent())->try_drop_loner();
+
lock->set_state(LOCK_TSYN);
lock->finish_waiters(ScatterLock::WAIT_RD|ScatterLock::WAIT_STABLE);
}
!lock->is_rdlocked() &&
!lock->is_waiter_for(SimpleLock::WAIT_WR) &&
((wanted & (CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER)) || in->inode.is_dir()) &&
- in->choose_loner()) {
+ in->try_choose_loner()) {
dout(7) << "file_eval stable, bump to loner " << *lock
<< " on " << *lock->get_parent() << dendl;
- file_loner(lock);
+ file_excl(lock);
}
// * -> mixed?
if (gather)
lock->get_parent()->auth_pin(lock);
else {
+ in->try_drop_loner();
lock->set_state(LOCK_MIX);
- in->loner_cap = -1;
issue_caps(in);
}
}
}
-void Locker::file_loner(FileLock *lock)
+void Locker::file_excl(FileLock *lock)
{
CInode *in = (CInode*)lock->get_parent();
dout(7) << "file_loner " << *lock << " on " << *lock->get_parent() << dendl;
// simple
public:
void try_simple_eval(SimpleLock *lock);
- void simple_eval_gather(SimpleLock *lock);
bool simple_rdlock_try(SimpleLock *lock, Context *con);
protected:
void simple_eval(SimpleLock *lock);
void handle_simple_lock(SimpleLock *lock, MLock *m);
+
bool simple_sync(SimpleLock *lock);
void simple_lock(SimpleLock *lock);
void simple_xlock(SimpleLock *lock);
- bool simple_rdlock_start(SimpleLock *lock, MDRequest *mut);
- void simple_rdlock_finish(SimpleLock *lock, Mutation *mut);
- bool simple_wrlock_force(SimpleLock *lock, Mutation *mut);
- bool simple_wrlock_start(SimpleLock *lock, MDRequest *mut);
- void simple_wrlock_finish(SimpleLock *lock, Mutation *mut);
- bool simple_xlock_start(SimpleLock *lock, MDRequest *mut);
- void simple_xlock_finish(SimpleLock *lock, Mutation *mut);
public:
bool dentry_can_rdlock_trace(vector<CDentry*>& trace);
public:
void try_scatter_eval(ScatterLock *lock);
void scatter_eval(ScatterLock *lock); // public for MDCache::adjust_subtree_auth()
- void scatter_eval_gather(ScatterLock *lock);
void scatter_tick();
void scatter_nudge(ScatterLock *lock, Context *c);
protected:
- bool scatter_lock_fastpath(ScatterLock *lock); // called by LogSegment::try_to_expire
- void scatter_lock(ScatterLock *lock, bool nowait=false); // called by LogSegment::try_to_expire
-
void handle_scatter_lock(ScatterLock *lock, MLock *m);
void _scatter_replica_lock(ScatterLock *lock, int auth);
- void scatter_sync(ScatterLock *lock);
bool scatter_scatter_fastpath(ScatterLock *lock);
void scatter_scatter(ScatterLock *lock, bool nowait=false);
void scatter_tempsync(ScatterLock *lock);
- bool scatter_rdlock_start(ScatterLock *lock, MDRequest *mut);
- void scatter_rdlock_finish(ScatterLock *lock, Mutation *mut);
-public:
- bool scatter_wrlock_try(ScatterLock *lock, Mutation *mut, bool initiate);
-protected:
- bool scatter_wrlock_start(ScatterLock *lock, MDRequest *mut);
-public:
- void scatter_wrlock_finish(ScatterLock *lock, Mutation *mut);
-protected:
- bool scatter_xlock_start(ScatterLock *lock, MDRequest *mut);
- void scatter_xlock_finish(ScatterLock *lock, Mutation *mut);
void scatter_writebehind(ScatterLock *lock);
class C_Locker_ScatterWB : public Context {
// file
public:
- void file_eval_gather(ScatterLock *lock);
void try_file_eval(ScatterLock *lock);
void file_eval(ScatterLock *lock);
protected:
void handle_file_lock(ScatterLock *lock, MLock *m);
- bool file_sync(ScatterLock *lock);
- void file_lock(ScatterLock *lock);
void file_mixed(ScatterLock *lock);
- void file_loner(ScatterLock *lock);
- bool file_rdlock_try(ScatterLock *lock, Context *con);
- bool file_rdlock_start(ScatterLock *lock, MDRequest *mut);
- void file_rdlock_finish(ScatterLock *lock, Mutation *mut);
- bool file_wrlock_force(ScatterLock *lock, Mutation *mut);
- bool file_wrlock_start(ScatterLock *lock, MDRequest *mut);
- void file_wrlock_finish(ScatterLock *lock, Mutation *mut);
- bool file_xlock_start(ScatterLock *lock, MDRequest *mut);
- void file_xlock_finish(ScatterLock *lock, Mutation *mut);
+ void file_excl(ScatterLock *lock);
xlist<ScatterLock*> updated_filelocks;
public: