lov.add_xlock(&dn->lock);
} else {
// force client to flush async dir operation if necessary
- if (cur->filelock.is_cached())
+ if (cur->filelock.is_cached() &&
+ !(mdr->lock_cache &&
+ static_cast<const MutationImpl*>(mdr->lock_cache)->is_wrlocked(&cur->filelock))) {
lov.add_wrlock(&cur->filelock);
+ }
lov.add_rdlock(&dn->lock);
}
if (!mds->locker->acquire_locks(mdr, lov)) {
lov.add_xlock(&dn->lock);
} else {
// force client to flush async dir operation if necessary
- if (cur->filelock.is_cached())
+ if (cur->filelock.is_cached() &&
+ !(mdr->lock_cache &&
+ static_cast<const MutationImpl*>(mdr->lock_cache)->is_wrlocked(&cur->filelock))) {
lov.add_wrlock(&cur->filelock);
+ }
lov.add_rdlock(&dn->lock);
}
if (!mds->locker->acquire_locks(mdr, lov)) {