bool Locker::eval(CInode *in, int mask, bool caps_imported)
{
bool need_issue = false;
+ list<Context*> finishers;
dout(10) << "eval " << mask << " " << *in << dendl;
retry:
if (mask & CEPH_LOCK_IFILE)
- eval_any(&in->filelock, &need_issue, caps_imported);
+ eval_any(&in->filelock, &need_issue, &finishers, caps_imported);
if (mask & CEPH_LOCK_IAUTH)
- eval_any(&in->authlock, &need_issue, caps_imported);
+ eval_any(&in->authlock, &need_issue, &finishers, caps_imported);
if (mask & CEPH_LOCK_ILINK)
- eval_any(&in->linklock, &need_issue,caps_imported);
+ eval_any(&in->linklock, &need_issue, &finishers, caps_imported);
if (mask & CEPH_LOCK_IXATTR)
- eval_any(&in->xattrlock, &need_issue, caps_imported);
+ eval_any(&in->xattrlock, &need_issue, &finishers, caps_imported);
if (mask & CEPH_LOCK_INEST)
- eval_any(&in->nestlock, &need_issue, caps_imported);
+ eval_any(&in->nestlock, &need_issue, &finishers, caps_imported);
if (mask & CEPH_LOCK_IFLOCK)
- eval_any(&in->flocklock, &need_issue, caps_imported);
+ eval_any(&in->flocklock, &need_issue, &finishers, caps_imported);
if (mask & CEPH_LOCK_IPOLICY)
- eval_any(&in->policylock, &need_issue, caps_imported);
+ eval_any(&in->policylock, &need_issue, &finishers, caps_imported);
// drop loner?
if (in->is_auth() && in->is_head() && in->get_wanted_loner() != in->get_loner()) {
}
}
+ finish_contexts(g_ceph_context, finishers);
+
if (need_issue && in->is_head())
issue_caps(in);
void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, list<Context*> *pfinishers=0);
void eval(SimpleLock *lock, bool *need_issue);
- void eval_any(SimpleLock *lock, bool *need_issue, bool first=false) {
+ void eval_any(SimpleLock *lock, bool *need_issue, list<Context*> *pfinishers=0, bool first=false) {
if (!lock->is_stable())
- eval_gather(lock, first, need_issue);
+ eval_gather(lock, first, need_issue, pfinishers);
else if (lock->get_parent()->is_auth())
eval(lock, need_issue);
}