lpfc 8.2.8 : Miscellaneous Bug Fixes
Subsystems (2)
PATCH 8/15 lpfc 8.2.8 : Miscellaneous Bug Fixes
Miscellaneous Fixes:
- Fix the wrong variable name used for checking node active usage status
- Fix numerous duplicate log message numbers
- Fix change KERN_WARNING messages to KERN_INFO.
- Stop sending erroneous LOGO to fabric after vport is already terminated
- Fix HBQ allocates that were kalloc'ing w/ GFP_KERNEL while holding a lock.
- Fix gcc 4.3.2 compiler warnings and a sparse warning
- Fix bugs in handling unsolicited ct event queue
- Reorder some of the initial link up checks, to remove odd VPI states.
- Correct poor VPI handling
- Add debug messages
- Expand Update_CFG mailbox definition
- Fix handling of VPD data offsets
- Reorder loopback flags
- convert to use offsetof()
---
lpfc.h | 2 - lpfc_attr.c | 32 +++++++--------- lpfc_crtn.h | 2 - lpfc_ct.c | 15 +++---- lpfc_debugfs.c | 20 +++++----- lpfc_els.c | 87 +++++++++++++++++++++++---------------------- lpfc_hbadisc.c | 18 +++++++-- lpfc_hw.h | 31 ++++++++++++++++ lpfc_init.c | 30 ++++++--------- lpfc_nportdisc.c | 9 +++- lpfc_scsi.c | 6 +-- lpfc_sli.c | 105 ++++++++++++++++++++++++++++++++----------------------- lpfc_vport.c | 14 +++++-- 13 files changed, 219 insertions(+), 152 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +15 -17
@@ -1302,7 +1302,7 @@ lpfc_##attr##_init(struct lpfc_vport *vpreturn 0 ;\ }\ lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \ - "0449 lpfc_"#attr" attribute cannot be set to %d, "\ + "0423 lpfc_"#attr" attribute cannot be set to %d, "\ "allowed range is ["#minval", "#maxval"]\n", val); \ vport->cfg_##attr = default;\ return -EINVAL;\
@@ -1334,7 +1334,7 @@ lpfc_##attr##_set(struct lpfc_vport *vporeturn 0 ;\ }\ lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \ - "0450 lpfc_"#attr" attribute cannot be set to %d, "\ + "0424 lpfc_"#attr" attribute cannot be set to %d, "\ "allowed range is ["#minval", "#maxval"]\n", val); \ return -EINVAL;\ }
@@ -1803,7 +1803,7 @@ lpfc_nodev_tmo_init(struct lpfc_vport *v vport->cfg_nodev_tmo = vport->cfg_devloss_tmo;if (val !=LPFC_DEF_DEVLOSS_TMO )lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0402 Ignoring nodev_tmo module " +"0407 Ignoring nodev_tmo module " "parameter because devloss_tmo is " "set.\n" );return 0 ;
@@ -2030,7 +2030,7 @@ lpfc_restrict_login_init(struct lpfc_vpo {if (val <0 || val >1 ) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0449 lpfc_restrict_login attribute cannot " +"0422 lpfc_restrict_login attribute cannot " "be set to %d, allowed range is [0, 1]\n" , val); vport->cfg_restrict_login =1 ;
@@ -2065,7 +2065,7 @@ lpfc_restrict_login_set(struct lpfc_vpor {if (val <0 || val >1 ) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0450 lpfc_restrict_login attribute cannot " +"0425 lpfc_restrict_login attribute cannot " "be set to %d, allowed range is [0, 1]\n" , val); vport->cfg_restrict_login =1 ;
@@ -2249,7 +2249,7 @@ lpfc_link_speed_init(struct lpfc_hba *phreturn 0 ; }lpfc_printf_log (phba,KERN_ERR ,LOG_INIT , -"0454 lpfc_link_speed attribute cannot " +"0405 lpfc_link_speed attribute cannot " "be set to %d, allowed values are " "[" LPFC_LINK_SPEED_STRING "]\n" , val); phba->cfg_link_speed =0 ;
@@ -2787,17 +2787,15 @@ sysfs_mbox_read(struct kobject *kobj, st/* If HBA encountered an error attention, allow only DUMP * or RESTART mailbox commands until the HBA is restarted. */ -if ((phba->pport->stopped) && - (phba->sysfs_mbox.mbox->mb.mbxCommand != -MBX_DUMP_MEMORY && - phba->sysfs_mbox.mbox->mb.mbxCommand != -MBX_RESTART && - phba->sysfs_mbox.mbox->mb.mbxCommand != -MBX_WRITE_VPARMS )) { -sysfs_mbox_idle (phba); -spin_unlock_irq (&phba->hbalock); -return -EPERM ; - } +if (phba->pport->stopped && + phba->sysfs_mbox.mbox->mb.mbxCommand !=MBX_DUMP_MEMORY && + phba->sysfs_mbox.mbox->mb.mbxCommand !=MBX_RESTART && + phba->sysfs_mbox.mbox->mb.mbxCommand !=MBX_WRITE_VPARMS && + phba->sysfs_mbox.mbox->mb.mbxCommand !=MBX_WRITE_WWN ) +lpfc_printf_log (phba,KERN_WARNING ,LOG_MBOX , +"1259 mbox: Issued mailbox cmd " +"0x%x while in stopped state.\n" , + phba->sysfs_mbox.mbox->mb.mbxCommand); phba->sysfs_mbox.mbox->vport = vport;
drivers/scsi/lpfc/lpfc_crtn.h +1 -1
@@ -269,7 +269,7 @@ void lpfc_dev_loss_tmo_callbk(struct fc_struct lpfc_vport *lpfc_create_port (struct lpfc_hba *,int ,struct device *);int lpfc_vport_disable (struct fc_vport *fc_vport,bool disable); -void lpfc_mbx_unreg_vpi (struct lpfc_vport *); +int lpfc_mbx_unreg_vpi (struct lpfc_vport *);void destroy_port (struct lpfc_vport *);int lpfc_get_instance (void );void lpfc_host_attrib_init (struct Scsi_Host *);
drivers/scsi/lpfc/lpfc_ct.c +7 -8
@@ -134,25 +134,24 @@ lpfc_ct_unsol_event(struct lpfc_hba *phb }list_del (&head); }else { -struct lpfc_iocbq *next; - -list_for_each_entry_safe (iocbq, next, &piocbq->list, list) { +INIT_LIST_HEAD (&head); +list_add_tail (&head, &piocbq->list); +list_for_each_entry (iocbq, &head, list) { icmd = &iocbq->iocb;if (icmd->ulpBdeCount ==0 ) -lpfc_ct_unsol_buffer (phba, piocbq,NULL ,0 ); +lpfc_ct_unsol_buffer (phba, iocbq,NULL ,0 );for (i =0 ; i < icmd->ulpBdeCount; i++) { paddr =getPaddr (icmd->un.cont64[i].addrHigh, icmd->un.cont64[i].addrLow); mp =lpfc_sli_ringpostbuf_get (phba, pring, paddr); size = icmd->un.cont64[i].tus.f.bdeSize; -lpfc_ct_unsol_buffer (phba, piocbq, mp, size); +lpfc_ct_unsol_buffer (phba, iocbq, mp, size);lpfc_in_buf_free (phba, mp); } -list_del (&iocbq->list); -lpfc_sli_release_iocbq (phba, iocbq);lpfc_post_buffer (phba, pring, i); } +list_del (&head); } }
@@ -861,7 +860,7 @@ lpfc_cmpl_ct(struct lpfc_hba *phba, stru retry++;lpfc_printf_vlog (vport,KERN_INFO ,LOG_DISCOVERY , -"0216 Retrying NS cmd %x\n" , cmdcode); +"0250 Retrying NS cmd %x\n" , cmdcode); rc =lpfc_ns_cmd (vport, cmdcode, retry,0 );if (rc ==0 ) goto out;
drivers/scsi/lpfc/lpfc_debugfs.c +10 -10
@@ -1120,7 +1120,7 @@ lpfc_debugfs_initialize(struct lpfc_vporatomic_set (&lpfc_debugfs_hba_count,0 );if (!lpfc_debugfs_root) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs root\n" ); +"0408 Cannot create debugfs root\n" ); goto debug_failed; } }
@@ -1134,7 +1134,7 @@ lpfc_debugfs_initialize(struct lpfc_vpordebugfs_create_dir (name, lpfc_debugfs_root);if (!phba->hba_debugfs_root) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs hba\n" ); +"0412 Cannot create debugfs hba\n" ); goto debug_failed; }atomic_inc (&lpfc_debugfs_hba_count);
@@ -1148,7 +1148,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor phba, &lpfc_debugfs_op_hbqinfo);if (!phba->debug_hbqinfo) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs hbqinfo\n" ); +"0411 Cannot create debugfs hbqinfo\n" ); goto debug_failed; }
@@ -1160,7 +1160,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor phba, &lpfc_debugfs_op_dumpHBASlim);if (!phba->debug_dumpHBASlim) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs dumpHBASlim\n" ); +"0413 Cannot create debugfs dumpHBASlim\n" ); goto debug_failed; }
@@ -1172,7 +1172,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor phba, &lpfc_debugfs_op_dumpHostSlim);if (!phba->debug_dumpHostSlim) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs dumpHostSlim\n" ); +"0414 Cannot create debugfs dumpHostSlim\n" ); goto debug_failed; }
@@ -1202,7 +1202,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor phba, &lpfc_debugfs_op_slow_ring_trc);if (!phba->debug_slow_ring_trc) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs " +"0415 Cannot create debugfs " "slow_ring_trace\n" ); goto debug_failed; }
@@ -1213,7 +1213,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor GFP_KERNEL);if (!phba->slow_ring_trc) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs " +"0416 Cannot create debugfs " "slow_ring buffer\n" ); goto debug_failed; }
@@ -1230,7 +1230,7 @@ lpfc_debugfs_initialize(struct lpfc_vpordebugfs_create_dir (name, phba->hba_debugfs_root);if (!vport->vport_debugfs_root) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cant create debugfs" ); +"0417 Cant create debugfs" ); goto debug_failed; }atomic_inc (&phba->debugfs_vport_count);
@@ -1259,7 +1259,7 @@ lpfc_debugfs_initialize(struct lpfc_vporif (!vport->disc_trc) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs disc trace " +"0418 Cannot create debugfs disc trace " "buffer\n" ); goto debug_failed; }
@@ -1272,7 +1272,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor vport, &lpfc_debugfs_op_disc_trc);if (!vport->debug_disc_trc) {lpfc_printf_vlog (vport,KERN_ERR ,LOG_INIT , -"0409 Cannot create debugfs " +"0419 Cannot create debugfs " "discovery_trace\n" ); goto debug_failed; }
drivers/scsi/lpfc/lpfc_els.c +44 -43
147 lines not on this page · raw message
drivers/scsi/lpfc/lpfc.h +1 -1
@@ -499,7 +499,7 @@ struct lpfc_hba {wait_queue_head_t work_waitq;struct task_struct *worker_thread; -long data_flags; +unsigned long data_flags;uint32_t hbq_in_use;/* HBQs in use flag */ struct list_head hbqbuf_in_list;/* in-fly hbq buffer list */
drivers/scsi/lpfc/lpfc_hbadisc.c +14 -4
@@ -215,8 +215,16 @@ lpfc_dev_loss_tmo_handler(struct lpfc_noreturn ; } -if (ndlp->nlp_state ==NLP_STE_MAPPED_NODE ) +if (ndlp->nlp_state ==NLP_STE_MAPPED_NODE ) { +lpfc_printf_vlog (vport,KERN_INFO ,LOG_DISCOVERY , +"0284 Devloss timeout Ignored on " +"WWPN %x:%x:%x:%x:%x:%x:%x:%x " +"NPort x%x\n" , + *name, *(name+1 ), *(name+2 ), *(name+3 ), + *(name+4 ), *(name+5 ), *(name+6 ), *(name+7 ), + ndlp->nlp_DID);return ; + }if (ndlp->nlp_type &NLP_FABRIC ) {/* We will clean up these Nodes in linkup */
@@ -1177,7 +1185,7 @@ lpfc_mbx_cmpl_unreg_vpi(struct lpfc_hbascsi_host_put (shost); } -void +int lpfc_mbx_unreg_vpi (struct lpfc_vport *vport) {struct lpfc_hba *phba = vport->phba;
@@ -1186,7 +1194,7 @@ lpfc_mbx_unreg_vpi(struct lpfc_vport *vp mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!mbox) -return ; +return 1 ;lpfc_unreg_vpi (phba, vport->vpi, mbox); mbox->vport = vport;
@@ -1197,7 +1205,9 @@ lpfc_mbx_unreg_vpi(struct lpfc_vport *vp "1800 Could not issue unreg_vpi\n");mempool_free (mbox, phba->mbox_mem_pool); vport->unreg_vpi_cmpl =VPORT_ERROR ; +return rc; } +return 0 ; } static void
@@ -2786,7 +2796,7 @@ restart_disc:default :lpfc_printf_vlog (vport,KERN_ERR ,LOG_DISCOVERY , -"0229 Unexpected discovery timeout, " +"0273 Unexpected discovery timeout, " "vport State x%x\n" , vport->port_state);break ; }
drivers/scsi/lpfc/lpfc_hw.h +31 -0
@@ -2318,6 +2318,36 @@ typedef struct {#define DMP_RSP_OFFSET 0x14/* word 5 contains first word of rsp */ #define DMP_RSP_SIZE 0x6C/* maximum of 27 words of rsp data */ +/* Structure for MB Command UPDATE_CFG (0x1B) */ + +struct update_cfg_var { +#ifdef __BIG_ENDIAN_BITFIELD +uint32_t rsvd2:16 ; +uint32_t type:8 ; +uint32_t rsvd:1 ; +uint32_t ra:1 ; +uint32_t co:1 ; +uint32_t cv:1 ; +uint32_t req:4 ; +uint32_t entry_length:16 ; +uint32_t region_id:16 ; +#else /* __LITTLE_ENDIAN_BITFIELD */ +uint32_t req:4 ; +uint32_t cv:1 ; +uint32_t co:1 ; +uint32_t ra:1 ; +uint32_t rsvd:1 ; +uint32_t type:8 ; +uint32_t rsvd2:16 ; +uint32_t region_id:16 ; +uint32_t entry_length:16 ; +#endif + +uint32_t resp_info; +uint32_t byte_cnt; +uint32_t data_offset; +}; +struct hbq_mask {#ifdef __BIG_ENDIAN_BITFIELDuint8_t tmatch;
@@ -2672,6 +2702,7 @@ typedef union {* NEW_FEATURE */ struct config_hbq_var varCfgHbq;/* cmd = 0x7c (CONFIG_HBQ) */ +struct update_cfg_var varUpdateCfg;/* cmd = 0x1B (UPDATE_CFG)*/ CONFIG_PORT_VAR varCfgPort;/* cmd = 0x88 (CONFIG_PORT) */ REG_VPI_VAR varRegVpi;/* cmd = 0x96 (REG_VPI) */ UNREG_VPI_VAR varUnregVpi;/* cmd = 0x97 (UNREG_VPI) */
drivers/scsi/lpfc/lpfc_init.c +13 -17
@@ -183,12 +183,9 @@ lpfc_config_port_prep(struct lpfc_hba *p sizeof (phba->RandomData));/* Get adapter VPD information */ - pmb->context2 =kmalloc (DMP_RSP_SIZE ,GFP_KERNEL ); -if (!pmb->context2) - goto out_free_mbox; lpfc_vpd_data =kmalloc (DMP_VPD_SIZE ,GFP_KERNEL );if (!lpfc_vpd_data) - goto out_free_context2; + goto out_free_mbox; do { lpfc_dump_mem(phba, pmb, offset);
@@ -203,15 +200,14 @@ lpfc_config_port_prep(struct lpfc_hba *p }if (mb->un.varDmp.word_cnt >DMP_VPD_SIZE - offset) mb->un.varDmp.word_cnt =DMP_VPD_SIZE - offset; -lpfc_sli_pcimem_bcopy (pmb->context2, lpfc_vpd_data + offset, +lpfc_sli_pcimem_bcopy (((uint8_t *)mb) +DMP_RSP_OFFSET , + lpfc_vpd_data + offset, mb->un.varDmp.word_cnt); offset += mb->un.varDmp.word_cnt; }while (mb->un.varDmp.word_cnt && offset <DMP_VPD_SIZE );lpfc_parse_vpd (phba, lpfc_vpd_data, offset);kfree (lpfc_vpd_data); -out_free_context2: -kfree (pmb->context2); out_free_mbox:mempool_free (pmb, phba->mbox_mem_pool);return 0 ;
@@ -425,9 +421,8 @@ lpfc_config_port_post(struct lpfc_hba *plpfc_init_link (phba, pmb, phba->cfg_topology, phba->cfg_link_speed); pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; - pmb->vport = vport; - rc =lpfc_sli_issue_mbox (phba, pmb,MBX_NOWAIT );lpfc_set_loopback_flag (phba); + rc =lpfc_sli_issue_mbox (phba, pmb,MBX_NOWAIT );if (rc !=MBX_SUCCESS ) {lpfc_printf_log (phba,KERN_ERR ,LOG_INIT , "0454 Adapter failed to init, mbxCmd x%x "
@@ -462,7 +457,7 @@ lpfc_config_port_post(struct lpfc_hba *p rc);mempool_free (pmb, phba->mbox_mem_pool); } -return (0 ); +return 0 ; }/**
@@ -841,7 +836,7 @@ lpfc_handle_eratt(struct lpfc_hba *phba) temp_event_data.data = (uint32_t )temperature; lpfc_printf_log(phba, KERN_ERR, LOG_INIT, - "0459 Adapter maximum temperature exceeded " + "0406 Adapter maximum temperature exceeded " "(%ld), taking this port offline " "Data: x%x x%x x%x\n", temperature, phba->work_hs,
@@ -1595,7 +1590,7 @@ lpfc_cleanup(struct lpfc_vport *vport) &vport->fc_nodes, nlp_listp) { lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_NODE, - "0282: did:x%x ndlp:x%p " + "0282 did:x%x ndlp:x%p " "usgmap:x%x refcnt:%d\n", ndlp->nlp_DID, (void *)ndlp, ndlp->nlp_usg_map,
@@ -2320,10 +2315,10 @@ lpfc_pci_probe_one(struct pci_dev *pdev, goto out_iounmap;memset (phba->slim2p.virt,0 ,SLI2_SLIM_SIZE ); - phba->mbox = phba->slim2p.virt; - phba->pcb = (phba->slim2p.virt +sizeof (MAILBOX_t)); - phba->IOCBs = (phba->slim2p.virt +sizeof (MAILBOX_t) + -sizeof (struct _PCB )); + phba->mbox = phba->slim2p.virt + offsetof(struct lpfc_sli2_slim , mbx); + phba->pcb = (phba->slim2p.virt + offsetof(struct lpfc_sli2_slim , pcb)); + phba->IOCBs = (phba->slim2p.virt + + offsetof(struct lpfc_sli2_slim , IOCBs)); phba->hbqslimp.virt = dma_alloc_coherent(&phba->pcidev->dev, lpfc_sli_hbq_size(),
@@ -2889,7 +2884,8 @@ lpfc_init(void) error =pci_register_driver (&lpfc_driver);if (error) {fc_release_transport (lpfc_transport_template); -fc_release_transport (lpfc_vport_transport_template); +if (lpfc_enable_npiv) +fc_release_transport (lpfc_vport_transport_template); }return error;
drivers/scsi/lpfc/lpfc_nportdisc.c +7 -2
@@ -1853,8 +1853,13 @@ static uint32_t lpfc_cmpl_logo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, void *arg, uint32_t evt) { + struct Scsi_Host *shost = lpfc_shost_from_vport(vport); +if (ndlp->nlp_DID == Fabric_DID) { +spin_lock_irq (shost->host_lock); + vport->fc_flag &= ~(FC_FABRIC |FC_PUBLIC_LOOP ); +spin_unlock_irq (shost->host_lock); + }lpfc_unreg_rpi (vport, ndlp); -/* This routine does nothing, just return the current state */ return ndlp->nlp_state; }
@@ -2143,7 +2148,7 @@ lpfc_disc_state_machine(struct lpfc_vporlpfc_nlp_put (ndlp); }else {lpfc_printf_vlog (vport,KERN_INFO ,LOG_DISCOVERY , -"0212 DSM out state %d on NPort free\n" , rc); +"0213 DSM out state %d on NPort free\n" , rc); lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM, "DSM out: ste:%d did:x%x flg:x%x",
drivers/scsi/lpfc/lpfc_scsi.c +3 -3
@@ -627,9 +627,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba cmd->result =ScsiResult (DID_BUS_BUSY ,0 );break ;case IOSTAT_LOCAL_REJECT : -if (lpfc_cmd->result ==RJT_UNAVAIL_PERM || +if (lpfc_cmd->result ==IOERR_INVALID_RPI || lpfc_cmd->result ==IOERR_NO_RESOURCES || - lpfc_cmd->result ==RJT_LOGIN_REQUIRED ) { + lpfc_cmd->result ==IOERR_ABORT_REQUESTED ) { cmd->result =ScsiResult (DID_REQUEUE ,0 );break ; }/* else: fall through */
@@ -1317,7 +1317,7 @@ lpfc_bus_reset_handler(struct scsi_cmndstruct lpfc_hba *phba = vport->phba;struct lpfc_nodelist *ndlp =NULL ;int match; -int ret =SUCCESS , status, i; +int ret =SUCCESS , status =SUCCESS , i;int cnt;struct lpfc_scsi_buf * lpfc_cmd;unsigned long later;
drivers/scsi/lpfc/lpfc_sli.c +62 -43
220 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_vport.c +11 -3
@@ -577,8 +577,12 @@ lpfc_vport_delete(struct fc_vport *fc_vp* initiated after we've disposed of all other resources associated * with the port. */ -if (!scsi_host_get (shost) || !scsi_host_get (shost)) +if (!scsi_host_get (shost))return VPORT_INVAL ; +if (!scsi_host_get (shost)) { +scsi_host_put (shost); +return VPORT_INVAL ; + }spin_lock_irq (&phba->hbalock); vport->load_flag |=FC_UNLOADING ;spin_unlock_irq (&phba->hbalock);
@@ -668,6 +672,8 @@ lpfc_vport_delete(struct fc_vport *fc_vp } vport->unreg_vpi_cmpl =VPORT_INVAL ; timeout =msecs_to_jiffies (phba->fc_ratov *2000 ); +if (ndlp->nlp_state ==NLP_STE_UNUSED_NODE ) + goto skip_logo;if (!lpfc_issue_els_npiv_logo (vport, ndlp))while (vport->unreg_vpi_cmpl ==VPORT_INVAL && timeout) timeout =schedule_timeout (timeout);
@@ -689,8 +695,10 @@ skip_logo:* Completion of unreg_vpi (lpfc_mbx_cmpl_unreg_vpi) * does the scsi_host_put() to release the vport. */ -lpfc_mbx_unreg_vpi (vport); - } +if (lpfc_mbx_unreg_vpi (vport)) +scsi_host_put (shost); + }else +scsi_host_put (shost);lpfc_free_vpi (phba, vport->vpi); vport->work_port_events =0 ;