Whamcloud - gitweb
LU-7549 mdt: cancel the atomic lock in the same thread 77/17577/7
authorDi Wang <di.wang@intel.com>
Sat, 12 Dec 2015 08:36:08 +0000 (00:36 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 5 Jan 2016 00:49:19 +0000 (00:49 +0000)
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>
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_reint.c

index d462496..9c0c406 100644 (file)
@@ -2259,7 +2259,8 @@ int mdt_remote_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
        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);
index 2ad5259..1dbae87 100644 (file)
@@ -1340,8 +1340,9 @@ again:
                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);