diff options
author | Markus Armbruster | 2010-06-29 16:58:30 +0200 |
---|---|---|
committer | Kevin Wolf | 2010-07-02 13:18:02 +0200 |
commit | 18846dee1a795b4345ac0bd10b70a3a46fd14287 (patch) | |
tree | ae5d0224a6e9733c38835c39fab70e5f42393867 /hw/scsi-bus.c | |
parent | blockdev: drive_get_by_id() is no longer used, remove (diff) | |
download | qemu-18846dee1a795b4345ac0bd10b70a3a46fd14287.tar.gz qemu-18846dee1a795b4345ac0bd10b70a3a46fd14287.tar.xz qemu-18846dee1a795b4345ac0bd10b70a3a46fd14287.zip |
block: Catch attempt to attach multiple devices to a blockdev
For instance, -device scsi-disk,drive=foo -device scsi-disk,drive=foo
happily creates two SCSI disks connected to the same block device.
It's all downhill from there.
Device usb-storage deliberately attaches twice to the same blockdev,
which fails with the fix in place. Detach before the second attach
there.
Also catch attempt to delete while a guest device model is attached.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'hw/scsi-bus.c')
-rw-r--r-- | hw/scsi-bus.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 2c58acac49..b84b9b98b5 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -91,7 +91,10 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv, int driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk"; dev = qdev_create(&bus->qbus, driver); qdev_prop_set_uint32(dev, "scsi-id", unit); - qdev_prop_set_drive(dev, "drive", bdrv); + if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) { + qdev_free(dev); + return NULL; + } if (qdev_init(dev) < 0) return NULL; return DO_UPCAST(SCSIDevice, qdev, dev); |