diff options
author | Markus Armbruster <armbru@redhat.com> | 2014-09-12 21:24:34 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2014-09-22 09:55:55 +0200 |
commit | 31376776d045c7ee0a1570c139ef30b6cb8f5b01 (patch) | |
tree | a71068ddd503ff53f16ad1ff8b779d0d1b76d18a | |
parent | 07e2863d0271ac6c05206d8ce9e4f4c39b25d3ea (diff) | |
download | qemu-31376776d045c7ee0a1570c139ef30b6cb8f5b01.zip qemu-31376776d045c7ee0a1570c139ef30b6cb8f5b01.tar.gz qemu-31376776d045c7ee0a1570c139ef30b6cb8f5b01.tar.bz2 |
usb-storage: Fix how legacy init handles option ID clash
usb_msd_init() calls qemu_opts_create() with a made-up ID and false
fail_if_exists. If the ID already exists, it happily messes up those
options, then fails drive_new(), because the BlockDriverState with
that ID already exists, too.
Reproducer: -drive if=none,id=usb0,format=raw -usbdevice disk:tmp.qcow2
Pass true fail_if_exists to qemu_opts_create(), and if it fails, try
the next made-up ID.
The reproducer now succeeds, and creates an usb-storage device with ID
usb1.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | hw/usb/dev-storage.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index ae4efcb..eb75f6a 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -666,8 +666,10 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename) char fmt[32]; /* parse -usbdevice disk: syntax into drive opts */ - snprintf(id, sizeof(id), "usb%d", nr++); - opts = qemu_opts_create(qemu_find_opts("drive"), id, 0, NULL); + do { + snprintf(id, sizeof(id), "usb%d", nr++); + opts = qemu_opts_create(qemu_find_opts("drive"), id, 1, NULL); + } while (!opts); p1 = strchr(filename, ':'); if (p1++) { |