Export scsi_device_from_queue for use with pktcdvd and use that instead of the otherwise unused QUEUE_FLAG_SCSI_PASSTHROUGH queue flag.
Unified · Split
| @@ -124,7 +124,6 @@ static const char *const blk_queue_flag_name[] = { · 123 unmodified lines | |||
| 124 | QUEUE_FLAG_NAME(STATS), | 124 | QUEUE_FLAG_NAME(STATS), |
| 125 | QUEUE_FLAG_NAME(POLL_STATS), | 125 | QUEUE_FLAG_NAME(POLL_STATS), |
| 126 | QUEUE_FLAG_NAME(REGISTERED), | 126 | QUEUE_FLAG_NAME(REGISTERED), |
| 127 | QUEUE_FLAG_NAME(SCSI_PASSTHROUGH), | ||
| 128 | QUEUE_FLAG_NAME(QUIESCED), | 127 | QUEUE_FLAG_NAME(QUIESCED), |
| 129 | QUEUE_FLAG_NAME(PCI_P2PDMA), | 128 | QUEUE_FLAG_NAME(PCI_P2PDMA), |
| 130 | QUEUE_FLAG_NAME(ZONE_RESETALL), | 129 | QUEUE_FLAG_NAME(ZONE_RESETALL), |
| @@ -2536,6 +2536,7 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) · 2535 unmodified lines | |||
| 2536 | int i; | 2536 | int i; |
| 2537 | char b[BDEVNAME_SIZE]; | 2537 | char b[BDEVNAME_SIZE]; |
| 2538 | struct block_device *bdev; | 2538 | struct block_device *bdev; |
| 2539 | struct scsi_device *sdev; | ||
| 2539 | 2540 | ||
| 2540 | if (pd->pkt_dev == dev) { | 2541 | if (pd->pkt_dev == dev) { |
| 2541 | pkt_err(pd, "recursive setup not allowed\n"); | 2542 | pkt_err(pd, "recursive setup not allowed\n"); |
| @@ -2559,10 +2560,12 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev) · 17 unmodified lines | |||
| 2559 | bdev = blkdev_get_by_dev(dev, FMODE_READ | FMODE_NDELAY, NULL); | 2560 | bdev = blkdev_get_by_dev(dev, FMODE_READ | FMODE_NDELAY, NULL); |
| 2560 | if (IS_ERR(bdev)) | 2561 | if (IS_ERR(bdev)) |
| 2561 | return PTR_ERR(bdev); | 2562 | return PTR_ERR(bdev); |
| 2562 | if (!blk_queue_scsi_passthrough(bdev_get_queue(bdev))) { | 2563 | sdev = scsi_device_from_queue(bdev->bd_disk->queue); |
| 2564 | if (!sdev) { | ||
| 2563 | blkdev_put(bdev, FMODE_READ | FMODE_NDELAY); | 2565 | blkdev_put(bdev, FMODE_READ | FMODE_NDELAY); |
| 2564 | return -EINVAL; | 2566 | return -EINVAL; |
| 2565 | } | 2567 | } |
| 2568 | put_device(&sdev->sdev_gendev); | ||
| 2566 | 2569 | ||
| 2567 | /* This is safe, since we have a reference from open(). */ | 2570 | /* This is safe, since we have a reference from open(). */ |
| 2568 | __module_get(THIS_MODULE); | 2571 | __module_get(THIS_MODULE); |
| @@ -1967,6 +1967,14 @@ struct scsi_device *scsi_device_from_queue(struct request_queue *q) · 1966 unmodified lines | |||
| 1967 | 1967 | ||
| 1968 | return sdev; | 1968 | return sdev; |
| 1969 | } | 1969 | } |
| 1970 | /* | ||
| 1971 | * pktcdvd should have been integrated into the SCSI layers, but for historical | ||
| 1972 | * reasons like the old IDE driver it isn't. This export allows it to safely | ||
| 1973 | * probe if a given device is a SCSI one and only attach to that. | ||
| 1974 | */ | ||
| 1975 | #ifdef CONFIG_CDROM_PKTCDVD_MODULE | ||
| 1976 | EXPORT_SYMBOL_GPL(scsi_device_from_queue); | ||
| 1977 | #endif | ||
| 1970 | 1978 | ||
| 1971 | /** | 1979 | /** |
| 1972 | * scsi_block_requests - Utility function used by low-level drivers to prevent | 1980 | * scsi_block_requests - Utility function used by low-level drivers to prevent |
| @@ -280,7 +280,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, · 279 unmodified lines | |||
| 280 | sdev->request_queue = q; | 280 | sdev->request_queue = q; |
| 281 | q->queuedata = sdev; | 281 | q->queuedata = sdev; |
| 282 | __scsi_init_queue(sdev->host, q); | 282 | __scsi_init_queue(sdev->host, q); |
| 283 | blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, q); | ||
| 284 | WARN_ON_ONCE(!blk_get_queue(q)); | 283 | WARN_ON_ONCE(!blk_get_queue(q)); |
| 285 | 284 | ||
| 286 | depth = sdev->host->cmd_per_lun ?: 1; | 285 | depth = sdev->host->cmd_per_lun ?: 1; |
| @@ -357,7 +357,6 @@ struct request_queue { · 356 unmodified lines | |||
| 357 | #define QUEUE_FLAG_STATS 20 /* track IO start and completion times */ | 357 | #define QUEUE_FLAG_STATS 20 /* track IO start and completion times */ |
| 358 | #define QUEUE_FLAG_POLL_STATS 21 /* collecting stats for hybrid polling */ | 358 | #define QUEUE_FLAG_POLL_STATS 21 /* collecting stats for hybrid polling */ |
| 359 | #define QUEUE_FLAG_REGISTERED 22 /* queue has been registered to a disk */ | 359 | #define QUEUE_FLAG_REGISTERED 22 /* queue has been registered to a disk */ |
| 360 | #define QUEUE_FLAG_SCSI_PASSTHROUGH 23 /* queue supports SCSI commands */ | ||
| 361 | #define QUEUE_FLAG_QUIESCED 24 /* queue has been quiesced */ | 360 | #define QUEUE_FLAG_QUIESCED 24 /* queue has been quiesced */ |
| 362 | #define QUEUE_FLAG_PCI_P2PDMA 25 /* device supports PCI p2p requests */ | 361 | #define QUEUE_FLAG_PCI_P2PDMA 25 /* device supports PCI p2p requests */ |
| 363 | #define QUEUE_FLAG_ZONE_RESETALL 26 /* supports Zone Reset All */ | 362 | #define QUEUE_FLAG_ZONE_RESETALL 26 /* supports Zone Reset All */ |
| @@ -391,8 +390,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q); · 27 unmodified lines | |||
| 391 | #define blk_queue_secure_erase(q) \ | 390 | #define blk_queue_secure_erase(q) \ |
| 392 | (test_bit(QUEUE_FLAG_SECERASE, &(q)->queue_flags)) | 391 | (test_bit(QUEUE_FLAG_SECERASE, &(q)->queue_flags)) |
| 393 | #define blk_queue_dax(q) test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags) | 392 | #define blk_queue_dax(q) test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags) |
| 394 | #define blk_queue_scsi_passthrough(q) \ | ||
| 395 | test_bit(QUEUE_FLAG_SCSI_PASSTHROUGH, &(q)->queue_flags) | ||
| 396 | #define blk_queue_pci_p2pdma(q) \ | 393 | #define blk_queue_pci_p2pdma(q) \ |
| 397 | test_bit(QUEUE_FLAG_PCI_P2PDMA, &(q)->queue_flags) | 394 | test_bit(QUEUE_FLAG_PCI_P2PDMA, &(q)->queue_flags) |
| 398 | #ifdef CONFIG_BLK_RQ_ALLOC_TIME | 395 | #ifdef CONFIG_BLK_RQ_ALLOC_TIME |