From f6d63067e1ec00009b9da5cdb263fe14e7e503e1 Mon Sep 17 00:00:00 2001 From: Amir Shehata Date: Fri, 5 Apr 2019 17:38:38 -0700 Subject: [PATCH] LU-12163 lnet: fix cpt locking In lnet_select_pathway() the call to lnet_handle_send_case_locked() can result in sd_cpt being changed. If this function returns REPEAT_SEND, we'll go back to the again label. It is possible at this time to initiate discovery, which will unlock the cpt. If the local cpt isn't updated we could potentially be manipulating the wrong cpt resulting in some form of corruption or dead lock. Test-Parameters: forbuildonly Signed-off-by: Amir Shehata Change-Id: Ifd39b0d84f8cce859151f7cc900a082481dd7218 Reviewed-on: https://review.whamcloud.com/34607 Reviewed-by: Olaf Weber Reviewed-by: Sebastien Buisson Reviewed-by: Chris Horn Tested-by: Jenkins --- lnet/lnet/lib-move.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index 367de23..8e8734b 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -2625,10 +2625,16 @@ again: rc = lnet_handle_send_case_locked(&send_data); + /* + * Update the local cpt since send_data.sd_cpt might've been + * updated as a result of calling lnet_handle_send_case_locked(). + */ + cpt = send_data.sd_cpt; + if (rc == REPEAT_SEND) goto again; - lnet_net_unlock(send_data.sd_cpt); + lnet_net_unlock(cpt); return rc; } -- 1.8.3.1