diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c index a0ae2427390f..0b2dcb279574 100644 --- a/sys/dev/iscsi/iscsi.c +++ b/sys/dev/iscsi/iscsi.c @@ -421,6 +421,7 @@ iscsi_maintenance_thread_terminate(struct iscsi_session *is) sx_xunlock(&sc->sc_lock); icl_conn_close(is->is_conn); + callout_drain(&is->is_callout); ISCSI_SESSION_LOCK(is); @@ -434,8 +435,6 @@ iscsi_maintenance_thread_terminate(struct iscsi_session *is) cv_signal(&is->is_login_cv); #endif - callout_drain(&is->is_callout); - iscsi_session_cleanup(is, true); KASSERT(TAILQ_EMPTY(&is->is_outstanding), @@ -511,6 +510,7 @@ iscsi_session_reconnect(struct iscsi_session *is) static void iscsi_session_terminate(struct iscsi_session *is) { + if (is->is_terminating) return; @@ -532,12 +532,14 @@ iscsi_callout(void *context) is = context; - if (is->is_terminating) + ISCSI_SESSION_LOCK(is); + if (is->is_terminating) { + ISCSI_SESSION_UNLOCK(is); return; + } callout_schedule(&is->is_callout, 1 * hz); - ISCSI_SESSION_LOCK(is); is->is_timeout++; if (is->is_waiting_for_iscsid) {