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);