Re: [PATCH 3/3] qla2xxx: ensure async flags are reset correctly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Thu, 22 Feb 2018, 12:49am, Hannes Reinecke wrote:

> The fcport flags FCF_ASYNC_ACTIVE and FCF_ASYNC_SENT are used
> to throttle the state machine, so we need to ensure to always
> set and unset them correctly. Not doing so will lead to the
> state machine getting confused and no login attempt into
> remote ports.
> 
> Cc: Quinn Tran <quinn.tran@xxxxxxxxxx>
> Cc: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx>
> Fixes: 3dbec59bdf63 ("scsi: qla2xxx: Prevent multiple active discovery commands per session")
> Signed-off-by: Hannes Reinecke <hare@xxxxxxxx>
> ---
>  drivers/scsi/qla2xxx/qla_gs.c   |  2 ++
>  drivers/scsi/qla2xxx/qla_init.c | 13 ++++++++++---
>  2 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> index e4d404c24506..3cb05c1bd7bf 100644
> --- a/drivers/scsi/qla2xxx/qla_gs.c
> +++ b/drivers/scsi/qla2xxx/qla_gs.c
> @@ -3177,6 +3177,7 @@ int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
>  	sp->free(sp);
>  	fcport->flags &= ~FCF_ASYNC_SENT;
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> @@ -3368,6 +3369,7 @@ int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
>  	sp->free(sp);
>  	fcport->flags &= ~FCF_ASYNC_SENT;
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index a19ed53ba6d9..df31c396d206 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -228,6 +228,7 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
>  	sp->free(sp);
>  	fcport->flags &= ~FCF_ASYNC_SENT;
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> @@ -280,7 +281,7 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
>  done_free_sp:
>  	sp->free(sp);
>  done:
> -	fcport->flags &= ~FCF_ASYNC_SENT;
> +	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
>  	return rval;
>  }
>  
> @@ -288,6 +289,7 @@ void
>  qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>      uint16_t *data)
>  {
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	/* Don't re-login in target mode */
>  	if (!fcport->tgt_session)
>  		qla2x00_mark_device_lost(vha, fcport, 1, 0);
> @@ -301,6 +303,7 @@ qla2x00_async_prlo_sp_done(void *s, int res)
>  	struct srb_iocb *lio = &sp->u.iocb_cmd;
>  	struct scsi_qla_host *vha = sp->vha;
>  
> +	sp->fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	if (!test_bit(UNLOADING, &vha->dpc_flags))
>  		qla2x00_post_async_prlo_done_work(sp->fcport->vha, sp->fcport,
>  		    lio->u.logio.data);
> @@ -339,6 +342,7 @@ qla2x00_async_prlo(struct scsi_qla_host *vha, fc_port_t *fcport)
>  done_free_sp:
>  	sp->free(sp);
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> @@ -392,6 +396,8 @@ qla2x00_async_adisc_sp_done(void *ptr, int res)
>  	    "Async done-%s res %x %8phC\n",
>  	    sp->name, res, sp->fcport->port_name);
>  
> +	sp->fcport->flags &= ~FCF_ASYNC_SENT;
> +
>  	memset(&ea, 0, sizeof(ea));
>  	ea.event = FCME_ADISC_DONE;
>  	ea.rc = res;
> @@ -442,7 +448,7 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
>  done_free_sp:
>  	sp->free(sp);
>  done:
> -	fcport->flags &= ~FCF_ASYNC_SENT;
> +	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
>  	qla2x00_post_async_adisc_work(vha, fcport, data);
>  	return rval;
>  }
> @@ -1815,6 +1821,7 @@ qla2x00_async_logout_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>  	qla2x00_mark_device_lost(vha, fcport, 1, 0);
>  	qlt_logo_completion_handler(fcport, data[0]);
>  	fcport->login_gen++;
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return;
>  }
>  
> @@ -1822,6 +1829,7 @@ void
>  qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>      uint16_t *data)
>  {
> +	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
>  	if (data[0] == MBS_COMMAND_COMPLETE) {
>  		qla2x00_update_fcport(vha, fcport);
>  
> @@ -1829,7 +1837,6 @@ qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>  	}
>  
>  	/* Retry login. */
> -	fcport->flags &= ~FCF_ASYNC_SENT;
>  	if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
>  		set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
>  	else
> 

Thanks for the patch. Looks good.

Acked-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx>




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux