aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2018-02-22 03:49:37 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2018-03-01 20:16:51 -0500
commitfa83e65885b9147e2f2b89fdd4ecf7b4ff91571d (patch)
treeb9210ce03c4023d1af74218d920bafef5630e646
parent07ea4b6026ee8b8dfaf9bbe83a09b3ba905d20fd (diff)
scsi: qla2xxx: ensure async flags are reset correctly
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@cavium.com> Cc: Himanshu Madhani <himanshu.madhani@cavium.com> Fixes: 3dbec59bdf63 ("scsi: qla2xxx: Prevent multiple active discovery commands per session") Signed-off-by: Hannes Reinecke <hare@suse.com> Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/qla2xxx/qla_gs.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c13
2 files changed, 12 insertions, 3 deletions
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 5bf9a59432f6..21eff2d30266 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3179,6 +3179,7 @@ done_free_sp:
3179 sp->free(sp); 3179 sp->free(sp);
3180 fcport->flags &= ~FCF_ASYNC_SENT; 3180 fcport->flags &= ~FCF_ASYNC_SENT;
3181done: 3181done:
3182 fcport->flags &= ~FCF_ASYNC_ACTIVE;
3182 return rval; 3183 return rval;
3183} 3184}
3184 3185
@@ -3370,6 +3371,7 @@ done_free_sp:
3370 sp->free(sp); 3371 sp->free(sp);
3371 fcport->flags &= ~FCF_ASYNC_SENT; 3372 fcport->flags &= ~FCF_ASYNC_SENT;
3372done: 3373done:
3374 fcport->flags &= ~FCF_ASYNC_ACTIVE;
3373 return rval; 3375 return rval;
3374} 3376}
3375 3377
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 4efc25700e99..d5a45c4981ec 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -213,6 +213,7 @@ done_free_sp:
213 sp->free(sp); 213 sp->free(sp);
214 fcport->flags &= ~FCF_ASYNC_SENT; 214 fcport->flags &= ~FCF_ASYNC_SENT;
215done: 215done:
216 fcport->flags &= ~FCF_ASYNC_ACTIVE;
216 return rval; 217 return rval;
217} 218}
218 219
@@ -263,7 +264,7 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
263done_free_sp: 264done_free_sp:
264 sp->free(sp); 265 sp->free(sp);
265done: 266done:
266 fcport->flags &= ~FCF_ASYNC_SENT; 267 fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
267 return rval; 268 return rval;
268} 269}
269 270
@@ -271,6 +272,7 @@ void
271qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport, 272qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
272 uint16_t *data) 273 uint16_t *data)
273{ 274{
275 fcport->flags &= ~FCF_ASYNC_ACTIVE;
274 /* Don't re-login in target mode */ 276 /* Don't re-login in target mode */
275 if (!fcport->tgt_session) 277 if (!fcport->tgt_session)
276 qla2x00_mark_device_lost(vha, fcport, 1, 0); 278 qla2x00_mark_device_lost(vha, fcport, 1, 0);
@@ -284,6 +286,7 @@ qla2x00_async_prlo_sp_done(void *s, int res)
284 struct srb_iocb *lio = &sp->u.iocb_cmd; 286 struct srb_iocb *lio = &sp->u.iocb_cmd;
285 struct scsi_qla_host *vha = sp->vha; 287 struct scsi_qla_host *vha = sp->vha;
286 288
289 sp->fcport->flags &= ~FCF_ASYNC_ACTIVE;
287 if (!test_bit(UNLOADING, &vha->dpc_flags)) 290 if (!test_bit(UNLOADING, &vha->dpc_flags))
288 qla2x00_post_async_prlo_done_work(sp->fcport->vha, sp->fcport, 291 qla2x00_post_async_prlo_done_work(sp->fcport->vha, sp->fcport,
289 lio->u.logio.data); 292 lio->u.logio.data);
@@ -322,6 +325,7 @@ qla2x00_async_prlo(struct scsi_qla_host *vha, fc_port_t *fcport)
322done_free_sp: 325done_free_sp:
323 sp->free(sp); 326 sp->free(sp);
324done: 327done:
328 fcport->flags &= ~FCF_ASYNC_ACTIVE;
325 return rval; 329 return rval;
326} 330}
327 331
@@ -375,6 +379,8 @@ qla2x00_async_adisc_sp_done(void *ptr, int res)
375 "Async done-%s res %x %8phC\n", 379 "Async done-%s res %x %8phC\n",
376 sp->name, res, sp->fcport->port_name); 380 sp->name, res, sp->fcport->port_name);
377 381
382 sp->fcport->flags &= ~FCF_ASYNC_SENT;
383
378 memset(&ea, 0, sizeof(ea)); 384 memset(&ea, 0, sizeof(ea));
379 ea.event = FCME_ADISC_DONE; 385 ea.event = FCME_ADISC_DONE;
380 ea.rc = res; 386 ea.rc = res;
@@ -425,7 +431,7 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
425done_free_sp: 431done_free_sp:
426 sp->free(sp); 432 sp->free(sp);
427done: 433done:
428 fcport->flags &= ~FCF_ASYNC_SENT; 434 fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
429 qla2x00_post_async_adisc_work(vha, fcport, data); 435 qla2x00_post_async_adisc_work(vha, fcport, data);
430 return rval; 436 return rval;
431} 437}
@@ -1799,6 +1805,7 @@ qla2x00_async_logout_done(struct scsi_qla_host *vha, fc_port_t *fcport,
1799 qla2x00_mark_device_lost(vha, fcport, 1, 0); 1805 qla2x00_mark_device_lost(vha, fcport, 1, 0);
1800 qlt_logo_completion_handler(fcport, data[0]); 1806 qlt_logo_completion_handler(fcport, data[0]);
1801 fcport->login_gen++; 1807 fcport->login_gen++;
1808 fcport->flags &= ~FCF_ASYNC_ACTIVE;
1802 return; 1809 return;
1803} 1810}
1804 1811
@@ -1806,6 +1813,7 @@ void
1806qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport, 1813qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
1807 uint16_t *data) 1814 uint16_t *data)
1808{ 1815{
1816 fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
1809 if (data[0] == MBS_COMMAND_COMPLETE) { 1817 if (data[0] == MBS_COMMAND_COMPLETE) {
1810 qla2x00_update_fcport(vha, fcport); 1818 qla2x00_update_fcport(vha, fcport);
1811 1819
@@ -1813,7 +1821,6 @@ qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
1813 } 1821 }
1814 1822
1815 /* Retry login. */ 1823 /* Retry login. */
1816 fcport->flags &= ~FCF_ASYNC_SENT;
1817 if (data[1] & QLA_LOGIO_LOGIN_RETRIED) 1824 if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
1818 set_bit(RELOGIN_NEEDED, &vha->dpc_flags); 1825 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
1819 else 1826 else