mirror of
https://github.com/xemu-project/xemu.git
synced 2025-01-21 03:16:59 +00:00
Implement scsi device destruction
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
d29275f103
commit
01985dcf38
@ -30,6 +30,7 @@ static int scsi_qdev_init(DeviceState *qdev, DeviceInfo *base)
|
||||
SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
|
||||
SCSIDeviceInfo *info = DO_UPCAST(SCSIDeviceInfo, qdev, base);
|
||||
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
|
||||
int rc = -1;
|
||||
|
||||
if (dev->id == -1) {
|
||||
for (dev->id = 0; dev->id < bus->ndev; dev->id++) {
|
||||
@ -43,21 +44,38 @@ static int scsi_qdev_init(DeviceState *qdev, DeviceInfo *base)
|
||||
}
|
||||
|
||||
if (bus->devs[dev->id]) {
|
||||
bus->devs[dev->id]->info->destroy(bus->devs[dev->id]);
|
||||
qdev_free(&bus->devs[dev->id]->qdev);
|
||||
}
|
||||
bus->devs[dev->id] = dev;
|
||||
|
||||
dev->info = info;
|
||||
return dev->info->init(dev);
|
||||
rc = dev->info->init(dev);
|
||||
if (rc != 0) {
|
||||
bus->devs[dev->id] = NULL;
|
||||
}
|
||||
|
||||
err:
|
||||
return -1;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int scsi_qdev_exit(DeviceState *qdev)
|
||||
{
|
||||
SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
|
||||
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
|
||||
|
||||
assert(bus->devs[dev->id] != NULL);
|
||||
if (bus->devs[dev->id]->info->destroy) {
|
||||
bus->devs[dev->id]->info->destroy(bus->devs[dev->id]);
|
||||
}
|
||||
bus->devs[dev->id] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void scsi_qdev_register(SCSIDeviceInfo *info)
|
||||
{
|
||||
info->qdev.bus_info = &scsi_bus_info;
|
||||
info->qdev.init = scsi_qdev_init;
|
||||
info->qdev.exit = scsi_qdev_exit;
|
||||
qdev_register(&info->qdev);
|
||||
}
|
||||
|
||||
|
@ -936,11 +936,6 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
|
||||
}
|
||||
}
|
||||
|
||||
static void scsi_destroy(SCSIDevice *d)
|
||||
{
|
||||
qemu_free(d);
|
||||
}
|
||||
|
||||
static int scsi_disk_initfn(SCSIDevice *dev)
|
||||
{
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
||||
@ -974,7 +969,6 @@ static SCSIDeviceInfo scsi_disk_info = {
|
||||
.qdev.desc = "virtual scsi disk or cdrom",
|
||||
.qdev.size = sizeof(SCSIDiskState),
|
||||
.init = scsi_disk_initfn,
|
||||
.destroy = scsi_destroy,
|
||||
.send_command = scsi_send_command,
|
||||
.read_data = scsi_read_data,
|
||||
.write_data = scsi_write_data,
|
||||
|
@ -668,8 +668,6 @@ static void scsi_destroy(SCSIDevice *d)
|
||||
qemu_free(r);
|
||||
r = n;
|
||||
}
|
||||
|
||||
qemu_free(d);
|
||||
}
|
||||
|
||||
static int scsi_generic_initfn(SCSIDevice *dev)
|
||||
|
Loading…
x
Reference in New Issue
Block a user