mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	scsi: Call scsi_initialize_rq() for filesystem requests
If a pass-through request is submitted then blk_get_request() initializes that request by calling scsi_initialize_rq(). Also call this function for filesystem requests. Introduce CMD_INITIALIZED to keep track of whether or not a request has already been initialized. Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Brian King <brking@linux.vnet.ibm.com> Cc: Hannes Reinecke <hare@suse.com> Cc: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
		
							parent
							
								
									3515832cc6
								
							
						
					
					
						commit
						64104f7032
					
				
					 2 changed files with 25 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -642,6 +642,11 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
 | 
			
		|||
	if (blk_queue_add_random(q))
 | 
			
		||||
		add_disk_randomness(req->rq_disk);
 | 
			
		||||
 | 
			
		||||
	if (!blk_rq_is_scsi(req)) {
 | 
			
		||||
		WARN_ON_ONCE(!(cmd->flags & SCMD_INITIALIZED));
 | 
			
		||||
		cmd->flags &= ~SCMD_INITIALIZED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (req->mq_ctx) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * In the MQ case the command gets freed by __blk_mq_end_request,
 | 
			
		||||
| 
						 | 
				
			
			@ -1110,7 +1115,8 @@ EXPORT_SYMBOL(scsi_init_io);
 | 
			
		|||
 * scsi_initialize_rq - initialize struct scsi_cmnd.req
 | 
			
		||||
 * @rq: Request associated with the SCSI command to be initialized.
 | 
			
		||||
 *
 | 
			
		||||
 * Called from inside blk_get_request().
 | 
			
		||||
 * Called from inside blk_get_request() for pass-through requests and from
 | 
			
		||||
 * inside scsi_init_command() for filesystem requests.
 | 
			
		||||
 */
 | 
			
		||||
void scsi_initialize_rq(struct request *rq)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1154,7 +1160,13 @@ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd)
 | 
			
		|||
{
 | 
			
		||||
	void *buf = cmd->sense_buffer;
 | 
			
		||||
	void *prot = cmd->prot_sdb;
 | 
			
		||||
	unsigned int unchecked_isa_dma = cmd->flags & SCMD_UNCHECKED_ISA_DMA;
 | 
			
		||||
	struct request *rq = blk_mq_rq_from_pdu(cmd);
 | 
			
		||||
	unsigned int flags = cmd->flags & SCMD_PRESERVED_FLAGS;
 | 
			
		||||
 | 
			
		||||
	if (!blk_rq_is_scsi(rq) && !(flags & SCMD_INITIALIZED)) {
 | 
			
		||||
		flags |= SCMD_INITIALIZED;
 | 
			
		||||
		scsi_initialize_rq(rq);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* zero out the cmd, except for the embedded scsi_request */
 | 
			
		||||
	memset((char *)cmd + sizeof(cmd->req), 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -1163,7 +1175,7 @@ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd)
 | 
			
		|||
	cmd->device = dev;
 | 
			
		||||
	cmd->sense_buffer = buf;
 | 
			
		||||
	cmd->prot_sdb = prot;
 | 
			
		||||
	cmd->flags = unchecked_isa_dma;
 | 
			
		||||
	cmd->flags = flags;
 | 
			
		||||
	INIT_DELAYED_WORK(&cmd->abort_work, scmd_eh_abort_handler);
 | 
			
		||||
	cmd->jiffies_at_alloc = jiffies;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1350,6 +1362,8 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
 | 
			
		|||
 | 
			
		||||
	ret = scsi_setup_cmnd(sdev, req);
 | 
			
		||||
out:
 | 
			
		||||
	if (ret != BLKPREP_OK)
 | 
			
		||||
		cmd->flags &= ~SCMD_INITIALIZED;
 | 
			
		||||
	return scsi_prep_return(q, req, ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1869,6 +1883,7 @@ static int scsi_mq_prep_fn(struct request *req)
 | 
			
		|||
	struct scsi_device *sdev = req->q->queuedata;
 | 
			
		||||
	struct Scsi_Host *shost = sdev->host;
 | 
			
		||||
	struct scatterlist *sg;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	scsi_init_command(sdev, cmd);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1902,7 +1917,10 @@ static int scsi_mq_prep_fn(struct request *req)
 | 
			
		|||
 | 
			
		||||
	blk_mq_start_request(req);
 | 
			
		||||
 | 
			
		||||
	return scsi_setup_cmnd(sdev, req);
 | 
			
		||||
	ret = scsi_setup_cmnd(sdev, req);
 | 
			
		||||
	if (ret != BLK_STS_OK)
 | 
			
		||||
		cmd->flags &= ~SCMD_INITIALIZED;
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void scsi_mq_done(struct scsi_cmnd *cmd)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,6 +57,9 @@ struct scsi_pointer {
 | 
			
		|||
/* for scmd->flags */
 | 
			
		||||
#define SCMD_TAGGED		(1 << 0)
 | 
			
		||||
#define SCMD_UNCHECKED_ISA_DMA	(1 << 1)
 | 
			
		||||
#define SCMD_INITIALIZED	(1 << 3)
 | 
			
		||||
/* flags preserved across unprep / reprep */
 | 
			
		||||
#define SCMD_PRESERVED_FLAGS	(SCMD_UNCHECKED_ISA_DMA | SCMD_INITIALIZED)
 | 
			
		||||
 | 
			
		||||
struct scsi_cmnd {
 | 
			
		||||
	struct scsi_request req;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue