From f8b6cc0070aab8b75bd082582c829be1353f395f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 5 May 2010 16:36:52 +0200 Subject: qdev: Decouple qdev_prop_drive from DriveInfo Make the property point to BlockDriverState, cutting out the DriveInfo middleman. This prepares the ground for block devices that don't have a DriveInfo. Currently all user-defined ones have a DriveInfo, because the only way to define one is -drive & friends (they go through drive_init()). DriveInfo is closely tied to -drive, and like -drive, it mixes information about host and guest part of the block device. I'm working towards a new way to define block devices, with clean host/guest separation, and I need to get DriveInfo out of the way for that. Fortunately, the device models are perfectly happy with BlockDriverState, except for two places: ide_drive_initfn() and scsi_disk_initfn() need to check the DriveInfo for a serial number set with legacy -drive serial=... Use drive_get_by_blockdev() there. Device model code should now use DriveInfo only when explicitly dealing with drives defined the old way, i.e. without -device. Signed-off-by: Markus Armbruster Reviewed-by: Christoph Hellwig Signed-off-by: Kevin Wolf --- hw/scsi-disk.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'hw/scsi-disk.c') diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index d76e640412..e900eff024 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -1043,26 +1043,24 @@ static void scsi_destroy(SCSIDevice *dev) SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); scsi_disk_purge_requests(s); - blockdev_mark_auto_del(s->qdev.conf.dinfo->bdrv); + blockdev_mark_auto_del(s->qdev.conf.bs); } static int scsi_disk_initfn(SCSIDevice *dev) { SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); + DriveInfo *dinfo; - if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) { + if (!s->qdev.conf.bs) { error_report("scsi-disk: drive property not set"); return -1; } - s->bs = s->qdev.conf.dinfo->bdrv; + s->bs = s->qdev.conf.bs; if (!s->serial) { - if (*dev->conf.dinfo->serial) { - /* try to fall back to value set with legacy -drive serial=... */ - s->serial = qemu_strdup(dev->conf.dinfo->serial); - } else { - s->serial = qemu_strdup("0"); - } + /* try to fall back to value set with legacy -drive serial=... */ + dinfo = drive_get_by_blockdev(s->bs); + s->serial = qemu_strdup(*dinfo->serial ? dinfo->serial : "0"); } if (!s->version) { -- cgit v1.2.3