if (lock->get_parent()->is_auth()) {
bool need_issue = false;
- if (lock->get_state() == LOCK_PREXLOCK)
+ if (lock->get_state() == LOCK_PREXLOCK) {
_finish_xlock(lock, -1, &need_issue);
+ } else if (lock->get_state() == LOCK_LOCK_XLOCK &&
+ lock->get_num_xlocks() == 0) {
+ lock->set_state(LOCK_XLOCKDONE);
+ eval_gather(lock, true, &need_issue);
+ }
if (need_issue)
pneed_issue->insert(static_cast<CInode *>(lock->get_parent()));
}
SimpleLock::WAIT_WR |
SimpleLock::WAIT_RD, 0);
} else {
- if (lock->get_num_xlocks() == 0)
+ if (lock->get_num_xlocks() == 0) {
+ if (lock->get_state() == LOCK_LOCK_XLOCK)
+ lock->set_state(LOCK_XLOCKDONE);
_finish_xlock(lock, xlocker, &do_issue);
+ }
}
if (do_issue) {