cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sr.c (25637B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  sr.c Copyright (C) 1992 David Giller
      4 *           Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
      5 *
      6 *  adapted from:
      7 *      sd.c Copyright (C) 1992 Drew Eckhardt
      8 *      Linux scsi disk driver by
      9 *              Drew Eckhardt <drew@colorado.edu>
     10 *
     11 *	Modified by Eric Youngdale ericy@andante.org to
     12 *	add scatter-gather, multiple outstanding request, and other
     13 *	enhancements.
     14 *
     15 *      Modified by Eric Youngdale eric@andante.org to support loadable
     16 *      low-level scsi drivers.
     17 *
     18 *      Modified by Thomas Quinot thomas@melchior.cuivre.fdn.fr to
     19 *      provide auto-eject.
     20 *
     21 *      Modified by Gerd Knorr <kraxel@cs.tu-berlin.de> to support the
     22 *      generic cdrom interface
     23 *
     24 *      Modified by Jens Axboe <axboe@suse.de> - Uniform sr_packet()
     25 *      interface, capabilities probe additions, ioctl cleanups, etc.
     26 *
     27 *	Modified by Richard Gooch <rgooch@atnf.csiro.au> to support devfs
     28 *
     29 *	Modified by Jens Axboe <axboe@suse.de> - support DVD-RAM
     30 *	transparently and lose the GHOST hack
     31 *
     32 *	Modified by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
     33 *	check resource allocation in sr_init and some cleanups
     34 */
     35
     36#include <linux/module.h>
     37#include <linux/fs.h>
     38#include <linux/kernel.h>
     39#include <linux/mm.h>
     40#include <linux/bio.h>
     41#include <linux/compat.h>
     42#include <linux/string.h>
     43#include <linux/errno.h>
     44#include <linux/cdrom.h>
     45#include <linux/interrupt.h>
     46#include <linux/init.h>
     47#include <linux/major.h>
     48#include <linux/blkdev.h>
     49#include <linux/blk-pm.h>
     50#include <linux/mutex.h>
     51#include <linux/slab.h>
     52#include <linux/pm_runtime.h>
     53#include <linux/uaccess.h>
     54
     55#include <asm/unaligned.h>
     56
     57#include <scsi/scsi.h>
     58#include <scsi/scsi_dbg.h>
     59#include <scsi/scsi_device.h>
     60#include <scsi/scsi_driver.h>
     61#include <scsi/scsi_cmnd.h>
     62#include <scsi/scsi_eh.h>
     63#include <scsi/scsi_host.h>
     64#include <scsi/scsi_ioctl.h>	/* For the door lock/unlock commands */
     65
     66#include "scsi_logging.h"
     67#include "sr.h"
     68
     69
     70MODULE_DESCRIPTION("SCSI cdrom (sr) driver");
     71MODULE_LICENSE("GPL");
     72MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_CDROM_MAJOR);
     73MODULE_ALIAS_SCSI_DEVICE(TYPE_ROM);
     74MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM);
     75
     76#define SR_DISKS	256
     77
     78#define SR_CAPABILITIES \
     79	(CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
     80	 CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
     81	 CDC_PLAY_AUDIO|CDC_RESET|CDC_DRIVE_STATUS| \
     82	 CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
     83	 CDC_MRW|CDC_MRW_W|CDC_RAM)
     84
     85static int sr_probe(struct device *);
     86static int sr_remove(struct device *);
     87static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt);
     88static int sr_done(struct scsi_cmnd *);
     89static int sr_runtime_suspend(struct device *dev);
     90
     91static const struct dev_pm_ops sr_pm_ops = {
     92	.runtime_suspend	= sr_runtime_suspend,
     93};
     94
     95static struct scsi_driver sr_template = {
     96	.gendrv = {
     97		.name   	= "sr",
     98		.owner		= THIS_MODULE,
     99		.probe		= sr_probe,
    100		.remove		= sr_remove,
    101		.pm		= &sr_pm_ops,
    102	},
    103	.init_command		= sr_init_command,
    104	.done			= sr_done,
    105};
    106
    107static unsigned long sr_index_bits[SR_DISKS / BITS_PER_LONG];
    108static DEFINE_SPINLOCK(sr_index_lock);
    109
    110static struct lock_class_key sr_bio_compl_lkclass;
    111
    112static int sr_open(struct cdrom_device_info *, int);
    113static void sr_release(struct cdrom_device_info *);
    114
    115static void get_sectorsize(struct scsi_cd *);
    116static int get_capabilities(struct scsi_cd *);
    117
    118static unsigned int sr_check_events(struct cdrom_device_info *cdi,
    119				    unsigned int clearing, int slot);
    120static int sr_packet(struct cdrom_device_info *, struct packet_command *);
    121static int sr_read_cdda_bpc(struct cdrom_device_info *cdi, void __user *ubuf,
    122		u32 lba, u32 nr, u8 *last_sense);
    123
    124static const struct cdrom_device_ops sr_dops = {
    125	.open			= sr_open,
    126	.release	 	= sr_release,
    127	.drive_status	 	= sr_drive_status,
    128	.check_events		= sr_check_events,
    129	.tray_move		= sr_tray_move,
    130	.lock_door		= sr_lock_door,
    131	.select_speed		= sr_select_speed,
    132	.get_last_session	= sr_get_last_session,
    133	.get_mcn		= sr_get_mcn,
    134	.reset			= sr_reset,
    135	.audio_ioctl		= sr_audio_ioctl,
    136	.generic_packet		= sr_packet,
    137	.read_cdda_bpc		= sr_read_cdda_bpc,
    138	.capability		= SR_CAPABILITIES,
    139};
    140
    141static inline struct scsi_cd *scsi_cd(struct gendisk *disk)
    142{
    143	return disk->private_data;
    144}
    145
    146static int sr_runtime_suspend(struct device *dev)
    147{
    148	struct scsi_cd *cd = dev_get_drvdata(dev);
    149
    150	if (!cd)	/* E.g.: runtime suspend following sr_remove() */
    151		return 0;
    152
    153	if (cd->media_present)
    154		return -EBUSY;
    155	else
    156		return 0;
    157}
    158
    159static unsigned int sr_get_events(struct scsi_device *sdev)
    160{
    161	u8 buf[8];
    162	u8 cmd[] = { GET_EVENT_STATUS_NOTIFICATION,
    163		     1,			/* polled */
    164		     0, 0,		/* reserved */
    165		     1 << 4,		/* notification class: media */
    166		     0, 0,		/* reserved */
    167		     0, sizeof(buf),	/* allocation length */
    168		     0,			/* control */
    169	};
    170	struct event_header *eh = (void *)buf;
    171	struct media_event_desc *med = (void *)(buf + 4);
    172	struct scsi_sense_hdr sshdr;
    173	int result;
    174
    175	result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, sizeof(buf),
    176				  &sshdr, SR_TIMEOUT, MAX_RETRIES, NULL);
    177	if (scsi_sense_valid(&sshdr) && sshdr.sense_key == UNIT_ATTENTION)
    178		return DISK_EVENT_MEDIA_CHANGE;
    179
    180	if (result || be16_to_cpu(eh->data_len) < sizeof(*med))
    181		return 0;
    182
    183	if (eh->nea || eh->notification_class != 0x4)
    184		return 0;
    185
    186	if (med->media_event_code == 1)
    187		return DISK_EVENT_EJECT_REQUEST;
    188	else if (med->media_event_code == 2)
    189		return DISK_EVENT_MEDIA_CHANGE;
    190	else if (med->media_event_code == 3)
    191		return DISK_EVENT_MEDIA_CHANGE;
    192	return 0;
    193}
    194
    195/*
    196 * This function checks to see if the media has been changed or eject
    197 * button has been pressed.  It is possible that we have already
    198 * sensed a change, or the drive may have sensed one and not yet
    199 * reported it.  The past events are accumulated in sdev->changed and
    200 * returned together with the current state.
    201 */
    202static unsigned int sr_check_events(struct cdrom_device_info *cdi,
    203				    unsigned int clearing, int slot)
    204{
    205	struct scsi_cd *cd = cdi->handle;
    206	bool last_present;
    207	struct scsi_sense_hdr sshdr;
    208	unsigned int events;
    209	int ret;
    210
    211	/* no changer support */
    212	if (CDSL_CURRENT != slot)
    213		return 0;
    214
    215	events = sr_get_events(cd->device);
    216	cd->get_event_changed |= events & DISK_EVENT_MEDIA_CHANGE;
    217
    218	/*
    219	 * If earlier GET_EVENT_STATUS_NOTIFICATION and TUR did not agree
    220	 * for several times in a row.  We rely on TUR only for this likely
    221	 * broken device, to prevent generating incorrect media changed
    222	 * events for every open().
    223	 */
    224	if (cd->ignore_get_event) {
    225		events &= ~DISK_EVENT_MEDIA_CHANGE;
    226		goto do_tur;
    227	}
    228
    229	/*
    230	 * GET_EVENT_STATUS_NOTIFICATION is enough unless MEDIA_CHANGE
    231	 * is being cleared.  Note that there are devices which hang
    232	 * if asked to execute TUR repeatedly.
    233	 */
    234	if (cd->device->changed) {
    235		events |= DISK_EVENT_MEDIA_CHANGE;
    236		cd->device->changed = 0;
    237		cd->tur_changed = true;
    238	}
    239
    240	if (!(clearing & DISK_EVENT_MEDIA_CHANGE))
    241		return events;
    242do_tur:
    243	/* let's see whether the media is there with TUR */
    244	last_present = cd->media_present;
    245	ret = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
    246
    247	/*
    248	 * Media is considered to be present if TUR succeeds or fails with
    249	 * sense data indicating something other than media-not-present
    250	 * (ASC 0x3a).
    251	 */
    252	cd->media_present = scsi_status_is_good(ret) ||
    253		(scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a);
    254
    255	if (last_present != cd->media_present)
    256		cd->device->changed = 1;
    257
    258	if (cd->device->changed) {
    259		events |= DISK_EVENT_MEDIA_CHANGE;
    260		cd->device->changed = 0;
    261		cd->tur_changed = true;
    262	}
    263
    264	if (cd->ignore_get_event)
    265		return events;
    266
    267	/* check whether GET_EVENT is reporting spurious MEDIA_CHANGE */
    268	if (!cd->tur_changed) {
    269		if (cd->get_event_changed) {
    270			if (cd->tur_mismatch++ > 8) {
    271				sr_printk(KERN_WARNING, cd,
    272					  "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n");
    273				cd->ignore_get_event = true;
    274			}
    275		} else {
    276			cd->tur_mismatch = 0;
    277		}
    278	}
    279	cd->tur_changed = false;
    280	cd->get_event_changed = false;
    281
    282	return events;
    283}
    284
    285/*
    286 * sr_done is the interrupt routine for the device driver.
    287 *
    288 * It will be notified on the end of a SCSI read / write, and will take one
    289 * of several actions based on success or failure.
    290 */
    291static int sr_done(struct scsi_cmnd *SCpnt)
    292{
    293	int result = SCpnt->result;
    294	int this_count = scsi_bufflen(SCpnt);
    295	int good_bytes = (result == 0 ? this_count : 0);
    296	int block_sectors = 0;
    297	long error_sector;
    298	struct request *rq = scsi_cmd_to_rq(SCpnt);
    299	struct scsi_cd *cd = scsi_cd(rq->q->disk);
    300
    301#ifdef DEBUG
    302	scmd_printk(KERN_INFO, SCpnt, "done: %x\n", result);
    303#endif
    304
    305	/*
    306	 * Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial
    307	 * success.  Since this is a relatively rare error condition, no
    308	 * care is taken to avoid unnecessary additional work such as
    309	 * memcpy's that could be avoided.
    310	 */
    311	if (scsi_status_is_check_condition(result) &&
    312	    (SCpnt->sense_buffer[0] & 0x7f) == 0x70) { /* Sense current */
    313		switch (SCpnt->sense_buffer[2]) {
    314		case MEDIUM_ERROR:
    315		case VOLUME_OVERFLOW:
    316		case ILLEGAL_REQUEST:
    317			if (!(SCpnt->sense_buffer[0] & 0x90))
    318				break;
    319			error_sector =
    320				get_unaligned_be32(&SCpnt->sense_buffer[3]);
    321			if (rq->bio != NULL)
    322				block_sectors = bio_sectors(rq->bio);
    323			if (block_sectors < 4)
    324				block_sectors = 4;
    325			if (cd->device->sector_size == 2048)
    326				error_sector <<= 2;
    327			error_sector &= ~(block_sectors - 1);
    328			good_bytes = (error_sector - blk_rq_pos(rq)) << 9;
    329			if (good_bytes < 0 || good_bytes >= this_count)
    330				good_bytes = 0;
    331			/*
    332			 * The SCSI specification allows for the value
    333			 * returned by READ CAPACITY to be up to 75 2K
    334			 * sectors past the last readable block.
    335			 * Therefore, if we hit a medium error within the
    336			 * last 75 2K sectors, we decrease the saved size
    337			 * value.
    338			 */
    339			if (error_sector < get_capacity(cd->disk) &&
    340			    cd->capacity - error_sector < 4 * 75)
    341				set_capacity(cd->disk, error_sector);
    342			break;
    343
    344		case RECOVERED_ERROR:
    345			good_bytes = this_count;
    346			break;
    347
    348		default:
    349			break;
    350		}
    351	}
    352
    353	return good_bytes;
    354}
    355
    356static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt)
    357{
    358	int block = 0, this_count, s_size;
    359	struct scsi_cd *cd;
    360	struct request *rq = scsi_cmd_to_rq(SCpnt);
    361	blk_status_t ret;
    362
    363	ret = scsi_alloc_sgtables(SCpnt);
    364	if (ret != BLK_STS_OK)
    365		return ret;
    366	cd = scsi_cd(rq->q->disk);
    367
    368	SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt,
    369		"Doing sr request, block = %d\n", block));
    370
    371	if (!cd->device || !scsi_device_online(cd->device)) {
    372		SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
    373			"Finishing %u sectors\n", blk_rq_sectors(rq)));
    374		SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
    375			"Retry with 0x%p\n", SCpnt));
    376		goto out;
    377	}
    378
    379	if (cd->device->changed) {
    380		/*
    381		 * quietly refuse to do anything to a changed disc until the
    382		 * changed bit has been reset
    383		 */
    384		goto out;
    385	}
    386
    387	s_size = cd->device->sector_size;
    388	if (s_size != 512 && s_size != 1024 && s_size != 2048) {
    389		scmd_printk(KERN_ERR, SCpnt, "bad sector size %d\n", s_size);
    390		goto out;
    391	}
    392
    393	switch (req_op(rq)) {
    394	case REQ_OP_WRITE:
    395		if (!cd->writeable)
    396			goto out;
    397		SCpnt->cmnd[0] = WRITE_10;
    398		cd->cdi.media_written = 1;
    399		break;
    400	case REQ_OP_READ:
    401		SCpnt->cmnd[0] = READ_10;
    402		break;
    403	default:
    404		blk_dump_rq_flags(rq, "Unknown sr command");
    405		goto out;
    406	}
    407
    408	{
    409		struct scatterlist *sg;
    410		int i, size = 0, sg_count = scsi_sg_count(SCpnt);
    411
    412		scsi_for_each_sg(SCpnt, sg, sg_count, i)
    413			size += sg->length;
    414
    415		if (size != scsi_bufflen(SCpnt)) {
    416			scmd_printk(KERN_ERR, SCpnt,
    417				"mismatch count %d, bytes %d\n",
    418				size, scsi_bufflen(SCpnt));
    419			if (scsi_bufflen(SCpnt) > size)
    420				SCpnt->sdb.length = size;
    421		}
    422	}
    423
    424	/*
    425	 * request doesn't start on hw block boundary, add scatter pads
    426	 */
    427	if (((unsigned int)blk_rq_pos(rq) % (s_size >> 9)) ||
    428	    (scsi_bufflen(SCpnt) % s_size)) {
    429		scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n");
    430		goto out;
    431	}
    432
    433	this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
    434
    435
    436	SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
    437					"%s %d/%u 512 byte blocks.\n",
    438					(rq_data_dir(rq) == WRITE) ?
    439					"writing" : "reading",
    440					this_count, blk_rq_sectors(rq)));
    441
    442	SCpnt->cmnd[1] = 0;
    443	block = (unsigned int)blk_rq_pos(rq) / (s_size >> 9);
    444
    445	if (this_count > 0xffff) {
    446		this_count = 0xffff;
    447		SCpnt->sdb.length = this_count * s_size;
    448	}
    449
    450	put_unaligned_be32(block, &SCpnt->cmnd[2]);
    451	SCpnt->cmnd[6] = SCpnt->cmnd[9] = 0;
    452	put_unaligned_be16(this_count, &SCpnt->cmnd[7]);
    453
    454	/*
    455	 * We shouldn't disconnect in the middle of a sector, so with a dumb
    456	 * host adapter, it's safe to assume that we can at least transfer
    457	 * this many bytes between each connect / disconnect.
    458	 */
    459	SCpnt->transfersize = cd->device->sector_size;
    460	SCpnt->underflow = this_count << 9;
    461	SCpnt->allowed = MAX_RETRIES;
    462	SCpnt->cmd_len = 10;
    463
    464	/*
    465	 * This indicates that the command is ready from our end to be queued.
    466	 */
    467	return BLK_STS_OK;
    468 out:
    469	scsi_free_sgtables(SCpnt);
    470	return BLK_STS_IOERR;
    471}
    472
    473static void sr_revalidate_disk(struct scsi_cd *cd)
    474{
    475	struct scsi_sense_hdr sshdr;
    476
    477	/* if the unit is not ready, nothing more to do */
    478	if (scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
    479		return;
    480	sr_cd_check(&cd->cdi);
    481	get_sectorsize(cd);
    482}
    483
    484static int sr_block_open(struct block_device *bdev, fmode_t mode)
    485{
    486	struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
    487	struct scsi_device *sdev = cd->device;
    488	int ret;
    489
    490	if (scsi_device_get(cd->device))
    491		return -ENXIO;
    492
    493	scsi_autopm_get_device(sdev);
    494	if (bdev_check_media_change(bdev))
    495		sr_revalidate_disk(cd);
    496
    497	mutex_lock(&cd->lock);
    498	ret = cdrom_open(&cd->cdi, bdev, mode);
    499	mutex_unlock(&cd->lock);
    500
    501	scsi_autopm_put_device(sdev);
    502	if (ret)
    503		scsi_device_put(cd->device);
    504	return ret;
    505}
    506
    507static void sr_block_release(struct gendisk *disk, fmode_t mode)
    508{
    509	struct scsi_cd *cd = scsi_cd(disk);
    510
    511	mutex_lock(&cd->lock);
    512	cdrom_release(&cd->cdi, mode);
    513	mutex_unlock(&cd->lock);
    514
    515	scsi_device_put(cd->device);
    516}
    517
    518static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
    519			  unsigned long arg)
    520{
    521	struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
    522	struct scsi_device *sdev = cd->device;
    523	void __user *argp = (void __user *)arg;
    524	int ret;
    525
    526	if (bdev_is_partition(bdev) && !capable(CAP_SYS_RAWIO))
    527		return -ENOIOCTLCMD;
    528
    529	mutex_lock(&cd->lock);
    530
    531	ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
    532			(mode & FMODE_NDELAY) != 0);
    533	if (ret)
    534		goto out;
    535
    536	scsi_autopm_get_device(sdev);
    537
    538	if (cmd != CDROMCLOSETRAY && cmd != CDROMEJECT) {
    539		ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
    540		if (ret != -ENOSYS)
    541			goto put;
    542	}
    543	ret = scsi_ioctl(sdev, mode, cmd, argp);
    544
    545put:
    546	scsi_autopm_put_device(sdev);
    547out:
    548	mutex_unlock(&cd->lock);
    549	return ret;
    550}
    551
    552static unsigned int sr_block_check_events(struct gendisk *disk,
    553					  unsigned int clearing)
    554{
    555	struct scsi_cd *cd = disk->private_data;
    556
    557	if (atomic_read(&cd->device->disk_events_disable_depth))
    558		return 0;
    559	return cdrom_check_events(&cd->cdi, clearing);
    560}
    561
    562static void sr_free_disk(struct gendisk *disk)
    563{
    564	struct scsi_cd *cd = disk->private_data;
    565
    566	spin_lock(&sr_index_lock);
    567	clear_bit(MINOR(disk_devt(disk)), sr_index_bits);
    568	spin_unlock(&sr_index_lock);
    569
    570	unregister_cdrom(&cd->cdi);
    571	mutex_destroy(&cd->lock);
    572	kfree(cd);
    573}
    574
    575static const struct block_device_operations sr_bdops =
    576{
    577	.owner		= THIS_MODULE,
    578	.open		= sr_block_open,
    579	.release	= sr_block_release,
    580	.ioctl		= sr_block_ioctl,
    581	.compat_ioctl	= blkdev_compat_ptr_ioctl,
    582	.check_events	= sr_block_check_events,
    583	.free_disk	= sr_free_disk,
    584};
    585
    586static int sr_open(struct cdrom_device_info *cdi, int purpose)
    587{
    588	struct scsi_cd *cd = cdi->handle;
    589	struct scsi_device *sdev = cd->device;
    590	int retval;
    591
    592	/*
    593	 * If the device is in error recovery, wait until it is done.
    594	 * If the device is offline, then disallow any access to it.
    595	 */
    596	retval = -ENXIO;
    597	if (!scsi_block_when_processing_errors(sdev))
    598		goto error_out;
    599
    600	return 0;
    601
    602error_out:
    603	return retval;	
    604}
    605
    606static void sr_release(struct cdrom_device_info *cdi)
    607{
    608}
    609
    610static int sr_probe(struct device *dev)
    611{
    612	struct scsi_device *sdev = to_scsi_device(dev);
    613	struct gendisk *disk;
    614	struct scsi_cd *cd;
    615	int minor, error;
    616
    617	scsi_autopm_get_device(sdev);
    618	error = -ENODEV;
    619	if (sdev->type != TYPE_ROM && sdev->type != TYPE_WORM)
    620		goto fail;
    621
    622	error = -ENOMEM;
    623	cd = kzalloc(sizeof(*cd), GFP_KERNEL);
    624	if (!cd)
    625		goto fail;
    626
    627	disk = __alloc_disk_node(sdev->request_queue, NUMA_NO_NODE,
    628				 &sr_bio_compl_lkclass);
    629	if (!disk)
    630		goto fail_free;
    631	mutex_init(&cd->lock);
    632
    633	spin_lock(&sr_index_lock);
    634	minor = find_first_zero_bit(sr_index_bits, SR_DISKS);
    635	if (minor == SR_DISKS) {
    636		spin_unlock(&sr_index_lock);
    637		error = -EBUSY;
    638		goto fail_put;
    639	}
    640	__set_bit(minor, sr_index_bits);
    641	spin_unlock(&sr_index_lock);
    642
    643	disk->major = SCSI_CDROM_MAJOR;
    644	disk->first_minor = minor;
    645	disk->minors = 1;
    646	sprintf(disk->disk_name, "sr%d", minor);
    647	disk->fops = &sr_bdops;
    648	disk->flags |= GENHD_FL_REMOVABLE | GENHD_FL_NO_PART;
    649	disk->events = DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST;
    650	disk->event_flags = DISK_EVENT_FLAG_POLL | DISK_EVENT_FLAG_UEVENT |
    651				DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE;
    652
    653	blk_queue_rq_timeout(sdev->request_queue, SR_TIMEOUT);
    654
    655	cd->device = sdev;
    656	cd->disk = disk;
    657	cd->capacity = 0x1fffff;
    658	cd->device->changed = 1;	/* force recheck CD type */
    659	cd->media_present = 1;
    660	cd->use = 1;
    661	cd->readcd_known = 0;
    662	cd->readcd_cdda = 0;
    663
    664	cd->cdi.ops = &sr_dops;
    665	cd->cdi.handle = cd;
    666	cd->cdi.mask = 0;
    667	cd->cdi.capacity = 1;
    668	sprintf(cd->cdi.name, "sr%d", minor);
    669
    670	sdev->sector_size = 2048;	/* A guess, just in case */
    671
    672	error = -ENOMEM;
    673	if (get_capabilities(cd))
    674		goto fail_minor;
    675	sr_vendor_init(cd);
    676
    677	set_capacity(disk, cd->capacity);
    678	disk->private_data = cd;
    679
    680	if (register_cdrom(disk, &cd->cdi))
    681		goto fail_minor;
    682
    683	/*
    684	 * Initialize block layer runtime PM stuffs before the
    685	 * periodic event checking request gets started in add_disk.
    686	 */
    687	blk_pm_runtime_init(sdev->request_queue, dev);
    688
    689	dev_set_drvdata(dev, cd);
    690	sr_revalidate_disk(cd);
    691
    692	error = device_add_disk(&sdev->sdev_gendev, disk, NULL);
    693	if (error)
    694		goto unregister_cdrom;
    695
    696	sdev_printk(KERN_DEBUG, sdev,
    697		    "Attached scsi CD-ROM %s\n", cd->cdi.name);
    698	scsi_autopm_put_device(cd->device);
    699
    700	return 0;
    701
    702unregister_cdrom:
    703	unregister_cdrom(&cd->cdi);
    704fail_minor:
    705	spin_lock(&sr_index_lock);
    706	clear_bit(minor, sr_index_bits);
    707	spin_unlock(&sr_index_lock);
    708fail_put:
    709	put_disk(disk);
    710	mutex_destroy(&cd->lock);
    711fail_free:
    712	kfree(cd);
    713fail:
    714	scsi_autopm_put_device(sdev);
    715	return error;
    716}
    717
    718
    719static void get_sectorsize(struct scsi_cd *cd)
    720{
    721	unsigned char cmd[10];
    722	unsigned char buffer[8];
    723	int the_result, retries = 3;
    724	int sector_size;
    725	struct request_queue *queue;
    726
    727	do {
    728		cmd[0] = READ_CAPACITY;
    729		memset((void *) &cmd[1], 0, 9);
    730		memset(buffer, 0, sizeof(buffer));
    731
    732		/* Do the command and wait.. */
    733		the_result = scsi_execute_req(cd->device, cmd, DMA_FROM_DEVICE,
    734					      buffer, sizeof(buffer), NULL,
    735					      SR_TIMEOUT, MAX_RETRIES, NULL);
    736
    737		retries--;
    738
    739	} while (the_result && retries);
    740
    741
    742	if (the_result) {
    743		cd->capacity = 0x1fffff;
    744		sector_size = 2048;	/* A guess, just in case */
    745	} else {
    746		long last_written;
    747
    748		cd->capacity = 1 + get_unaligned_be32(&buffer[0]);
    749		/*
    750		 * READ_CAPACITY doesn't return the correct size on
    751		 * certain UDF media.  If last_written is larger, use
    752		 * it instead.
    753		 *
    754		 * http://bugzilla.kernel.org/show_bug.cgi?id=9668
    755		 */
    756		if (!cdrom_get_last_written(&cd->cdi, &last_written))
    757			cd->capacity = max_t(long, cd->capacity, last_written);
    758
    759		sector_size = get_unaligned_be32(&buffer[4]);
    760		switch (sector_size) {
    761			/*
    762			 * HP 4020i CD-Recorder reports 2340 byte sectors
    763			 * Philips CD-Writers report 2352 byte sectors
    764			 *
    765			 * Use 2k sectors for them..
    766			 */
    767		case 0:
    768		case 2340:
    769		case 2352:
    770			sector_size = 2048;
    771			fallthrough;
    772		case 2048:
    773			cd->capacity *= 4;
    774			fallthrough;
    775		case 512:
    776			break;
    777		default:
    778			sr_printk(KERN_INFO, cd,
    779				  "unsupported sector size %d.", sector_size);
    780			cd->capacity = 0;
    781		}
    782
    783		cd->device->sector_size = sector_size;
    784
    785		/*
    786		 * Add this so that we have the ability to correctly gauge
    787		 * what the device is capable of.
    788		 */
    789		set_capacity(cd->disk, cd->capacity);
    790	}
    791
    792	queue = cd->device->request_queue;
    793	blk_queue_logical_block_size(queue, sector_size);
    794
    795	return;
    796}
    797
    798static int get_capabilities(struct scsi_cd *cd)
    799{
    800	unsigned char *buffer;
    801	struct scsi_mode_data data;
    802	struct scsi_sense_hdr sshdr;
    803	unsigned int ms_len = 128;
    804	int rc, n;
    805
    806	static const char *loadmech[] =
    807	{
    808		"caddy",
    809		"tray",
    810		"pop-up",
    811		"",
    812		"changer",
    813		"cartridge changer",
    814		"",
    815		""
    816	};
    817
    818
    819	/* allocate transfer buffer */
    820	buffer = kmalloc(512, GFP_KERNEL);
    821	if (!buffer) {
    822		sr_printk(KERN_ERR, cd, "out of memory.\n");
    823		return -ENOMEM;
    824	}
    825
    826	/* eat unit attentions */
    827	scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
    828
    829	/* ask for mode page 0x2a */
    830	rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
    831			     SR_TIMEOUT, 3, &data, NULL);
    832
    833	if (rc < 0 || data.length > ms_len ||
    834	    data.header_length + data.block_descriptor_length > data.length) {
    835		/* failed, drive doesn't have capabilities mode page */
    836		cd->cdi.speed = 1;
    837		cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
    838				 CDC_DVD | CDC_DVD_RAM |
    839				 CDC_SELECT_DISC | CDC_SELECT_SPEED |
    840				 CDC_MRW | CDC_MRW_W | CDC_RAM);
    841		kfree(buffer);
    842		sr_printk(KERN_INFO, cd, "scsi-1 drive");
    843		return 0;
    844	}
    845
    846	n = data.header_length + data.block_descriptor_length;
    847	cd->cdi.speed = get_unaligned_be16(&buffer[n + 8]) / 176;
    848	cd->readcd_known = 1;
    849	cd->readcd_cdda = buffer[n + 5] & 0x01;
    850	/* print some capability bits */
    851	sr_printk(KERN_INFO, cd,
    852		  "scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n",
    853		  get_unaligned_be16(&buffer[n + 14]) / 176,
    854		  cd->cdi.speed,
    855		  buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */
    856		  buffer[n + 3] & 0x20 ? "dvd-ram " : "",
    857		  buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */
    858		  buffer[n + 4] & 0x20 ? "xa/form2 " : "",	/* can read xa/from2 */
    859		  buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */
    860		  loadmech[buffer[n + 6] >> 5]);
    861	if ((buffer[n + 6] >> 5) == 0)
    862		/* caddy drives can't close tray... */
    863		cd->cdi.mask |= CDC_CLOSE_TRAY;
    864	if ((buffer[n + 2] & 0x8) == 0)
    865		/* not a DVD drive */
    866		cd->cdi.mask |= CDC_DVD;
    867	if ((buffer[n + 3] & 0x20) == 0)
    868		/* can't write DVD-RAM media */
    869		cd->cdi.mask |= CDC_DVD_RAM;
    870	if ((buffer[n + 3] & 0x10) == 0)
    871		/* can't write DVD-R media */
    872		cd->cdi.mask |= CDC_DVD_R;
    873	if ((buffer[n + 3] & 0x2) == 0)
    874		/* can't write CD-RW media */
    875		cd->cdi.mask |= CDC_CD_RW;
    876	if ((buffer[n + 3] & 0x1) == 0)
    877		/* can't write CD-R media */
    878		cd->cdi.mask |= CDC_CD_R;
    879	if ((buffer[n + 6] & 0x8) == 0)
    880		/* can't eject */
    881		cd->cdi.mask |= CDC_OPEN_TRAY;
    882
    883	if ((buffer[n + 6] >> 5) == mechtype_individual_changer ||
    884	    (buffer[n + 6] >> 5) == mechtype_cartridge_changer)
    885		cd->cdi.capacity =
    886		    cdrom_number_of_slots(&cd->cdi);
    887	if (cd->cdi.capacity <= 1)
    888		/* not a changer */
    889		cd->cdi.mask |= CDC_SELECT_DISC;
    890	/*else    I don't think it can close its tray
    891		cd->cdi.mask |= CDC_CLOSE_TRAY; */
    892
    893	/*
    894	 * if DVD-RAM, MRW-W or CD-RW, we are randomly writable
    895	 */
    896	if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) !=
    897			(CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) {
    898		cd->writeable = 1;
    899	}
    900
    901	kfree(buffer);
    902	return 0;
    903}
    904
    905/*
    906 * sr_packet() is the entry point for the generic commands generated
    907 * by the Uniform CD-ROM layer.
    908 */
    909static int sr_packet(struct cdrom_device_info *cdi,
    910		struct packet_command *cgc)
    911{
    912	struct scsi_cd *cd = cdi->handle;
    913	struct scsi_device *sdev = cd->device;
    914
    915	if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)
    916		return -EDRIVE_CANT_DO_THIS;
    917
    918	if (cgc->timeout <= 0)
    919		cgc->timeout = IOCTL_TIMEOUT;
    920
    921	sr_do_ioctl(cd, cgc);
    922
    923	return cgc->stat;
    924}
    925
    926static int sr_read_cdda_bpc(struct cdrom_device_info *cdi, void __user *ubuf,
    927		u32 lba, u32 nr, u8 *last_sense)
    928{
    929	struct gendisk *disk = cdi->disk;
    930	u32 len = nr * CD_FRAMESIZE_RAW;
    931	struct scsi_cmnd *scmd;
    932	struct request *rq;
    933	struct bio *bio;
    934	int ret;
    935
    936	rq = scsi_alloc_request(disk->queue, REQ_OP_DRV_IN, 0);
    937	if (IS_ERR(rq))
    938		return PTR_ERR(rq);
    939	scmd = blk_mq_rq_to_pdu(rq);
    940
    941	ret = blk_rq_map_user(disk->queue, rq, NULL, ubuf, len, GFP_KERNEL);
    942	if (ret)
    943		goto out_put_request;
    944
    945	scmd->cmnd[0] = GPCMD_READ_CD;
    946	scmd->cmnd[1] = 1 << 2;
    947	scmd->cmnd[2] = (lba >> 24) & 0xff;
    948	scmd->cmnd[3] = (lba >> 16) & 0xff;
    949	scmd->cmnd[4] = (lba >>  8) & 0xff;
    950	scmd->cmnd[5] = lba & 0xff;
    951	scmd->cmnd[6] = (nr >> 16) & 0xff;
    952	scmd->cmnd[7] = (nr >>  8) & 0xff;
    953	scmd->cmnd[8] = nr & 0xff;
    954	scmd->cmnd[9] = 0xf8;
    955	scmd->cmd_len = 12;
    956	rq->timeout = 60 * HZ;
    957	bio = rq->bio;
    958
    959	blk_execute_rq(rq, false);
    960	if (scmd->result) {
    961		struct scsi_sense_hdr sshdr;
    962
    963		scsi_normalize_sense(scmd->sense_buffer, scmd->sense_len,
    964				     &sshdr);
    965		*last_sense = sshdr.sense_key;
    966		ret = -EIO;
    967	}
    968
    969	if (blk_rq_unmap_user(bio))
    970		ret = -EFAULT;
    971out_put_request:
    972	blk_mq_free_request(rq);
    973	return ret;
    974}
    975
    976static int sr_remove(struct device *dev)
    977{
    978	struct scsi_cd *cd = dev_get_drvdata(dev);
    979
    980	scsi_autopm_get_device(cd->device);
    981
    982	del_gendisk(cd->disk);
    983	put_disk(cd->disk);
    984
    985	return 0;
    986}
    987
    988static int __init init_sr(void)
    989{
    990	int rc;
    991
    992	rc = register_blkdev(SCSI_CDROM_MAJOR, "sr");
    993	if (rc)
    994		return rc;
    995	rc = scsi_register_driver(&sr_template.gendrv);
    996	if (rc)
    997		unregister_blkdev(SCSI_CDROM_MAJOR, "sr");
    998
    999	return rc;
   1000}
   1001
   1002static void __exit exit_sr(void)
   1003{
   1004	scsi_unregister_driver(&sr_template.gendrv);
   1005	unregister_blkdev(SCSI_CDROM_MAJOR, "sr");
   1006}
   1007
   1008module_init(init_sr);
   1009module_exit(exit_sr);
   1010MODULE_LICENSE("GPL");