scsi: qla2xxx: Retry fabric Scan on IOCB queue full
authorQuinn Tran <qutran@marvell.com>
Fri, 26 Jul 2019 16:07:34 +0000 (09:07 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 7 Aug 2019 22:08:12 +0000 (18:08 -0400)
when fabric scan thread encounters IOCB Q Full, schedule a delayed work to
retry fabric scan.

Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gs.c

index ebf223cfebbc5c14b329f21bbb4a45c6409bce76..749109c8f20ba6489cbde11bb4f6b999e3f733d1 100644 (file)
@@ -4053,9 +4053,6 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp,
 
        rval = qla2x00_start_sp(sp);
        if (rval != QLA_SUCCESS) {
-               spin_lock_irqsave(&vha->work_lock, flags);
-               vha->scan.scan_flags &= ~SF_SCANNING;
-               spin_unlock_irqrestore(&vha->work_lock, flags);
                goto done_free_sp;
        }
 
@@ -4079,6 +4076,17 @@ done_free_sp:
 
        sp->free(sp);
 
+       spin_lock_irqsave(&vha->work_lock, flags);
+       vha->scan.scan_flags &= ~SF_SCANNING;
+       if (vha->scan.scan_flags == 0) {
+               ql_dbg(ql_dbg_disc, vha, 0xffff,
+                   "%s: schedule\n", __func__);
+               vha->scan.scan_flags |= SF_QUEUED;
+               schedule_delayed_work(&vha->scan.scan_work, 5);
+       }
+       spin_unlock_irqrestore(&vha->work_lock, flags);
+
+
        return rval;
 } /* GNNFT */
 
@@ -4208,9 +4216,6 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)
 
        rval = qla2x00_start_sp(sp);
        if (rval != QLA_SUCCESS) {
-               spin_lock_irqsave(&vha->work_lock, flags);
-               vha->scan.scan_flags &= ~SF_SCANNING;
-               spin_unlock_irqrestore(&vha->work_lock, flags);
                goto done_free_sp;
        }
 
@@ -4234,6 +4239,17 @@ done_free_sp:
 
        sp->free(sp);
 
+       spin_lock_irqsave(&vha->work_lock, flags);
+       vha->scan.scan_flags &= ~SF_SCANNING;
+       if (vha->scan.scan_flags == 0) {
+               ql_dbg(ql_dbg_disc, vha, 0xffff,
+                   "%s: schedule\n", __func__);
+               vha->scan.scan_flags |= SF_QUEUED;
+               schedule_delayed_work(&vha->scan.scan_work, 5);
+       }
+       spin_unlock_irqrestore(&vha->work_lock, flags);
+
+
        return rval;
 }