Commit 9c559c9b authored by John Garry's avatar John Garry Committed by Martin K. Petersen
Browse files

scsi: scsi_debug: Use blk_mq_tagset_busy_iter() in stop_all_queued()



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: default avatarJohn Garry <john.g.garry@oracle.com>
Link: https://lore.kernel.org/r/20230327074310.1862889-9-john.g.garry@oracle.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 600d9ead
Loading
Loading
Loading
Loading
+17 −28
Original line number Diff line number Diff line
@@ -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)