From 2e0703275de271b8245449ee856c85e1d9845b2b Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Mon, 28 Jun 2010 18:23:28 +0000 Subject: [PATCH] SRPT with thread=0 works again (was broken by r1714, the merge of the persistent reservation branch to the trunk). Added more consistency checks. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1795 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- srpt/src/ib_srpt.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 6ff57fd2d..1e87177c3 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1810,6 +1810,8 @@ static void srpt_release_channel_by_cmid(struct ib_cm_id *cm_id) TRACE_ENTRY(); + EXTRACHECKS_WARN_ON_ONCE(irqs_disabled()); + sdev = cm_id->context; BUG_ON(!sdev); spin_lock_irq(&sdev->spinlock); @@ -1836,7 +1838,9 @@ static struct srpt_rdma_ch *srpt_find_channel(struct srpt_device *sdev, struct srpt_rdma_ch *ch; bool found; + EXTRACHECKS_WARN_ON_ONCE(irqs_disabled()); BUG_ON(!sdev); + found = false; spin_lock_irq(&sdev->spinlock); list_for_each_entry(ch, &sdev->rch_list, list) { @@ -1892,6 +1896,8 @@ static int srpt_enable_target(struct scst_tgt *scst_tgt, bool enable) { struct srpt_device *sdev = scst_tgt_get_tgt_priv(scst_tgt); + EXTRACHECKS_WARN_ON_ONCE(irqs_disabled()); + TRACE_DBG("%s target %s", enable ? "Enabling" : "Disabling", sdev->device->name); @@ -1908,8 +1914,10 @@ static int srpt_enable_target(struct scst_tgt *scst_tgt, bool enable) static bool srpt_is_target_enabled(struct scst_tgt *scst_tgt) { struct srpt_device *sdev = scst_tgt_get_tgt_priv(scst_tgt); - bool res; + + EXTRACHECKS_WARN_ON_ONCE(irqs_disabled()); + spin_lock_irq(&sdev->spinlock); res = sdev->enabled; spin_unlock_irq(&sdev->spinlock); @@ -1944,6 +1952,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, u32 it_iu_len; int ret = 0; + EXTRACHECKS_WARN_ON_ONCE(irqs_disabled()); + #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) WARN_ON(!sdev || !private_data); if (!sdev || !private_data) @@ -2760,6 +2770,12 @@ static int srpt_xmit_response(struct scst_cmd *scmnd) int resp_len; enum srpt_command_state prev_state; + if (unlikely(scst_cmd_atomic(scmnd))) { + TRACE_DBG("%s", "Switching to thread context."); + ret = SCST_TGT_RES_NEED_THREAD_CTX; + goto out; + } + EXTRACHECKS_BUG_ON(scst_cmd_atomic(scmnd)); ioctx = scst_cmd_get_tgt_priv(scmnd); @@ -3009,6 +3025,8 @@ static int srpt_release(struct scst_tgt *scst_tgt) TRACE_ENTRY(); + EXTRACHECKS_WARN_ON_ONCE(irqs_disabled()); + BUG_ON(!scst_tgt); #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) WARN_ON(!sdev);