From 59f48c1f33d9043bbac821dd333476df4a23f4f8 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 6 Feb 2014 14:17:49 +0000 Subject: [PATCH] ib_srpt: Avoid that disabling a target triggers a race condition Avoid that disabling a target triggers a race condition with SRP relogin. At least in theory this race condition could result in a kernel crash. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5268 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 67c8c6424..6b9b54fa8 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -2340,17 +2340,21 @@ static void srpt_drain_channel(struct ib_cm_id *cm_id) static void __srpt_close_all_ch(struct srpt_tgt *srpt_tgt) { - struct srpt_rdma_ch *ch, *next_ch; + struct srpt_rdma_ch *ch; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32) lockdep_assert_held(&srpt_tgt->spinlock); #endif - list_for_each_entry_safe(ch, next_ch, &srpt_tgt->rch_list, list) { +restart: + list_for_each_entry(ch, &srpt_tgt->rch_list, list) { + if (ch->state >= CH_DISCONNECTING) + continue; PRINT_INFO("Closing channel %s because target %s has been" " disabled", ch->sess_name, srpt_tgt->scst_tgt->tgt_name); - __srpt_close_ch(ch); + WARN_ON_ONCE(!__srpt_close_ch(ch)); + goto restart; } }