scsi: ibmvfc: Purge SCSI channels after transport loss/reset
authorTyrel Datwyler <tyreld@linux.ibm.com>
Thu, 14 Jan 2021 20:31:46 +0000 (14:31 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 15 Jan 2021 03:31:04 +0000 (22:31 -0500)
Grab the queue and list lock for each Sub-CRQ and add any uncompleted
events to the host purge list.

Link: https://lore.kernel.org/r/20210114203148.246656-20-tyreld@linux.ibm.com
Reviewed-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ibmvscsi/ibmvfc.c

index fc94665ead686b694a8739db7f7b3fe5f63835fb..b2a7601d2c5b9b7c500c42db720ade7362c3becf 100644 (file)
@@ -1056,7 +1056,13 @@ static void ibmvfc_fail_request(struct ibmvfc_event *evt, int error_code)
 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code)
 {
        struct ibmvfc_event *evt, *pos;
+       struct ibmvfc_queue *queues = vhost->scsi_scrqs.scrqs;
        unsigned long flags;
+       int hwqs = 0;
+       int i;
+
+       if (vhost->using_channels)
+               hwqs = vhost->scsi_scrqs.active_queues;
 
        ibmvfc_dbg(vhost, "Purging all requests\n");
        spin_lock_irqsave(&vhost->crq.l_lock, flags);
@@ -1064,6 +1070,16 @@ static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code)
                ibmvfc_fail_request(evt, error_code);
        list_splice_init(&vhost->crq.sent, &vhost->purge);
        spin_unlock_irqrestore(&vhost->crq.l_lock, flags);
+
+       for (i = 0; i < hwqs; i++) {
+               spin_lock_irqsave(queues[i].q_lock, flags);
+               spin_lock(&queues[i].l_lock);
+               list_for_each_entry_safe(evt, pos, &queues[i].sent, queue_list)
+                       ibmvfc_fail_request(evt, error_code);
+               list_splice_init(&queues[i].sent, &vhost->purge);
+               spin_unlock(&queues[i].l_lock);
+               spin_unlock_irqrestore(queues[i].q_lock, flags);
+       }
 }
 
 /**