Whamcloud - gitweb
LU-1588 lnet: deadlock while shutting down router
authorLiang Zhen <liang@whamcloud.com>
Sun, 1 Jul 2012 06:12:24 +0000 (14:12 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 3 Jul 2012 15:56:30 +0000 (11:56 -0400)
Should release lock on exiting of lnet_prune_rc_data(), otherwise
we will get deadlock on later attempting on lnet_net_lock().
Also, there is a wrong condition check in lnet_prune_rc_data()
can prevent router checker from shutting down.

Signed-off-by: Liang Zhen <liang@whamcloud.com>
Change-Id: I5292075453e61f300384043e2346df714c530303
Reviewed-on: http://review.whamcloud.com/3250
Tested-by: Hudson
Reviewed-by: Bobi Jam <bobijam@whamcloud.com>
Reviewed-by: Doug Oucharek <doug@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/lnet/router.c

index 81cc9d8..7c2a453 100644 (file)
@@ -1162,7 +1162,7 @@ lnet_prune_rc_data(int wait_unlink)
        while (!cfs_list_empty(&the_lnet.ln_rcd_zombie)) {
                cfs_list_for_each_entry_safe(rcd, tmp, &the_lnet.ln_rcd_zombie,
                                             rcd_list) {
-                       if (!LNetHandleIsInvalid(rcd->rcd_mdh))
+                       if (LNetHandleIsInvalid(rcd->rcd_mdh))
                                cfs_list_move(&rcd->rcd_list, &head);
                }
 
@@ -1179,7 +1179,7 @@ lnet_prune_rc_data(int wait_unlink)
                }
 
                if (!wait_unlink)
-                       break;
+                       return;
 
                i++;
                CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET,
@@ -1188,6 +1188,8 @@ lnet_prune_rc_data(int wait_unlink)
 
                lnet_net_lock(LNET_LOCK_EX);
        }
+
+       lnet_net_unlock(LNET_LOCK_EX);
 }