aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_nportdisc.c
diff options
context:
space:
mode:
authorJames Smart <James.Smart@Emulex.Com>2007-04-25 09:52:34 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2007-05-06 10:33:14 -0400
commit7054a606e6724674a5acd103ed74eacb02c73393 (patch)
tree271327c20a1e4bff9475ef7a9d98afd4644d6570 /drivers/scsi/lpfc/lpfc_nportdisc.c
parentde0c5b32b50ef2673f4cd434b9c2732237d715dd (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.c27
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}