If cross-MDT lock has ATOMIC_CB flag, let's cancel it in
the same thread as blocking_ast(), to make sure the lock
is cancelled completely after unlock().
This will be used when MDT tries to cancel remote locks
during migration (see mdt_lock_objects_in_linkea()).
Only if the remote lock is cancelled completely, then
the next trylock will succeed.
Signed-off-by: Di Wang <di.wang@intel.com>
Change-Id: Ib23eb8eb312252e6eca680d08f8fcd89cf29339c
Reviewed-on: http://review.whamcloud.com/17577
Tested-by: Jenkins
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
switch (flag) {
case LDLM_CB_BLOCKING:
ldlm_lock2handle(lock, &lockh);
- rc = ldlm_cli_cancel(&lockh, LCF_ASYNC);
+ rc = ldlm_cli_cancel(&lockh,
+ ldlm_is_atomic_cb(lock) ? 0 : LCF_ASYNC);
if (rc < 0) {
CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc);
RETURN(rc);
if (rc == 0) {
mdt_unlock_list(info, lock_list, rc);
- CDEBUG(D_INFO, "%s: busy lock on "DFID".\n",
- mdt_obd_name(mdt), PFID(&fid));
+ CDEBUG(D_INFO, "%s: busy lock on "DFID" %s retry %d\n",
+ mdt_obd_name(mdt), PFID(&fid), name.ln_name,
+ retry_count);
if (retry_count == 0) {
mdt_object_put(info->mti_env, mdt_pobj);