void drive_hot_add(Monitor *mon, const QDict *qdict) { int type; DriveInfo *dinfo = NULL; const char *opts = qdict_get_str(qdict, "opts"); dinfo = add_init_drive(opts); if (!dinfo) { goto err; } if (dinfo->devaddr) { monitor_printf(mon, "Parameter addr not supported\n"); goto err; } type = dinfo->type; switch (type) { case IF_NONE: monitor_printf(mon, "OK\n"); break; default: if (pci_drive_hot_add(mon, qdict, dinfo, type)) { goto err; } } return; err: if (dinfo) { drive_put_ref(dinfo); } }
static int pci_piix3_xen_ide_unplug(DeviceState *dev) { PCIDevice *pci_dev; PCIIDEState *pci_ide; DriveInfo *di; int i = 0; pci_dev = DO_UPCAST(PCIDevice, qdev, dev); pci_ide = DO_UPCAST(PCIIDEState, dev, pci_dev); for (; i < 3; i++) { di = drive_get_by_index(IF_IDE, i); if (di != NULL && !di->media_cd) { DeviceState *ds = bdrv_get_attached_dev(di->bdrv); if (ds) { bdrv_detach_dev(di->bdrv, ds); } bdrv_close(di->bdrv); pci_ide->bus[di->bus].ifs[di->unit].bs = NULL; drive_put_ref(di); } } qdev_reset_all(&(pci_ide->dev.qdev)); return 0; }