diff options
Diffstat (limited to 'drivers/scsi/sr.c')
| -rw-r--r-- | drivers/scsi/sr.c | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index b17796d5ee66..c36c54ecd354 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -82,8 +82,8 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM); CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \ CDC_MRW|CDC_MRW_W|CDC_RAM) -static int sr_probe(struct device *); -static int sr_remove(struct device *); +static int sr_probe(struct scsi_device *); +static void sr_remove(struct scsi_device *); static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt); static int sr_done(struct scsi_cmnd *); static int sr_runtime_suspend(struct device *dev); @@ -93,10 +93,10 @@ static const struct dev_pm_ops sr_pm_ops = { }; static struct scsi_driver sr_template = { + .probe = sr_probe, + .remove = sr_remove, .gendrv = { .name = "sr", - .probe = sr_probe, - .remove = sr_remove, .pm = &sr_pm_ops, }, .init_command = sr_init_command, @@ -395,7 +395,7 @@ static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt) switch (req_op(rq)) { case REQ_OP_WRITE: - if (!cd->writeable) + if (get_disk_ro(cd->disk)) goto out; SCpnt->cmnd[0] = WRITE_10; cd->cdi.media_written = 1; @@ -475,13 +475,21 @@ static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt) static int sr_revalidate_disk(struct scsi_cd *cd) { + struct request_queue *q = cd->device->request_queue; struct scsi_sense_hdr sshdr; + struct queue_limits lim; + int sector_size; /* if the unit is not ready, nothing more to do */ if (scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr)) return 0; sr_cd_check(&cd->cdi); - return get_sectorsize(cd); + sector_size = get_sectorsize(cd); + + lim = queue_limits_start_update(q); + lim.logical_block_size = sector_size; + lim.features |= BLK_FEAT_ROTATIONAL; + return queue_limits_commit_update_frozen(q, &lim); } static int sr_block_open(struct gendisk *disk, blk_mode_t mode) @@ -608,9 +616,9 @@ static void sr_release(struct cdrom_device_info *cdi) { } -static int sr_probe(struct device *dev) +static int sr_probe(struct scsi_device *sdev) { - struct scsi_device *sdev = to_scsi_device(dev); + struct device *dev = &sdev->sdev_gendev; struct gendisk *disk; struct scsi_cd *cd; int minor, error; @@ -621,7 +629,7 @@ static int sr_probe(struct device *dev) goto fail; error = -ENOMEM; - cd = kzalloc(sizeof(*cd), GFP_KERNEL); + cd = kzalloc_obj(*cd); if (!cd) goto fail; @@ -673,6 +681,7 @@ static int sr_probe(struct device *dev) error = -ENOMEM; if (get_capabilities(cd)) goto fail_minor; + cdrom_probe_write_features(&cd->cdi); sr_vendor_init(cd); set_capacity(disk, cd->capacity); @@ -721,10 +730,8 @@ fail: static int get_sectorsize(struct scsi_cd *cd) { - struct request_queue *q = cd->device->request_queue; static const u8 cmd[10] = { READ_CAPACITY }; unsigned char buffer[8] = { }; - struct queue_limits lim; int err; int sector_size; struct scsi_failure failure_defs[] = { @@ -795,9 +802,7 @@ static int get_sectorsize(struct scsi_cd *cd) set_capacity(cd->disk, cd->capacity); } - lim = queue_limits_start_update(q); - lim.logical_block_size = sector_size; - return queue_limits_commit_update_frozen(q, &lim); + return sector_size; } static int get_capabilities(struct scsi_cd *cd) @@ -895,14 +900,6 @@ static int get_capabilities(struct scsi_cd *cd) /*else I don't think it can close its tray cd->cdi.mask |= CDC_CLOSE_TRAY; */ - /* - * if DVD-RAM, MRW-W or CD-RW, we are randomly writable - */ - if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) != - (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) { - cd->writeable = 1; - } - kfree(buffer); return 0; } @@ -978,16 +975,15 @@ out_put_request: return ret; } -static int sr_remove(struct device *dev) +static void sr_remove(struct scsi_device *sdev) { + struct device *dev = &sdev->sdev_gendev; struct scsi_cd *cd = dev_get_drvdata(dev); scsi_autopm_get_device(cd->device); del_gendisk(cd->disk); put_disk(cd->disk); - - return 0; } static int __init init_sr(void) @@ -997,7 +993,7 @@ static int __init init_sr(void) rc = register_blkdev(SCSI_CDROM_MAJOR, "sr"); if (rc) return rc; - rc = scsi_register_driver(&sr_template.gendrv); + rc = scsi_register_driver(&sr_template); if (rc) unregister_blkdev(SCSI_CDROM_MAJOR, "sr"); @@ -1006,7 +1002,7 @@ static int __init init_sr(void) static void __exit exit_sr(void) { - scsi_unregister_driver(&sr_template.gendrv); + scsi_unregister_driver(&sr_template); unregister_blkdev(SCSI_CDROM_MAJOR, "sr"); } |
