On 10/27/2013 10:45 PM, Xu Wang wrote:
Signed-off-by: Xu Wang <gesaint(a)linux.vnet.ibm.com>
---
libxkutil/device_parsing.c | 54 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 54 insertions(+), 0 deletions(-)
If I apply the cimtest patches from Viktor, I get cimtest failures after
applying this patch. That's about as far as I've had time to dig. It
seems cimprovagt cores and for some reason the abrt isn't saving
things... The failures are in:
--------------------------------------------------------------------
RASDIndications - 02_guest_add_mod_rem_rasd_ind.py: FAIL
ERROR - Exception details :(1, u'CIM_ERR_FAILED: Lost connection with
cimprovagt "libvirt-cim".')
ERROR - Exception: Unable to generate indication
InvokeMethod(RemoveResourceSettings): CIM_ERR_FAILED: Lost connection
with cimprovagt "libvirt-cim".
--------------------------------------------------------------------
SettingsDefine - 01_forward.py: FAIL
ERROR - 6 device insts != 7 RASD insts
--------------------------------------------------------------------
SettingsDefine - 02_reverse.py: FAIL
ERROR - u'KVM_ConsoleDisplayController'
--------------------------------------------------------------------
VirtualSystemManagementService - 16_removeresource.py: FAIL
ERROR - (1, u'CIM_ERR_FAILED: Lost connection with cimprovagt
"libvirt-cim".')
InvokeMethod(RemoveResourceSettings): CIM_ERR_FAILED: Lost connection
with cimprovagt "libvirt-cim".
--------------------------------------------------------------------
I'll investigate more in my morning..
FWIW: This is on a RHEL6.5 host that I'm borrowing...
diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index aecca4c..f1da880 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -63,6 +63,49 @@
/* Device parse function */
typedef int (*dev_parse_func_t)(xmlNode *, struct virt_device **);
+void cleanup_node_of_others(struct others *others)
static void
+{
+ if (others == NULL) {
+ return;
+ }
+
+ if (others->name) {
+ free(others->name);
+ }
+
+ if (others->parent_name) {
+ free(others->parent_name);
+ }
+
+ if (others->value) {
+ free(others->value);
+ }
+
+ free(others);
+}
+
+void cleanup_others(struct others *others)
static void
+{
+ struct others *head = others;
+
+ if (others == NULL)
+ return;
Since we'd only enter the while loop if head (or others) were non NULL
the above isn't really necessary
+
+ while (head) {
+ head = others->next;
+ cleanup_node_of_others(others);
+ others = head;
+ }
while (others) {
next = others->next;
cleanup_node_of_others(others);
others = next;
}
Have to figure out why cimprovagt dies, I'm assuming it's in this logic
somewhere...
John
+}
+
+static void cleanup_unknown_device(struct unknown_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ cleanup_others(dev->others);
+}
+
static void cleanup_disk_device(struct disk_device *dev)
{
if (dev == NULL)
@@ -77,6 +120,7 @@ static void cleanup_disk_device(struct disk_device *dev)
free(dev->virtual_dev);
free(dev->bus_type);
free(dev->access_mode);
+ cleanup_others(dev->others);
}
static void cleanup_vsi_device(struct vsi_device *dev)
@@ -107,6 +151,7 @@ static void cleanup_net_device(struct net_device *dev)
free(dev->filter_ref);
free(dev->poolid);
cleanup_vsi_device(&dev->vsi);
+ cleanup_others(dev->others);
}
static void cleanup_emu_device(struct emu_device *dev)
@@ -115,6 +160,7 @@ static void cleanup_emu_device(struct emu_device *dev)
return;
free(dev->path);
+ cleanup_others(dev->others);
}
static void cleanup_vnc_device(struct graphics_device *dev)
@@ -123,6 +169,7 @@ static void cleanup_vnc_device(struct graphics_device *dev)
free(dev->dev.vnc.host);
free(dev->dev.vnc.keymap);
free(dev->dev.vnc.passwd);
+ cleanup_others(dev->dev.vnc.others);
}
static void cleanup_sdl_device(struct graphics_device *dev)
@@ -130,6 +177,7 @@ static void cleanup_sdl_device(struct graphics_device *dev)
free(dev->dev.sdl.display);
free(dev->dev.sdl.xauth);
free(dev->dev.sdl.fullscreen);
+ cleanup_others(dev->dev.sdl.others);
}
static void cleanup_graphics_device(struct graphics_device *dev)
@@ -143,6 +191,7 @@ static void cleanup_graphics_device(struct graphics_device *dev)
cleanup_vnc_device(dev);
free(dev->type);
+ cleanup_others(dev->others);
}
static void cleanup_path_device(struct path_device *dev)
@@ -228,6 +277,7 @@ static void cleanup_console_device(struct console_device *dev)
dev->source_type = 0;
free(dev->target_type);
memset(&dev->source_dev, 0, sizeof(dev->source_dev));
+ cleanup_others(dev->others);
};
static void console_device_dup(struct console_device *t,
@@ -286,6 +336,7 @@ static void cleanup_input_device(struct input_device *dev)
free(dev->type);
free(dev->bus);
+ cleanup_others(dev->others);
}
void cleanup_virt_device(struct virt_device *dev)
@@ -305,6 +356,8 @@ void cleanup_virt_device(struct virt_device *dev)
cleanup_input_device(&dev->dev.input);
else if (dev->type == CIM_RES_TYPE_CONSOLE)
cleanup_console_device(&dev->dev.console);
+ else if (dev->type == CIM_RES_TYPE_UNKNOWN)
+ cleanup_unknown_device(&dev->dev.unknown);
free(dev->id);
@@ -1693,6 +1746,7 @@ void cleanup_dominfo(struct domain **dominfo)
cleanup_virt_devices(&dom->dev_graphics, dom->dev_graphics_ct);
cleanup_virt_devices(&dom->dev_input, dom->dev_input_ct);
cleanup_virt_devices(&dom->dev_console, dom->dev_console_ct);
+ cleanup_virt_devices(&dom->dev_unknown, dom->dev_unknown_ct);
free(dom);