usb: fix usb_qdev_init error handling.

qdev doesn't call the ->exit callback on ->init failures, so we have to
take care ourself that we cleanup property on errors.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2011-11-22 12:48:14 +01:00
parent 2af2a1b8d0
commit f462141f18

View file

@ -9,6 +9,7 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);
static char *usb_get_dev_path(DeviceState *dev);
static char *usb_get_fw_dev_path(DeviceState *qdev);
static int usb_qdev_exit(DeviceState *qdev);
static struct BusInfo usb_bus_info = {
.name = "USB",
@ -75,12 +76,23 @@ static int usb_qdev_init(DeviceState *qdev, DeviceInfo *base)
dev->auto_attach = 1;
QLIST_INIT(&dev->strings);
rc = usb_claim_port(dev);
if (rc == 0) {
rc = dev->info->init(dev);
if (rc != 0) {
goto err;
}
if (rc == 0 && dev->auto_attach) {
rc = dev->info->init(dev);
if (rc != 0) {
goto err;
}
if (dev->auto_attach) {
rc = usb_device_attach(dev);
if (rc != 0) {
goto err;
}
}
return 0;
err:
usb_qdev_exit(qdev);
return rc;
}