|
@@ -55,7 +55,7 @@
|
|
|
|
|
|
static DEFINE_MUTEX(idecd_ref_mutex);
|
|
|
|
|
|
-static void ide_cd_release(struct kref *);
|
|
|
+static void ide_cd_release(struct device *);
|
|
|
|
|
|
static struct cdrom_info *ide_cd_get(struct gendisk *disk)
|
|
|
{
|
|
@@ -67,7 +67,7 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk)
|
|
|
if (ide_device_get(cd->drive))
|
|
|
cd = NULL;
|
|
|
else
|
|
|
- kref_get(&cd->kref);
|
|
|
+ get_device(&cd->dev);
|
|
|
|
|
|
}
|
|
|
mutex_unlock(&idecd_ref_mutex);
|
|
@@ -79,7 +79,7 @@ static void ide_cd_put(struct cdrom_info *cd)
|
|
|
ide_drive_t *drive = cd->drive;
|
|
|
|
|
|
mutex_lock(&idecd_ref_mutex);
|
|
|
- kref_put(&cd->kref, ide_cd_release);
|
|
|
+ put_device(&cd->dev);
|
|
|
ide_device_put(drive);
|
|
|
mutex_unlock(&idecd_ref_mutex);
|
|
|
}
|
|
@@ -194,6 +194,14 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive,
|
|
|
bio_sectors = max(bio_sectors(failed_command->bio), 4U);
|
|
|
sector &= ~(bio_sectors - 1);
|
|
|
|
|
|
+ /*
|
|
|
+ * The SCSI specification allows for the value
|
|
|
+ * returned by READ CAPACITY to be up to 75 2K
|
|
|
+ * sectors past the last readable block.
|
|
|
+ * Therefore, if we hit a medium error within the
|
|
|
+ * last 75 2K sectors, we decrease the saved size
|
|
|
+ * value.
|
|
|
+ */
|
|
|
if (sector < get_capacity(info->disk) &&
|
|
|
drive->probed_capacity - sector < 4 * 75)
|
|
|
set_capacity(info->disk, sector);
|
|
@@ -1790,15 +1798,17 @@ static void ide_cd_remove(ide_drive_t *drive)
|
|
|
ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
|
|
|
|
|
|
ide_proc_unregister_driver(drive, info->driver);
|
|
|
-
|
|
|
+ device_del(&info->dev);
|
|
|
del_gendisk(info->disk);
|
|
|
|
|
|
- ide_cd_put(info);
|
|
|
+ mutex_lock(&idecd_ref_mutex);
|
|
|
+ put_device(&info->dev);
|
|
|
+ mutex_unlock(&idecd_ref_mutex);
|
|
|
}
|
|
|
|
|
|
-static void ide_cd_release(struct kref *kref)
|
|
|
+static void ide_cd_release(struct device *dev)
|
|
|
{
|
|
|
- struct cdrom_info *info = to_ide_drv(kref, cdrom_info);
|
|
|
+ struct cdrom_info *info = to_ide_drv(dev, cdrom_info);
|
|
|
struct cdrom_device_info *devinfo = &info->devinfo;
|
|
|
ide_drive_t *drive = info->drive;
|
|
|
struct gendisk *g = info->disk;
|
|
@@ -1997,7 +2007,12 @@ static int ide_cd_probe(ide_drive_t *drive)
|
|
|
|
|
|
ide_init_disk(g, drive);
|
|
|
|
|
|
- kref_init(&info->kref);
|
|
|
+ info->dev.parent = &drive->gendev;
|
|
|
+ info->dev.release = ide_cd_release;
|
|
|
+ dev_set_name(&info->dev, dev_name(&drive->gendev));
|
|
|
+
|
|
|
+ if (device_register(&info->dev))
|
|
|
+ goto out_free_disk;
|
|
|
|
|
|
info->drive = drive;
|
|
|
info->driver = &ide_cdrom_driver;
|
|
@@ -2011,7 +2026,7 @@ static int ide_cd_probe(ide_drive_t *drive)
|
|
|
g->driverfs_dev = &drive->gendev;
|
|
|
g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
|
|
|
if (ide_cdrom_setup(drive)) {
|
|
|
- ide_cd_release(&info->kref);
|
|
|
+ put_device(&info->dev);
|
|
|
goto failed;
|
|
|
}
|
|
|
|
|
@@ -2021,6 +2036,8 @@ static int ide_cd_probe(ide_drive_t *drive)
|
|
|
add_disk(g);
|
|
|
return 0;
|
|
|
|
|
|
+out_free_disk:
|
|
|
+ put_disk(g);
|
|
|
out_free_cd:
|
|
|
kfree(info);
|
|
|
failed:
|