Skip to content

Commit

Permalink
[SCSI] bfa: Fix to avoid vport delete hang on request queue full scen…
Browse files Browse the repository at this point in the history
…ario.

Fixed the LPS (Logical Port Services) state machine to send a
FDISC/FLOGI to the FW from the request queue wait state, when
there is space available again on the request queue.
Made changes to free the vport on LOGO/cleanup complete instead
of free'ing it from vport_delete_handler in the module unload scenario.

Signed-off-by: Krishna Gudipati <[email protected]>
Signed-off-by: James Bottomley <[email protected]>
  • Loading branch information
Krishna Gudipati authored and James Bottomley committed Mar 28, 2012
1 parent f0cdfce commit ff179e0
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 4 deletions.
2 changes: 2 additions & 0 deletions drivers/scsi/bfa/bfa_fcs_lport.c
Original file line number Diff line number Diff line change
Expand Up @@ -5717,6 +5717,8 @@ bfa_fcs_vport_free(struct bfa_fcs_vport_s *vport)

if (vport_drv->comp_del)
complete(vport_drv->comp_del);
else
kfree(vport_drv);

bfa_lps_delete(vport->lps);
}
Expand Down
3 changes: 2 additions & 1 deletion drivers/scsi/bfa/bfa_svc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,7 @@ bfa_lps_sm_loginwait(struct bfa_lps_s *lps, enum bfa_lps_event event)
switch (event) {
case BFA_LPS_SM_RESUME:
bfa_sm_set_state(lps, bfa_lps_sm_login);
bfa_lps_send_login(lps);
break;

case BFA_LPS_SM_OFFLINE:
Expand Down Expand Up @@ -1578,7 +1579,7 @@ bfa_lps_login_rsp(struct bfa_s *bfa, struct bfi_lps_login_rsp_s *rsp)
break;

case BFA_STATUS_VPORT_MAX:
if (!rsp->ext_status)
if (rsp->ext_status)
bfa_lps_no_res(lps, rsp->ext_status);
break;

Expand Down
8 changes: 5 additions & 3 deletions drivers/scsi/bfa/bfad_attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -494,8 +494,11 @@ bfad_im_vport_delete(struct fc_vport *fc_vport)
unsigned long flags;
struct completion fcomp;

if (im_port->flags & BFAD_PORT_DELETE)
goto free_scsi_host;
if (im_port->flags & BFAD_PORT_DELETE) {
bfad_scsi_host_free(bfad, im_port);
list_del(&vport->list_entry);
return 0;
}

port = im_port->port;

Expand Down Expand Up @@ -526,7 +529,6 @@ bfad_im_vport_delete(struct fc_vport *fc_vport)

wait_for_completion(vport->comp_del);

free_scsi_host:
bfad_scsi_host_free(bfad, im_port);
list_del(&vport->list_entry);
kfree(vport);
Expand Down

0 comments on commit ff179e0

Please sign in to comment.