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);
|
SCSIDevice *dev = DO_UPCAST(SCSIDevice, qdev, qdev);
|
||||||
SCSIDeviceInfo *info = DO_UPCAST(SCSIDeviceInfo, qdev, base);
|
SCSIDeviceInfo *info = DO_UPCAST(SCSIDeviceInfo, qdev, base);
|
||||||
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
|
SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
|
||||||
|
int rc = -1;
|
||||||
|
|
||||||
if (dev->id == -1) {
|
if (dev->id == -1) {
|
||||||
for (dev->id = 0; dev->id < bus->ndev; dev->id++) {
|
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]) {
|
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;
|
bus->devs[dev->id] = dev;
|
||||||
|
|
||||||
dev->info = info;
|
dev->info = info;
|
||||||
return dev->info->init(dev);
|
rc = dev->info->init(dev);
|
||||||
|
if (rc != 0) {
|
||||||
|
bus->devs[dev->id] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
err:
|
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)
|
void scsi_qdev_register(SCSIDeviceInfo *info)
|
||||||
{
|
{
|
||||||
info->qdev.bus_info = &scsi_bus_info;
|
info->qdev.bus_info = &scsi_bus_info;
|
||||||
info->qdev.init = scsi_qdev_init;
|
info->qdev.init = scsi_qdev_init;
|
||||||
|
info->qdev.exit = scsi_qdev_exit;
|
||||||
qdev_register(&info->qdev);
|
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)
|
static int scsi_disk_initfn(SCSIDevice *dev)
|
||||||
{
|
{
|
||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, 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.desc = "virtual scsi disk or cdrom",
|
||||||
.qdev.size = sizeof(SCSIDiskState),
|
.qdev.size = sizeof(SCSIDiskState),
|
||||||
.init = scsi_disk_initfn,
|
.init = scsi_disk_initfn,
|
||||||
.destroy = scsi_destroy,
|
|
||||||
.send_command = scsi_send_command,
|
.send_command = scsi_send_command,
|
||||||
.read_data = scsi_read_data,
|
.read_data = scsi_read_data,
|
||||||
.write_data = scsi_write_data,
|
.write_data = scsi_write_data,
|
||||||
|
@ -668,8 +668,6 @@ static void scsi_destroy(SCSIDevice *d)
|
|||||||
qemu_free(r);
|
qemu_free(r);
|
||||||
r = n;
|
r = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_free(d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scsi_generic_initfn(SCSIDevice *dev)
|
static int scsi_generic_initfn(SCSIDevice *dev)
|
||||||
|
Loading…
Reference in New Issue
Block a user