# HG changeset patch
# User Dan Smith <danms(a)us.ibm.com>
# Date 1194897181 28800
# Node ID 50be717355487fc76bd725e71201d49564b77edf
# Parent f86d7a5bfa6b597d3909eae06f367ec640fb0a2c
Make memory device changes dynamic
Refuse to add or delete a memory device of course, but allow modify
Signed-off-by: Dan Smith <danms(a)us.ibm.com>
diff -r f86d7a5bfa6b -r 50be71735548 src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c Mon Nov 12 11:53:00 2007 -0800
+++ b/src/Virt_VirtualSystemManagementService.c Mon Nov 12 11:53:01 2007 -0800
@@ -50,6 +50,12 @@
const static CMPIBroker *_BROKER;
+enum ResourceAction {
+ RESOURCE_ADD,
+ RESOURCE_DEL,
+ RESOURCE_MOD,
+};
+
static int parse_str_inst_array(CMPIArray *array,
const char *ns,
struct inst_list *list)
@@ -568,6 +574,9 @@ static struct virt_device **find_list(st
} else if (type == VIRT_DEV_VCPU) {
list = &dominfo->dev_vcpu;
*count = &dominfo->dev_vcpu_ct;
+ } else if (type == VIRT_DEV_MEM) {
+ list = &dominfo->dev_mem;
+ *count = &dominfo->dev_mem_ct;
}
return list;
@@ -575,17 +584,26 @@ static struct virt_device **find_list(st
static CMPIStatus _resource_dynamic(struct domain *dominfo,
struct virt_device *dev,
- bool attach)
+ enum ResourceAction action)
{
CMPIStatus s;
virConnectPtr conn;
virDomainPtr dom;
int (*func)(virDomainPtr, struct virt_device *);
- if (attach)
+ if (action == RESOURCE_ADD)
func = attach_device;
- else
+ else if (action == RESOURCE_DEL)
func = detach_device;
+ else if (action == RESOURCE_MOD)
+ func = change_device;
+ else {
+ CU_DEBUG("Unknown dynamic resource action: %i", action);
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Internal error (undefined resource action)");
+ return s;
+ }
conn = lv_connect(_BROKER, &s);
if (conn == NULL) {
@@ -614,8 +632,8 @@ static CMPIStatus _resource_dynamic(stru
if (func(dom, dev) == 0) {
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
- "Unable to %s device",
- attach ? "attach" : "detach");
+ "Unable to change (%i) device",
+ action);
} else {
CMSetStatus(&s, CMPI_RC_OK);
}
@@ -638,7 +656,7 @@ static CMPIStatus resource_del(struct do
int i;
_list = find_list(dominfo, type, &count);
- if (_list != NULL)
+ if ((type == CIM_RASD_TYPE_MEM) || (_list != NULL))
list = *_list;
else {
cu_statusf(_BROKER, &s,
@@ -656,7 +674,7 @@ static CMPIStatus resource_del(struct do
struct virt_device *dev = &list[i];
if (STREQ(dev->id, devid)) {
- s = _resource_dynamic(dominfo, dev, false);
+ s = _resource_dynamic(dominfo, dev, RESOURCE_DEL);
dev->type = VIRT_DEV_UNKNOWN;
break;
}
@@ -678,7 +696,7 @@ static CMPIStatus resource_add(struct do
int *count;
_list = find_list(dominfo, type, &count);
- if (_list == NULL) {
+ if ((type == CIM_RASD_TYPE_MEM) || (_list == NULL)) {
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
"Cannot add resources of type %" PRIu16,
@@ -713,7 +731,7 @@ static CMPIStatus resource_add(struct do
dev->id = strdup(devid);
rasd_to_vdev(rasd, dev);
- s = _resource_dynamic(dominfo, dev, true);
+ s = _resource_dynamic(dominfo, dev, RESOURCE_ADD);
if (s.rc != CMPI_RC_OK)
goto out;
@@ -755,7 +773,7 @@ static CMPIStatus resource_mod(struct do
if (STREQ(dev->id, devid)) {
rasd_to_vdev(rasd, dev);
- CMSetStatus(&s, CMPI_RC_OK);
+ s = _resource_dynamic(dominfo, dev, RESOURCE_MOD);
break;
}
}