From: Mr NeilBrown Date: Thu, 19 Dec 2019 05:55:35 +0000 (+1100) Subject: LU-13088 ldlm: Fix sleeping function called in atomic X-Git-Tag: 2.12.6-RC1~65 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F83%2F39283%2F3;p=fs%2Flustre-release.git LU-13088 ldlm: Fix sleeping function called in atomic target_recovery_overseer() can sleep while holding a spinlock, which triggers a BUG warning. It is easily fixed by dropping the spinlock before waiting. In the case where the task waits, no useful information that could be protected by the spinlock is held, so nothing can be lost by dropping it. Lustre-change: https://review.whamcloud.com/#/c/37063/ Lustre-commit: b29b9310dafe17ba78e1db490b79b89d2d6fdcd1 Signed-off-by: Mr NeilBrown Change-Id: I8bb3d02523b5dcfadac19f01ccb736d7b7f28239 Reviewed-on: https://review.whamcloud.com/37063 Tested-by: jenkins Reviewed-by: James Simmons Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin Reviewed-on: https://review.whamcloud.com/39283 --- diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 6e0ac53..4b13020 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -2029,11 +2029,13 @@ repeat: if (next_update_transno == 0) { struct l_wait_info lwi = { 0 }; + spin_unlock(&obd->obd_recovery_task_lock); l_wait_event(tdtd->tdtd_recovery_threads_waitq, atomic_read( &tdtd->tdtd_recovery_threads_count) == 0, &lwi); + spin_lock(&obd->obd_recovery_task_lock); next_update_transno = distribute_txn_get_next_transno( lut->lut_tdtd);