Date: Thu, 25 Apr 2013 13:05:51 -0400
From: jferlan(a)redhat.com
To: libvirt-cim(a)redhat.com
Subject: Re: [Libvirt-cim] [PATCH 2/3] VSMS: tip error for invalid disk resource
On 04/23/2013 05:30 AM, cngesaint(a)outlook.com wrote:
> From: Xu Wang <cngesaint(a)outlook.com>
>
> Original code will report xml text missing when a disk is not accessable,
> make user confuse. This patch will report the real error to tip user check
s/accessable/accessible/
> its system health state on the server.
Can you provide an example test or command - so that it's "testable"?
Whether that's by adding a new cimtest or some other means. There seems
to be two errors serviced by DISK_UNKNOWN - the first one is a failure
on a 'stat64()' and the second is the st_mode not being a BLK device, a
REG (file), or a DIR (file system). How are they differentiated?
Seems to me earlier checks should determine that the path doesn't exist
while this check should be limited to invalid format. My other
experience with CIM enum's is that there's supposed to be an
"UNKNOWN"
and "OTHER" values, where UNKNOWN was always 0 and OTHER was always 1.
I may be the "OTHER" name space incorrect it's been a while...
Yes, I just found it is not suitable for just checking resource accessible by disk
type.
e.g.,under cdrom (blank or none disk) this patch will trigger another question. So
I will rewrite it.
>
> Signed-off-by: Xu Wang <cngesaint(a)outlook.com>
> ---
> src/Virt_VirtualSystemManagementService.c | 65 +++++++++++++++++++++--------
> 1 files changed, 48 insertions(+), 17 deletions(-)
>
> diff --git a/src/Virt_VirtualSystemManagementService.c
b/src/Virt_VirtualSystemManagementService.c
> index 4e93ef0..d252e12 100644
> --- a/src/Virt_VirtualSystemManagementService.c
> +++ b/src/Virt_VirtualSystemManagementService.c
> @@ -964,11 +964,13 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
> }
>
> static const char *disk_rasd_to_vdev(CMPIInstance *inst,
> - struct virt_device *dev)
> + struct virt_device *dev,
> + char **p_error)
> {
> const char *val = NULL;
> uint16_t type;
> bool read = false;
> + int rc;
>
> CU_DEBUG("Enter disk_rasd_to_vdev");
> if (cu_get_str_prop(inst, "VirtualDevice", &val) !=
CMPI_RC_OK)
> @@ -984,6 +986,17 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
> dev->dev.disk.source = strdup(val);
> dev->dev.disk.disk_type = disk_type_from_file(val);
>
> + if (dev->dev.disk.disk_type == DISK_UNKNOWN) {
> + /* on success or fail caller should try free it */
> + rc = asprintf(p_error, "Device %s, Address %s, "
> + "make sure Address can be accessed on host
system.",
> + dev->dev.disk.virtual_dev,
dev->dev.disk.source);
There's no error checking on whether the strdup()'s succeeded and thus
this could cause problems with %s and NULL strings. For that matter
there's very little error checking w/r/t strdup() failures so you're
following existing potential issues...
> + if (rc == -1) {
> + CU_DEBUG("error during recording exception!");
Since asprintf() says the parameter 1 is "undefined" if rc == -1, so be
safe and set p_error to NULL again...
Yes, I think so.
> + }
> + return "Can't get a valid disk type, ";
Looks like a cut-n-paste - just snip the ", ". Other error returns
don't use the ", " list marker...
It's caused by my input method, sorry...
> + }
> +
> if (cu_get_u16_prop(inst, "EmulatedType", &type) !=
CMPI_RC_OK)
> type = VIRT_DISK_TYPE_DISK;
>
> @@ -1452,10 +1465,11 @@ static const char *input_rasd_to_vdev(CMPIInstance *inst,
> static const char *_sysvirt_rasd_to_vdev(CMPIInstance *inst,
> struct virt_device *dev,
> uint16_t type,
> - const char *ns)
> + const char *ns,
> + char **p_error)
> {
> if (type == CIM_RES_TYPE_DISK) {
> - return disk_rasd_to_vdev(inst, dev);
> + return disk_rasd_to_vdev(inst, dev, p_error);
> } else if (type == CIM_RES_TYPE_NET) {
> return net_rasd_to_vdev(inst, dev, ns);
> } else if (type == CIM_RES_TYPE_MEM) {
> @@ -1494,7 +1508,8 @@ static const char *_container_rasd_to_vdev(CMPIInstance
*inst,
> static const char *rasd_to_vdev(CMPIInstance *inst,
> struct domain *domain,
> struct virt_device *dev,
> - const char *ns)
> + const char *ns,
> + char **p_error)
> {
> uint16_t type;
> CMPIObjectPath *op;
> @@ -1516,7 +1531,7 @@ static const char *rasd_to_vdev(CMPIInstance *inst,
> if (domain->type == DOMAIN_LXC)
> msg = _container_rasd_to_vdev(inst, dev, type, ns);
> else
> - msg = _sysvirt_rasd_to_vdev(inst, dev, type, ns);
> + msg = _sysvirt_rasd_to_vdev(inst, dev, type, ns, p_error);
> out:
> if (msg && op)
> CU_DEBUG("rasd_to_vdev(%s): %s", CLASSNAME(op), msg);
> @@ -1560,7 +1575,8 @@ static char *add_device_nodup(struct virt_device *dev,
>
> static const char *classify_resources(CMPIArray *resources,
> const char *ns,
> - struct domain *domain)
> + struct domain *domain,
> + char **p_error)
> {
> int i;
> uint16_t type;
> @@ -1613,13 +1629,15 @@ static const char *classify_resources(CMPIArray
*resources,
> msg = rasd_to_vdev(inst,
> domain,
> &domain->dev_vcpu[0],
> - veillard(a)redhat.com ns);
> + ns,
> + p_error);
> } else if (type == CIM_RES_TYPE_MEM) {
> domain->dev_mem_ct = 1;
> msg = rasd_to_vdevvirQEMUDriverCreateCapabilities(inst,
> domain,
> &domain->dev_mem[0],
> - ns);
> + ns,
> + p_error);
> } else if (type == CIM_RES_TYPE_DISK) {
> struct virt_device dev;
> int dcount = count + domain->dev_disk_ct;
> @@ -1628,7 +1646,8 @@ static const char *classify_resources(CMPIArray *resources,
> msg = rasd_to_vdev(inst,
> domain,
> &dev,
> - ns);
> + ns,
> + p_error);
> if (msg == NULL)
> msg = add_device_nodup(&dev,
> domain->dev_disk,
> @@ -1646,7 +1665,8 @@ static const char *classify_resources(CMPIArray *resources,
> msg = rasd_to_vdev(inst,
> domain,
> &dev,
> - ns);
> + ns,
> + p_error);
> if (msg == NULL)
> msg = add_device_nodup(&dev,
> domain->dev_net,
> @@ -1676,7 +1696,8 @@ static const char *classify_resources(CMPIArray *resources,
> msg = rasd_to_vdev(inst,
> domain,
> &dev,
> - ns);
> + ns,
> + p_error);
> if (msg == NULL)
> msg = add_device_nodup(&dev,
> domain->dev_graphics,
> @@ -1687,7 +1708,8 @@ static const char *classify_resources(CMPIArray *resources,
> msg = rasd_to_vdev(inst,
> domain,
> &domain->dev_input[0],
> - ns);
> + ns,
> + p_error);
> }
> if (msg != NULL)
> return msg;
> @@ -2083,6 +2105,7 @@ static CMPIInstance *create_system(const CMPIContext
*context,
> struct inst_list list;
> const char *props[] = {NULL};
> struct domain *domain = NULL;
> + char *error_msg = NULL;
>
> inst_list_init(&list);
>
> @@ -2113,12 +2136,13 @@ static CMPIInstance *create_system(const CMPIContext
*context,
> if (s->rc != CMPI_RC_OK)
> goto out;
>
> - msg = classify_resources(resources, NAMESPACE(ref), domain);
> + msg = classify_resources(resources, NAMESPACE(ref), domain,
&error_msg);
> if (msg != NULL) {
> - CU_DEBUG("Failed to classify resources: %s", msg);
> + CU_DEBUG("Failed to classify resources: %s, %s",
> + msg, error_msg);
Since error_msg could be NULL - it should be handled...
It would be OK. If error_msg is null, a blank will output and no error.
> cu_statusf(_BROKER, s,
> CMPI_RC_ERR_FAILED,
> - "ResourceSettings Error: %s", msg);
> + "ResourceSettings Error: %s, %s", msg,
error_msg);
Same here...
> goto out;
> }
>
> @@ -2159,6 +2183,7 @@ static CMPIInstance *create_system(const CMPIContext
*context,
>
>
> out:
> + free(error_msg);
> cleanup_dominfo(&domain);
> free(xml);
> inst_list_free(&list);
> @@ -2638,6 +2663,7 @@ static CMPIStatus resource_add(struct domain *dominfo,
> struct virt_device *dev;
> int *count = NULL;
> const char *msg = NULL;
> + char *error_msg = NULL;
>
> op = CMGetObjectPath(rasd, &s);
> if ((op == NULL) || (s.rc != CMPI_RC_OK))
> @@ -2677,7 +2703,7 @@ static CMPIStatus resource_add(struct domain *dominfo,
> dev = &list[*count];
>
> dev->type = type;
> - msg = rasd_to_vdev(rasd, dominfo, dev, ns);
> + msg = rasd_to_vdev(rasd, dominfo, dev, ns, &error_msg);
> if (msg != NULL) {
> cu_statusf(_BROKER, &s,
> CMPI_RC_ERR_FAILED,
Why not add the "error_msg" output here too like create_system?
Yes, error_msg also could be returned to server from here:-)
> @@ -2702,6 +2728,8 @@ static CMPIStatus resource_add(struct domain *dominfo,
> (*count)++;
>
> out:
> + free(error_msg);
> +virQEMUDriverCreateCapabilities
> return s;
> }
>
> @@ -2718,6 +2746,7 @@ static CMPIStatus resource_mod(struct domain *dominfo,
> int *count;
> int i;
> const char *msg = NULL;
> + char *error_msg = NULL;
>
> CU_DEBUG("Enter resource_mod");
> if (devid == NULL) {
> @@ -2749,7 +2778,7 @@ static CMPIStatus resource_mod(struct domain *dominfo,
> struct virt_device *dev = &list[i];
>
> if (STREQ(dev->id, devid)) {
> - msg = rasd_to_vdev(rasd, dominfo, dev, ns);
> + msg = rasd_to_vdev(rasd, dominfo, dev, ns,
&error_msg);
> if (msg != NULL) {
> cu_statusf(_BROKER, &s,
> CMPI_RC_ERR_FAILED,
Same comment
John
> @@ -2793,6 +2822,8 @@ static CMPIStatus resource_mod(struct domain *dominfo,
> }
>
> out:
> + free(error_msg);
> +
> return s;
> }
>
>
_______________________________________________
Libvirt-cim mailing list
Libvirt-cim(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvirt-cim