On 5/3/21 8:03 AM, Hannes Reinecke wrote: > +/** > + * scsi_get_internal_cmd - allocate an internal SCSI command > + * @sdev: SCSI device from which to allocate the command > + * @op: operation (REQ_OP_SCSI_IN or REQ_OP_SCSI_OUT) > + * @flags: BLK_MQ_REQ_* flags, e.g. BLK_MQ_REQ_NOWAIT. > + * > + * Allocates a SCSI command for internal LLDD use. > + */ > +struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev, > + unsigned int op, blk_mq_req_flags_t flags) > +{ > + struct request *rq; > + struct scsi_cmnd *scmd; > + > + WARN_ON_ONCE(((op & REQ_OP_MASK) != REQ_OP_SCSI_IN) && > + ((op & REQ_OP_MASK) != REQ_OP_SCSI_OUT)); > + rq = blk_mq_alloc_request(sdev->request_queue, op, flags); > + if (IS_ERR(rq)) > + return NULL; > + scmd = blk_mq_rq_to_pdu(rq); > + scmd->request = rq; > + scmd->device = sdev; > + return scmd; > +} > +EXPORT_SYMBOL_GPL(scsi_get_internal_cmd); Multiple fields that are initialized by the regular command submission path are not initialized by the above function, e.g. scmd->tag. Has it been considered to call scsi_init_command() instead of adding yet another code path that initializes scmd->request? Thanks, Bart.