scsi: scsi_debug: Use blk_mq_tagset_busy_iter() in stop_all_queued()
authorJohn Garry <john.g.garry@oracle.com>
Mon, 27 Mar 2023 07:43:07 +0000 (07:43 +0000)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 3 Apr 2023 02:09:22 +0000 (22:09 -0400)
Instead of iterating all deferred commands in the submission queue
structures, use blk_mq_tagset_busy_iter(), which is a standard API for
this.

Signed-off-by: John Garry <john.g.garry@oracle.com>
Link: https://lore.kernel.org/r/20230327074310.1862889-9-john.g.garry@oracle.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_debug.c

index 4ec94ba..9e1586b 100644 (file)
@@ -5326,40 +5326,29 @@ static bool scsi_debug_abort_cmnd(struct scsi_cmnd *cmnd)
        return res;
 }
 
+/*
+ * All we can do is set the cmnd as internally aborted and wait for it to
+ * finish. We cannot call scsi_done() as normal completion path may do that.
+ */
+static bool sdebug_stop_cmnd(struct request *rq, void *data)
+{
+       scsi_debug_abort_cmnd(blk_mq_rq_to_pdu(rq));
+
+       return true;
+}
+
 /* Deletes (stops) timers or work queues of all queued commands */
 static void stop_all_queued(void)
 {
-       unsigned long iflags, flags;
-       int j, k;
-       struct sdebug_queue *sqp;
+       struct sdebug_host_info *sdhp;
 
-       for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
-               spin_lock_irqsave(&sqp->qc_lock, iflags);
-               for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
-                       if (test_bit(k, sqp->in_use_bm)) {
-                               struct sdebug_queued_cmd *sqcp = sqp->qc_arr[k];
-                               struct sdebug_scsi_cmd *sdsc;
-                               struct scsi_cmnd *scmd;
+       mutex_lock(&sdebug_host_list_mutex);
+       list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
+               struct Scsi_Host *shost = sdhp->shost;
 
-                               if (!sqcp)
-                                       continue;
-                               scmd = sqcp->scmd;
-                               if (!scmd)
-                                       continue;
-                               sdsc = scsi_cmd_priv(scmd);
-                               spin_lock_irqsave(&sdsc->lock, flags);
-                               if (TO_QUEUED_CMD(scmd) != sqcp) {
-                                       spin_unlock_irqrestore(&sdsc->lock, flags);
-                                       continue;
-                               }
-                               scsi_debug_stop_cmnd(scmd, NULL);
-                               spin_unlock_irqrestore(&sdsc->lock, flags);
-                               sqp->qc_arr[k] = NULL;
-                               clear_bit(k, sqp->in_use_bm);
-                       }
-               }
-               spin_unlock_irqrestore(&sqp->qc_lock, iflags);
+               blk_mq_tagset_busy_iter(&shost->tag_set, sdebug_stop_cmnd, NULL);
        }
+       mutex_unlock(&sdebug_host_list_mutex);
 }
 
 static int scsi_debug_abort(struct scsi_cmnd *SCpnt)