block: Introduce queue flag QUEUE_FLAG_SCSI_PASSTHROUGH
From the context where a SCSI command is submitted it is not always possible to figure out whether or not the queue the command is submitted to has struct scsi_request as the first member of its private data. Hence introduce the flag QUEUE_FLAG_SCSI_PASSTHROUGH. Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Cc: Omar Sandoval <osandov@fb.com> Cc: Don Brace <don.brace@microsemi.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
		
							parent
							
								
									edea55abb8
								
							
						
					
					
						commit
						9efc160f4b
					
				| @ -246,6 +246,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, char *name, | ||||
| 	q->bsg_job_size = dd_job_size; | ||||
| 	q->bsg_job_fn = job_fn; | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, q); | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, q); | ||||
| 	blk_queue_softirq_done(q, bsg_softirq_done); | ||||
| 	blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT); | ||||
| 
 | ||||
|  | ||||
| @ -1956,6 +1956,7 @@ static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, | ||||
| 	disk->queue->cmd_size = sizeof(struct scsi_request); | ||||
| 	disk->queue->request_fn = do_cciss_request; | ||||
| 	disk->queue->queue_lock = &h->lock; | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, disk->queue); | ||||
| 	if (blk_init_allocated_queue(disk->queue) < 0) | ||||
| 		goto cleanup_queue; | ||||
| 
 | ||||
|  | ||||
| @ -773,6 +773,7 @@ static int ide_init_queue(ide_drive_t *drive) | ||||
| 	q->request_fn = do_ide_request; | ||||
| 	q->init_rq_fn = ide_init_rq; | ||||
| 	q->cmd_size = sizeof(struct ide_request); | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, q); | ||||
| 	if (blk_init_allocated_queue(q) < 0) { | ||||
| 		blk_cleanup_queue(q); | ||||
| 		return 1; | ||||
|  | ||||
| @ -2057,6 +2057,8 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q) | ||||
| { | ||||
| 	struct device *dev = shost->dma_dev; | ||||
| 
 | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, q); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * this limit is imposed by hardware restrictions | ||||
| 	 */ | ||||
|  | ||||
| @ -264,6 +264,7 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy) | ||||
| 		q->queuedata = shost; | ||||
| 
 | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, q); | ||||
| 	queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, q); | ||||
| 	return 0; | ||||
| 
 | ||||
| out_cleanup_queue: | ||||
|  | ||||
| @ -618,6 +618,7 @@ struct request_queue { | ||||
| #define QUEUE_FLAG_STATS       27	/* track rq completion times */ | ||||
| #define QUEUE_FLAG_POLL_STATS  28	/* collecting stats for hybrid polling */ | ||||
| #define QUEUE_FLAG_REGISTERED  29	/* queue has been registered to a disk */ | ||||
| #define QUEUE_FLAG_SCSI_PASSTHROUGH 30	/* queue supports SCSI commands */ | ||||
| 
 | ||||
| #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\ | ||||
| 				 (1 << QUEUE_FLAG_STACKABLE)	|	\ | ||||
| @ -708,6 +709,8 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) | ||||
| #define blk_queue_secure_erase(q) \ | ||||
| 	(test_bit(QUEUE_FLAG_SECERASE, &(q)->queue_flags)) | ||||
| #define blk_queue_dax(q)	test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags) | ||||
| #define blk_queue_scsi_passthrough(q)	\ | ||||
| 	test_bit(QUEUE_FLAG_SCSI_PASSTHROUGH, &(q)->queue_flags) | ||||
| 
 | ||||
| #define blk_noretry_request(rq) \ | ||||
| 	((rq)->cmd_flags & (REQ_FAILFAST_DEV|REQ_FAILFAST_TRANSPORT| \ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user