[SCSI] bnx2i: Added fix for NOP-Out response panic from unsolicited NOP-In
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.wai@broadcom.com> Reviewed-by: Michael Chan <mchan@broadcom.com> Reviewed-by: Anil Veerabhadrappa <anilgv@broadcom.com> Acked-by: Benjamin Li <benli@broadcom.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
5ee3257626
commit
8eea2f55a6
3 changed files with 4 additions and 2 deletions
|
@ -1513,7 +1513,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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -419,6 +419,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);
|
||||
|
|
Loading…
Reference in a new issue