ide: Fix memory leak in ide_register_restart_cb()
Fix a memory leak in ide_register_restart_cb() in hw/ide/core.c and add idebus_unrealize() in hw/ide/qdev.c to have calls to qemu_del_vm_change_state_handler() to deal with the dangling change state handler during hot-unplugging ide devices which might lead to a crash. Signed-off-by: Ashijeet Acharya <ashijeetacharya@gmail.com> Reviewed-by: John Snow <jsnow@redhat.com> Message-id: 1474995212-10580-1-git-send-email-ashijeetacharya@gmail.com [Minor whitespace fix --js] Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
c9f7acd575
commit
ca44141d5f
@ -2582,7 +2582,7 @@ static void ide_restart_cb(void *opaque, int running, RunState state)
|
||||
void ide_register_restart_cb(IDEBus *bus)
|
||||
{
|
||||
if (bus->dma->ops->restart_dma) {
|
||||
qemu_add_vm_change_state_handler(ide_restart_cb, bus);
|
||||
bus->vmstate = qemu_add_vm_change_state_handler(ide_restart_cb, bus);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
/* --------------------------------- */
|
||||
|
||||
static char *idebus_get_fw_dev_path(DeviceState *dev);
|
||||
static void idebus_unrealize(DeviceState *qdev, Error **errp);
|
||||
|
||||
static Property ide_props[] = {
|
||||
DEFINE_PROP_UINT32("unit", IDEDevice, unit, -1),
|
||||
@ -44,6 +45,15 @@ static void ide_bus_class_init(ObjectClass *klass, void *data)
|
||||
k->get_fw_dev_path = idebus_get_fw_dev_path;
|
||||
}
|
||||
|
||||
static void idebus_unrealize(DeviceState *qdev, Error **errp)
|
||||
{
|
||||
IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);
|
||||
|
||||
if (bus->vmstate) {
|
||||
qemu_del_vm_change_state_handler(bus->vmstate);
|
||||
}
|
||||
}
|
||||
|
||||
static const TypeInfo ide_bus_info = {
|
||||
.name = TYPE_IDE_BUS,
|
||||
.parent = TYPE_BUS,
|
||||
@ -355,6 +365,7 @@ static void ide_device_class_init(ObjectClass *klass, void *data)
|
||||
k->init = ide_qdev_init;
|
||||
set_bit(DEVICE_CATEGORY_STORAGE, k->categories);
|
||||
k->bus_type = TYPE_IDE_BUS;
|
||||
k->unrealize = idebus_unrealize;
|
||||
k->props = ide_props;
|
||||
}
|
||||
|
||||
|
@ -482,6 +482,7 @@ struct IDEBus {
|
||||
uint32_t retry_nsector;
|
||||
PortioList portio_list;
|
||||
PortioList portio2_list;
|
||||
VMChangeStateEntry *vmstate;
|
||||
};
|
||||
|
||||
#define TYPE_IDE_DEVICE "ide-device"
|
||||
|
Loading…
Reference in New Issue
Block a user