@@ -437,6 +437,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi, int *fatal_error)
break;
case MEDIA_CDROM:
bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_CDROM);
+ dinfo->media_cd = 1;
break;
}
break;
@@ -32,6 +32,7 @@ typedef struct DriveInfo {
int bus;
int unit;
int auto_del; /* see blockdev_mark_auto_del() */
+ int media_cd;
QemuOpts *opts;
char serial[BLOCK_SERIAL_STRLEN + 1];
QTAILQ_ENTRY(DriveInfo) next;
@@ -2694,8 +2694,7 @@ void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
ide_init1(bus, i);
if (dinfo) {
if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
- bdrv_get_type_hint(dinfo->bdrv) == BDRV_TYPE_CDROM ? IDE_CD : IDE_HD,
- NULL,
+ dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
*dinfo->serial ? dinfo->serial : NULL) < 0) {
error_report("Can't set up IDE drive %s", dinfo->id);
exit(1);
@@ -82,9 +82,7 @@ IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive)
{
DeviceState *dev;
- dev = qdev_create(&bus->qbus,
- bdrv_get_type_hint(drive->bdrv) == BDRV_TYPE_CDROM
- ? "ide-hd" : "ide-cd");
+ dev = qdev_create(&bus->qbus, drive->media_cd ? "ide-hd" : "ide-cd");
qdev_prop_set_uint32(dev, "unit", unit);
qdev_prop_set_drive_nofail(dev, "drive", drive->bdrv);
qdev_init_nofail(dev);
@@ -145,9 +143,9 @@ static int ide_cd_initfn(IDEDevice *dev)
static int ide_drive_initfn(IDEDevice *dev)
{
- return ide_dev_initfn(dev,
- bdrv_get_type_hint(dev->conf.bs) == BDRV_TYPE_CDROM
- ? IDE_CD : IDE_HD);
+ DriveInfo *dinfo = drive_get_by_blockdev(dev->conf.bs);
+
+ return ide_dev_initfn(dev, dinfo->media_cd ? IDE_CD : IDE_HD);
}
#define DEFINE_IDE_DRIVE_PROPERTIES() \
@@ -1110,11 +1110,13 @@ static int scsi_cd_initfn(SCSIDevice *dev)
static int scsi_disk_initfn(SCSIDevice *dev)
{
int is_cd;
+ DriveInfo *dinfo;
if (!dev->conf.bs) {
is_cd = 0; /* will die in scsi_initfn() */
} else {
- is_cd = bdrv_get_type_hint(dev->conf.bs) == BDRV_TYPE_CDROM;
+ dinfo = drive_get_by_blockdev(dev->conf.bs);
+ is_cd = dinfo->media_cd;
}
return scsi_initfn(dev, is_cd);
@@ -94,7 +94,7 @@ int xen_config_dev_blk(DriveInfo *disk)
{
char fe[256], be[256];
int vdev = 202 * 256 + 16 * disk->unit;
- int cdrom = disk->bdrv->type == BDRV_TYPE_CDROM;
+ int cdrom = disk->media_cd;
const char *devtype = cdrom ? "cdrom" : "disk";
const char *mode = cdrom ? "r" : "w";
Use it instead of bdrv_get_type_hint() to pick HD vs. CD for IDE, SCSI and XEN drives. Signed-off-by: Markus Armbruster <armbru@redhat.com> --- blockdev.c | 1 + blockdev.h | 1 + hw/ide/core.c | 3 +-- hw/ide/qdev.c | 10 ++++------ hw/scsi-disk.c | 4 +++- hw/xen_devconfig.c | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-)