Re: [PATCH v2 05/20] scsi: core: Add support for internal commands

John Garry
2021-11-22T08:58:11Z

On 19/11/2021 19:57, Bart Van Assche wrote:
> +/**
> + * scsi_get_internal_cmd - Allocate an internal SCSI command
> + * @q: request queue from which to allocate the command. This request queue may
> + * but does not have to be associated with a SCSI device. This request
> + * queue must be associated with a SCSI tag set. See also
> + * scsi_mq_setup_tags().
> + * @data_direction: Data direction for the allocated command.
> + * @flags: Zero or more BLK_MQ_REQ_* flags.
> + *
> + * Allocates a request for driver-internal use. The tag of the returned SCSI
> + * command is guaranteed to be unique.
> + */
> +struct scsi_cmnd *scsi_get_internal_cmd(struct request_queue *q,
> + enum dma_data_direction data_direction,
> + blk_mq_req_flags_t flags)

I'd pass the Scsi_Host or scsi_device rather than a request q, so maybe:

struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev, ..)
struct scsi_cmnd *scsi_host_get_internal_cmd(struct Scsi_Host *shost, ..)

> +{
> + unsigned int opf = REQ_INTERNAL;
> + struct request *rq;
> +
> + opf |= data_direction == DMA_TO_DEVICE ? REQ_OP_DRV_OUT : REQ_OP_DRV_IN;
> + rq = blk_mq_alloc_request(q, opf, flags);
> + if (IS_ERR(rq))
> + return ERR_CAST(rq);

I think that Christoph suggested elsewhere that we should poison all the
scsi_cmnd

> + return blk_mq_rq_to_pdu(rq);
> +}
> +EXPORT_SYMBOL_GPL(scsi_get_internal_cmd);