On 07/27/2010 11:12 AM, Eddie Wai wrote:
The patch fixes the following situations where NOP-Out pkt is called for:
- local unsolicited NOP-Out requests (requesting no NOP-In response)
- local NOP-Out responses to unsolicited NOP-In requests

kernel panic is observed due to double session spin_lock requests; one in the
bnx2i_process_nopin_local_cmpl routine in bnx2i_hwi.c and the other in the
iscsi_put_task routine in libiscsi.c

The proposed fix is to export the currently static __iscsi_put_task() routine
and have bnx2i call it directly instead of the iscsi_put_task() routine which
holds the session spin lock.


Signed-off-by: Eddie Wai<eddie....@broadcom.com>
Reviewed-by: Michael Chan<mc...@broadcom.com>
Reviewed-by: Anil Veerabhadrappa<ani...@broadcom.com>
Acked-by: Benjamin Li<be...@broadcom.com>
---
  drivers/scsi/bnx2i/bnx2i_hwi.c |    2 +-
  drivers/scsi/libiscsi.c        |    3 ++-
  include/scsi/libiscsi.h        |    1 +
  3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c
index d23fc25..58cd7fc 100644
--- a/drivers/scsi/bnx2i/bnx2i_hwi.c
+++ b/drivers/scsi/bnx2i/bnx2i_hwi.c
@@ -1512,7 +1512,7 @@ static void bnx2i_process_nopin_local_cmpl(struct 
iscsi_session *session,
        task = iscsi_itt_to_task(conn,
                                 nop_in->itt&  ISCSI_NOP_IN_MSG_INDEX);
        if (task)
-               iscsi_put_task(task);
+               __iscsi_put_task(task);
        spin_unlock(&session->lock);
  }

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 633e090..b63e2a4 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -539,11 +539,12 @@ void __iscsi_get_task(struct iscsi_task *task)
  }
  EXPORT_SYMBOL_GPL(__iscsi_get_task);

-static void __iscsi_put_task(struct iscsi_task *task)
+void __iscsi_put_task(struct iscsi_task *task)
  {
        if (atomic_dec_and_test(&task->refcount))
                iscsi_free_task(task);
  }
+EXPORT_SYMBOL_GPL(__iscsi_put_task);

  void iscsi_put_task(struct iscsi_task *task)
  {
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
index ae5196a..2ea9aec 100644
--- a/include/scsi/libiscsi.h
+++ b/include/scsi/libiscsi.h
@@ -420,6 +420,7 @@ extern struct iscsi_task *iscsi_itt_to_ctask(struct 
iscsi_conn *, itt_t);
  extern struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *, itt_t);
  extern void iscsi_requeue_task(struct iscsi_task *task);
  extern void iscsi_put_task(struct iscsi_task *task);
+extern void __iscsi_put_task(struct iscsi_task *task);
  extern void __iscsi_get_task(struct iscsi_task *task);
  extern void iscsi_complete_scsi_task(struct iscsi_task *task,
                                     uint32_t exp_cmdsn, uint32_t max_cmdsn);

Patch is correct.

Reviewed-by: Mike Christie <micha...@cs.wisc.edu>

--
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-is...@googlegroups.com.
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/open-iscsi?hl=en.

Reply via email to