mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 05:20:50 +00:00
blockdev: Store -drive option media in DriveInfo
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>
This commit is contained in:
parent
d8aeeb31d5
commit
95b5edcd92
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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() \
|
||||
|
@ -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);
|
||||
|
@ -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";
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user