diff options
author | James Smart <James.Smart@Emulex.Com> | 2007-04-25 09:52:34 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-05-06 10:33:14 -0400 |
commit | 7054a606e6724674a5acd103ed74eacb02c73393 (patch) | |
tree | 271327c20a1e4bff9475ef7a9d98afd4644d6570 /drivers/scsi/lpfc/lpfc_nportdisc.c | |
parent | de0c5b32b50ef2673f4cd434b9c2732237d715dd (diff) |
[SCSI] lpfc 8.1.12 : Round 2 of Miscellaneous fixes
Round 2 of Miscellaneous fixes:
- Ensure we don't prematurely re-enable IRQs in lpfc_sli_abort_fcp_cmpl().
- Prevent freeing of iocb after IOCB_TIMEDOUT error.
- Added code to cleanup REG_LOGIN mailbox command when a LOGO is received.
- Fix offline window where more work can sneak in after clearing work_ha
- Use target reset instead of LU reset in bus_device_reset_handler
- Fixed system hangs due to leaked host_lock.
- Fixed NULL pointer dereference during I/O with LIP.
- Fixed false iocb timeout.
- Fixed name server query response handling.
- Change rport dev_loss_tmo value when user change lpfc HBA's dev_loss_tmo.
- Fixed a memory leak in lpfc_sli_wake_mbox_wait.
- Fixed check for dropped frames.
- Removed hba queue depth calculation based on device PCI IDs
- Change min cr_count value specified in comment to agree with setting
Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_nportdisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 5595c612e223..789a12dc986b 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c | |||
@@ -1019,9 +1019,36 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc_hba * phba, | |||
1019 | uint32_t evt) | 1019 | uint32_t evt) |
1020 | { | 1020 | { |
1021 | struct lpfc_iocbq *cmdiocb; | 1021 | struct lpfc_iocbq *cmdiocb; |
1022 | LPFC_MBOXQ_t *mb; | ||
1023 | LPFC_MBOXQ_t *nextmb; | ||
1024 | struct lpfc_dmabuf *mp; | ||
1022 | 1025 | ||
1023 | cmdiocb = (struct lpfc_iocbq *) arg; | 1026 | cmdiocb = (struct lpfc_iocbq *) arg; |
1024 | 1027 | ||
1028 | /* cleanup any ndlp on mbox q waiting for reglogin cmpl */ | ||
1029 | if ((mb = phba->sli.mbox_active)) { | ||
1030 | if ((mb->mb.mbxCommand == MBX_REG_LOGIN64) && | ||
1031 | (ndlp == (struct lpfc_nodelist *) mb->context2)) { | ||
1032 | mb->context2 = NULL; | ||
1033 | mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | ||
1034 | } | ||
1035 | } | ||
1036 | |||
1037 | spin_lock_irq(phba->host->host_lock); | ||
1038 | list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) { | ||
1039 | if ((mb->mb.mbxCommand == MBX_REG_LOGIN64) && | ||
1040 | (ndlp == (struct lpfc_nodelist *) mb->context2)) { | ||
1041 | mp = (struct lpfc_dmabuf *) (mb->context1); | ||
1042 | if (mp) { | ||
1043 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | ||
1044 | kfree(mp); | ||
1045 | } | ||
1046 | list_del(&mb->list); | ||
1047 | mempool_free(mb, phba->mbox_mem_pool); | ||
1048 | } | ||
1049 | } | ||
1050 | spin_unlock_irq(phba->host->host_lock); | ||
1051 | |||
1025 | lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); | 1052 | lpfc_rcv_logo(phba, ndlp, cmdiocb, ELS_CMD_LOGO); |
1026 | return ndlp->nlp_state; | 1053 | return ndlp->nlp_state; |
1027 | } | 1054 | } |