Skip to content

Commit

Permalink
blockdev: Store -drive option media in DriveInfo
Browse files Browse the repository at this point in the history
DriveInfo is closely tied to -drive, and like -drive, it mixes
information about host and guest part of the block device.  Unlike
DriveInfo, BlockDriverState should be about the host part only.

One of the remaining guest bits there is the "type hint".  -drive
option media sets it, and qdevs "ide-drive", "scsi-disk" and non-qdev
IF_XEN devices check it to pick HD vs. CD.

Communicate -drive option media via new DriveInfo member media_cd
instead.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Markus Armbruster authored and kevmw committed May 19, 2011
1 parent d8aeeb3 commit 95b5edc
Showing 6 changed files with 11 additions and 11 deletions.
1 change: 1 addition & 0 deletions blockdev.c
Original file line number Diff line number Diff line change
@@ -488,6 +488,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
break;
case MEDIA_CDROM:
bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_CDROM);
dinfo->media_cd = 1;
break;
}
break;
1 change: 1 addition & 0 deletions blockdev.h
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@ 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;
3 changes: 1 addition & 2 deletions hw/ide/core.c
Original file line number Diff line number Diff line change
@@ -1731,8 +1731,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);
10 changes: 4 additions & 6 deletions hw/ide/qdev.c
Original file line number Diff line number Diff line change
@@ -98,9 +98,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-cd" : "ide-hd");
dev = qdev_create(&bus->qbus, drive->media_cd ? "ide-cd" : "ide-hd");
qdev_prop_set_uint32(dev, "unit", unit);
qdev_prop_set_drive_nofail(dev, "drive", drive->bdrv);
qdev_init_nofail(dev);
@@ -165,9 +163,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_DEV_PROPERTIES() \
5 changes: 3 additions & 2 deletions hw/scsi-disk.c
Original file line number Diff line number Diff line change
@@ -1295,12 +1295,13 @@ static int scsi_cd_initfn(SCSIDevice *dev)
static int scsi_disk_initfn(SCSIDevice *dev)
{
SCSIDriveKind kind;
DriveInfo *dinfo;

if (!dev->conf.bs) {
kind = SCSI_HD; /* will die in scsi_initfn() */
} else {
kind = bdrv_get_type_hint(dev->conf.bs) == BDRV_TYPE_CDROM
? SCSI_CD : SCSI_HD;
dinfo = drive_get_by_blockdev(dev->conf.bs);
kind = dinfo->media_cd ? SCSI_CD : SCSI_HD;
}

return scsi_initfn(dev, kind);
2 changes: 1 addition & 1 deletion hw/xen_devconfig.c
Original file line number Diff line number Diff line change
@@ -96,7 +96,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";

0 comments on commit 95b5edc

Please sign in to comment.