Browse Source

libvirt-cim package update

Signed-off-by: virtbuilder_pel7ppc64bebuilder0 <virtbuilder@powerel.org>
master
virtbuilder_pel7ppc64bebuilder0 7 years ago
parent
commit
b5aecff7b3
  1. 141
      SOURCES/libvirt-cim-0.6.3-0a742856.patch
  2. 241
      SOURCES/libvirt-cim-0.6.3-117dabb9.patch
  3. 31
      SOURCES/libvirt-cim-0.6.3-14883f33.patch
  4. 43
      SOURCES/libvirt-cim-0.6.3-19ffef8e.patch
  5. 129
      SOURCES/libvirt-cim-0.6.3-1a91ecd3.patch
  6. 210
      SOURCES/libvirt-cim-0.6.3-1c7dfda2.patch
  7. 49
      SOURCES/libvirt-cim-0.6.3-1fae439d.patch
  8. 458
      SOURCES/libvirt-cim-0.6.3-21dea212.patch
  9. 80
      SOURCES/libvirt-cim-0.6.3-222a3219.patch
  10. 90
      SOURCES/libvirt-cim-0.6.3-242ddaa6.patch
  11. 29
      SOURCES/libvirt-cim-0.6.3-2cbbac52.patch
  12. 207
      SOURCES/libvirt-cim-0.6.3-2e9c18d6.patch
  13. 28
      SOURCES/libvirt-cim-0.6.3-3c3a541d.patch
  14. 1042
      SOURCES/libvirt-cim-0.6.3-3e6f1489.patch
  15. 149
      SOURCES/libvirt-cim-0.6.3-4013f9a0.patch
  16. 98
      SOURCES/libvirt-cim-0.6.3-43ea7135.patch
  17. 400
      SOURCES/libvirt-cim-0.6.3-48b28b6a.patch
  18. 222
      SOURCES/libvirt-cim-0.6.3-4954aa8c.patch
  19. 309
      SOURCES/libvirt-cim-0.6.3-4f74864c.patch
  20. 162
      SOURCES/libvirt-cim-0.6.3-53a4dff9.patch
  21. 63
      SOURCES/libvirt-cim-0.6.3-54778c78.patch
  22. 39
      SOURCES/libvirt-cim-0.6.3-55d3f9fc.patch
  23. 115
      SOURCES/libvirt-cim-0.6.3-5787acc15.patch
  24. 74
      SOURCES/libvirt-cim-0.6.3-583ea685.patch
  25. 236
      SOURCES/libvirt-cim-0.6.3-58d6e308.patch
  26. 73
      SOURCES/libvirt-cim-0.6.3-5940d2c8.patch
  27. 38
      SOURCES/libvirt-cim-0.6.3-5d2626f6.patch
  28. 169
      SOURCES/libvirt-cim-0.6.3-6024403e.patch
  29. 29
      SOURCES/libvirt-cim-0.6.3-605090b6.patch
  30. 99
      SOURCES/libvirt-cim-0.6.3-63acad05.patch
  31. 32
      SOURCES/libvirt-cim-0.6.3-6a13c463.patch
  32. 102
      SOURCES/libvirt-cim-0.6.3-6bc7bfdf.patch
  33. 34
      SOURCES/libvirt-cim-0.6.3-6f050582.patch
  34. 71
      SOURCES/libvirt-cim-0.6.3-7e164fbd.patch
  35. 51
      SOURCES/libvirt-cim-0.6.3-7e5f561c.patch
  36. 141
      SOURCES/libvirt-cim-0.6.3-7f3288be.patch
  37. 516
      SOURCES/libvirt-cim-0.6.3-8a060e0d.patch
  38. 40
      SOURCES/libvirt-cim-0.6.3-8eb5c1e7.patch
  39. 131
      SOURCES/libvirt-cim-0.6.3-93ea8130.patch
  40. 42
      SOURCES/libvirt-cim-0.6.3-95f0d418.patch
  41. 78
      SOURCES/libvirt-cim-0.6.3-9a4f2a32.patch
  42. 217
      SOURCES/libvirt-cim-0.6.3-9c1d321b.patch
  43. 165
      SOURCES/libvirt-cim-0.6.3-a16ca9d0.patch
  44. 69
      SOURCES/libvirt-cim-0.6.3-a3649c21.patch
  45. 29
      SOURCES/libvirt-cim-0.6.3-a6cbafc6.patch
  46. 115
      SOURCES/libvirt-cim-0.6.3-a72ab39b.patch
  47. 197
      SOURCES/libvirt-cim-0.6.3-a8cfd7dc.patch
  48. 214
      SOURCES/libvirt-cim-0.6.3-ace5e8fd.patch
  49. 159
      SOURCES/libvirt-cim-0.6.3-ca8e81b3.patch
  50. 198
      SOURCES/libvirt-cim-0.6.3-d75cae45.patch
  51. 129
      SOURCES/libvirt-cim-0.6.3-d9414e36.patch
  52. 111
      SOURCES/libvirt-cim-0.6.3-de03c66f.patch
  53. 251
      SOURCES/libvirt-cim-0.6.3-de34dda2.patch
  54. 38
      SOURCES/libvirt-cim-0.6.3-ee74ebc1.patch
  55. 39
      SOURCES/libvirt-cim-0.6.3-ee84e10f.patch
  56. 71
      SOURCES/libvirt-cim-0.6.3-f18ba715.patch
  57. 124
      SOURCES/libvirt-cim-0.6.3-f6b7eeaf.patch
  58. 171
      SOURCES/libvirt-cim-0.6.3-f70a8ea0.patch
  59. 104
      SOURCES/libvirt-cim-0.6.3-f9fc5821.patch
  60. 208
      SOURCES/libvirt-cim-0.6.3-fb5d2fcf.patch
  61. 749
      SOURCES/libvirt-cim-0.6.3-fffbde4e.patch
  62. 1144
      SOURCES/libvirt-cim-aarch64.patch
  63. 800
      SPECS/libvirt-cim.spec

141
SOURCES/libvirt-cim-0.6.3-0a742856.patch

@ -0,0 +1,141 @@ @@ -0,0 +1,141 @@
From 0a742856490bfdcb02c2af48a2a849593cccf1c7 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Thu, 29 Aug 2013 17:18:49 +0200
Subject: [PATCH 08/48] libxkutil: Improve domain.os_info cleanup

The union fields in os_info were set by means of XML parsing which
doesn't take into account that certain fields are depending on the
virtualization type.
This could lead both to memory overwrites and memory leaks.
Fixed by using temporary variables and type-based setting of fields

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 73 +++++++++++++++++++++++++++++++++-------------
1 file changed, 52 insertions(+), 21 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 542e4e9..ad0f19c 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -1103,23 +1103,37 @@ int parse_fq_devid(const char *devid, char **host, char **device)
return 1;
}

+static void cleanup_bootlist(char **blist, unsigned blist_ct)
+{
+ while (blist_ct > 0) {
+ free(blist[--blist_ct]);
+ }
+ free(blist);
+}
+
static int parse_os(struct domain *dominfo, xmlNode *os)
{
xmlNode *child;
char **blist = NULL;
unsigned bl_size = 0;
+ char *kernel = NULL;
+ char *initrd = NULL;
+ char *cmdline = NULL;
+ char *loader = NULL;
+ char *boot = NULL;
+ char *init = NULL;

for (child = os->children; child != NULL; child = child->next) {
- if (XSTREQ(child->name, "type"))
+ if (XSTREQ(child->name, "type")) {
STRPROP(dominfo, os_info.pv.type, child);
- else if (XSTREQ(child->name, "kernel"))
- STRPROP(dominfo, os_info.pv.kernel, child);
+ } else if (XSTREQ(child->name, "kernel"))
+ kernel = get_node_content(child);
else if (XSTREQ(child->name, "initrd"))
- STRPROP(dominfo, os_info.pv.initrd, child);
+ initrd = get_node_content(child);
else if (XSTREQ(child->name, "cmdline"))
- STRPROP(dominfo, os_info.pv.cmdline, child);
+ cmdline = get_node_content(child);
else if (XSTREQ(child->name, "loader"))
- STRPROP(dominfo, os_info.fv.loader, child);
+ loader = get_node_content(child);
else if (XSTREQ(child->name, "boot")) {
char **tmp_list = NULL;

@@ -1137,7 +1151,7 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
blist[bl_size] = get_attr_value(child, "dev");
bl_size++;
} else if (XSTREQ(child->name, "init"))
- STRPROP(dominfo, os_info.lxc.init, child);
+ init = get_node_content(child);
}

if ((STREQC(dominfo->os_info.fv.type, "hvm")) &&
@@ -1154,17 +1168,39 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
else
dominfo->type = -1;

- if (STREQC(dominfo->os_info.fv.type, "hvm")) {
+ switch (dominfo->type) {
+ case DOMAIN_XENFV:
+ case DOMAIN_KVM:
+ case DOMAIN_QEMU:
+ dominfo->os_info.fv.loader = loader;
dominfo->os_info.fv.bootlist_ct = bl_size;
dominfo->os_info.fv.bootlist = blist;
- } else {
- int i;
-
- for (i = 0; i < bl_size; i++)
- free(blist[i]);
- free(blist);
+ loader = NULL;
+ blist = NULL;
+ bl_size = 0;
+ break;
+ case DOMAIN_XENPV:
+ dominfo->os_info.pv.kernel = kernel;
+ dominfo->os_info.pv.initrd = initrd;
+ dominfo->os_info.pv.cmdline = cmdline;
+ kernel = NULL;
+ initrd = NULL;
+ cmdline = NULL;
+ break;
+ case DOMAIN_LXC:
+ dominfo->os_info.lxc.init = init;
+ init = NULL;
+ break;
+ default:
+ break;
}

+ free(kernel);
+ free(initrd);
+ free(cmdline);
+ free(boot);
+ free(init);
+ cleanup_bootlist(blist, bl_size);
return 1;
}

@@ -1360,15 +1396,10 @@ void cleanup_dominfo(struct domain **dominfo)
free(dom->os_info.pv.cmdline);
} else if ((dom->type == DOMAIN_XENFV) ||
(dom->type == DOMAIN_KVM) || (dom->type == DOMAIN_QEMU)) {
- int i;
-
free(dom->os_info.fv.type);
free(dom->os_info.fv.loader);
-
- for (i = 0; i < dom->os_info.fv.bootlist_ct; i++) {
- free(dom->os_info.fv.bootlist[i]);
- }
- free(dom->os_info.fv.bootlist);
+ cleanup_bootlist(dom->os_info.fv.bootlist,
+ dom->os_info.fv.bootlist_ct);
} else if (dom->type == DOMAIN_LXC) {
free(dom->os_info.lxc.type);
free(dom->os_info.lxc.init);
--
1.8.5.3

241
SOURCES/libvirt-cim-0.6.3-117dabb9.patch

@ -0,0 +1,241 @@ @@ -0,0 +1,241 @@
From 117dabb96ff85f41d05ab841df02c02a09ff73d7 Mon Sep 17 00:00:00 2001
From: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Date: Thu, 29 Aug 2013 17:18:53 +0200
Subject: [PATCH 11/60] VSSM: Set default values based on libvirt capabilities
on DefineSystem calls

In the DefineSystem call the architecture, machine and emulator for KVM are set
to the hypervisor-specific default values if they did not get provided.
This now allows architecture based decision making in the CIM providers to
work for all platforms.

Signed-off-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Reviewed-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 162 +++++++++++++++---------------
1 file changed, 79 insertions(+), 83 deletions(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 301f046..79dec73 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -35,6 +35,7 @@
#include "cs_util.h"
#include "misc_util.h"
#include "device_parsing.h"
+#include "capability_parsing.h"
#include "xmlgen.h"

#include <libcmpiutil/libcmpiutil.h>
@@ -388,59 +389,6 @@ static bool fv_set_emulator(struct domain *domain,
return true;
}

-static bool system_has_kvm(const char *pfx)
-{
- CMPIStatus s;
- virConnectPtr conn = NULL;
- char *caps = NULL;
- bool disable_kvm = get_disable_kvm();
- xmlDocPtr doc = NULL;
- xmlNodePtr node = NULL;
- int len;
- bool kvm = false;
-
- /* sometimes disable KVM to avoid problem in nested KVM */
- if (disable_kvm) {
- CU_DEBUG("Enter disable kvm mode!");
- goto out;
- }
-
- conn = connect_by_classname(_BROKER, pfx, &s);
- if ((conn == NULL) || (s.rc != CMPI_RC_OK)) {
- goto out;
- }
-
- caps = virConnectGetCapabilities(conn);
- if (caps != NULL) {
- len = strlen(caps) + 1;
-
- doc = xmlParseMemory(caps, len);
- if (doc == NULL) {
- CU_DEBUG("xmlParseMemory() call failed!");
- goto out;
- }
-
- node = xmlDocGetRootElement(doc);
- if (node == NULL) {
- CU_DEBUG("xmlDocGetRootElement() call failed!");
- goto out;
- }
-
- if (has_kvm_domain_type(node)) {
- CU_DEBUG("The system support kvm!");
- kvm = true;
- }
- }
-
-out:
- free(caps);
- free(doc);
-
- virConnectClose(conn);
-
- return kvm;
-}
-
static int bootord_vssd_to_domain(CMPIInstance *inst,
struct domain *domain)
{
@@ -511,53 +459,90 @@ static int bootord_vssd_to_domain(CMPIInstance *inst,

static int fv_vssd_to_domain(CMPIInstance *inst,
struct domain *domain,
- const char *pfx)
+ const char *pfx,
+ virConnectPtr conn)
{
- int ret;
+ int ret = 1;
+ int retr;
const char *val;
+ const char *domtype = NULL;
+ const char *ostype = "hvm";
+ struct capabilities *capsinfo = NULL;
+
+ get_capabilities(conn, &capsinfo);

if (STREQC(pfx, "KVM")) {
- if (system_has_kvm(pfx))
+ if (use_kvm(capsinfo)) {
domain->type = DOMAIN_KVM;
- else
+ domtype = "kvm";
+ } else {
domain->type = DOMAIN_QEMU;
+ domtype = "qemu";
+ }
} else if (STREQC(pfx, "Xen")) {
domain->type = DOMAIN_XENFV;
} else {
CU_DEBUG("Unknown fullvirt domain type: %s", pfx);
- return 0;
+ ret = 0;
+ goto out;
}

- ret = bootord_vssd_to_domain(inst, domain);
- if (ret != 1)
- return 0;
-
- ret = cu_get_str_prop(inst, "Emulator", &val);
- if (ret != CMPI_RC_OK)
- val = NULL;
- else if (disk_type_from_file(val) == DISK_UNKNOWN) {
- CU_DEBUG("Emulator path does not exist: %s", val);
- return 0;
+ retr = bootord_vssd_to_domain(inst, domain);
+ if (retr != 1) {
+ ret = 0;
+ goto out;
}

- if (!fv_set_emulator(domain, val))
- return 0;
-
free(domain->os_info.fv.arch);
- ret = cu_get_str_prop(inst, "Arch", &val);
- if (ret == CMPI_RC_OK)
+ retr = cu_get_str_prop(inst, "Arch", &val);
+ if (retr != CMPI_RC_OK) {
+ if (capsinfo != NULL) { /* set default */
+ val = get_default_arch(capsinfo, ostype);
+ CU_DEBUG("Set Arch to default: %s", val);
+ } else
+ val = NULL;
+ }
+ if (val != NULL)
domain->os_info.fv.arch = strdup(val);
- else
- domain->os_info.fv.arch = NULL;

free(domain->os_info.fv.machine);
- ret = cu_get_str_prop(inst, "Machine", &val);
- if (ret == CMPI_RC_OK)
+ retr = cu_get_str_prop(inst, "Machine", &val);
+ if (retr != CMPI_RC_OK) {
+ if (capsinfo != NULL && domtype != NULL) { /* set default */
+ val = get_default_machine(capsinfo, ostype,
+ domain->os_info.fv.arch,
+ domtype);
+ CU_DEBUG("Set Machine to default: %s", val);
+ } else
+ val = NULL;
+ }
+ if (val != NULL)
domain->os_info.fv.machine = strdup(val);
- else
- domain->os_info.fv.machine = NULL;

- return 1;
+ retr = cu_get_str_prop(inst, "Emulator", &val);
+ if (retr != CMPI_RC_OK) {
+ if (capsinfo != NULL && domtype != NULL) { /* set default */
+ val = get_default_emulator(capsinfo, ostype,
+ domain->os_info.fv.arch,
+ domtype);
+ CU_DEBUG("Set Emulator to default: %s", val);
+ } else
+ val = NULL;
+ }
+ if (val != NULL && disk_type_from_file(val) == DISK_UNKNOWN) {
+ CU_DEBUG("Emulator path does not exist: %s", val);
+ ret = 0;
+ goto out;
+ }
+
+ if (!fv_set_emulator(domain, val)) {
+ ret = 0;
+ goto out;
+ }
+
+ out:
+ cleanup_capabilities(&capsinfo);
+ return ret;
}

static int lxc_vssd_to_domain(CMPIInstance *inst,
@@ -663,6 +648,8 @@ static int vssd_to_domain(CMPIInstance *inst,
bool bool_val;
bool fullvirt;
CMPIObjectPath *opathp = NULL;
+ virConnectPtr conn = NULL;
+ CMPIStatus s = { CMPI_RC_OK, NULL };


opathp = CMGetObjectPath(inst, NULL);
@@ -748,9 +735,18 @@ static int vssd_to_domain(CMPIInstance *inst,
}
}

- if (fullvirt || STREQC(pfx, "KVM"))
- ret = fv_vssd_to_domain(inst, domain, pfx);
- else if (STREQC(pfx, "Xen"))
+ if (fullvirt || STREQC(pfx, "KVM")) {
+ conn = connect_by_classname(_BROKER, cn, &s);
+ if (conn == NULL) {
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Error connecting to libvirt");
+ ret = 0;
+ goto out;
+ }
+ ret = fv_vssd_to_domain(inst, domain, pfx, conn);
+ virConnectClose(conn);
+ } else if (STREQC(pfx, "Xen"))
ret = xenpv_vssd_to_domain(inst, domain);
else if (STREQC(pfx, "LXC"))
ret = lxc_vssd_to_domain(inst, domain);
--
2.1.0

31
SOURCES/libvirt-cim-0.6.3-14883f33.patch

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
From 14883f33cb82bb5d3dcdf1c8931a51eae672f408 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Fri, 11 Oct 2013 13:47:35 +0200
Subject: [PATCH 36/60] libxkutil: clean entire device structure to avoid
memory corruption

If cleanup_virt_device is called twice (e.g. during modify resource)
a double free can occur because only the dev substructure has
been memset to zero. Now zeroing the entire structure.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 8a90653..56e39c7 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -326,7 +326,7 @@ void cleanup_virt_device(struct virt_device *dev)

free(dev->id);

- memset(&dev->dev, 0, sizeof(dev->dev));
+ memset(dev, 0, sizeof(*dev));
}

void cleanup_virt_devices(struct virt_device **_devs, int count)
--
2.1.0

43
SOURCES/libvirt-cim-0.6.3-19ffef8e.patch

@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
From 19ffef8e60a3cb90b41043ebda3063355896b6a7 Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
Date: Thu, 8 Aug 2013 11:49:25 +0200
Subject: [PATCH 03/48] libvirt-cim.spec.in: Don't install open-pegasus'
specific providers

https://bugzilla.redhat.com/show_bug.cgi?id=859122

libvirt-cim installs open-pegasus' specific providers in sblim-sfcb
repository staging directory and causing problem when creating sfcb
repository.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 6 ------
1 file changed, 6 deletions(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index 7b6221e..a027246 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -133,9 +133,6 @@ then
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t sfcb \
- -n root/PG_InterOp \
- -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/cimv2\
-r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
fi
@@ -165,9 +162,6 @@ then
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
- -n root/PG_InterOp \
- -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-n root/cimv2 \
-r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
fi
--
1.8.5.3

129
SOURCES/libvirt-cim-0.6.3-1a91ecd3.patch

@ -0,0 +1,129 @@ @@ -0,0 +1,129 @@
From 1a91ecd304d0a9cfb4e2d07c60f134ce8265ea22 Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Mon, 3 Mar 2014 09:04:19 +0800
Subject: [PATCH 49/60] Add sgio property support

Add the 'sgio' property to the DiskRASD and parse/save it correctly

Once installed on the target system, use:

wbemcli gcd http://root:password@localhost:5988/root/virt:KVM_DiskResourceAllocationSettingData | grep sgio

to determine if property exists in MOF. Using 'wbemcli ei' will determine
whether or not it shows up in the enumarated instance(s) - if there are
any on the system

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 4 ++++
libxkutil/device_parsing.h | 1 +
libxkutil/xmlgen.c | 2 ++
schema/ResourceAllocationSettingData.mof | 3 +++
src/Virt_RASD.c | 6 ++++++
src/Virt_VirtualSystemManagementService.c | 5 +++++
6 files changed, 21 insertions(+)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 6b29a2d..d2d3859 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -93,6 +93,7 @@ static void cleanup_disk_device(struct disk_device *dev)
free(dev->virtual_dev);
free(dev->bus_type);
free(dev->rawio);
+ free(dev->sgio);
free(dev->access_mode);
cleanup_device_address(&dev->address);
}
@@ -515,6 +516,8 @@ static int parse_block_device(xmlNode *dnode, struct virt_device **vdevs)

ddev->rawio = get_attr_value(dnode, "rawio");

+ ddev->sgio = get_attr_value(dnode, "sgio");
+
for (child = dnode->children; child != NULL; child = child->next) {
if (XSTREQ(child->name, "driver")) {
ddev->driver = get_attr_value(child, "name");
@@ -1319,6 +1322,7 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
DUP_FIELD(dev, _dev, dev.disk.driver);
DUP_FIELD(dev, _dev, dev.disk.driver_type);
DUP_FIELD(dev, _dev, dev.disk.rawio);
+ DUP_FIELD(dev, _dev, dev.disk.sgio);
DUP_FIELD(dev, _dev, dev.disk.cache);
DUP_FIELD(dev, _dev, dev.disk.source);
DUP_FIELD(dev, _dev, dev.disk.virtual_dev);
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index a8cf7aa..a92e223 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -57,6 +57,7 @@ struct disk_device {
char *source;
char *virtual_dev;
char *rawio;
+ char *sgio;
enum {DISK_UNKNOWN, DISK_PHY, DISK_FILE, DISK_FS} disk_type;
bool readonly;
bool shareable;
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 2f0f475..18c4765 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -214,6 +214,8 @@ static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
xmlNewProp(disk, BAD_CAST "device", BAD_CAST dev->device);
if (dev->rawio)
xmlNewProp(disk, BAD_CAST "rawio", BAD_CAST dev->rawio);
+ if (dev->sgio)
+ xmlNewProp(disk, BAD_CAST "sgio", BAD_CAST dev->sgio);

if (dev->driver) {
tmp = xmlNewChild(disk, NULL, BAD_CAST "driver", NULL);
diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index 5228f4b..6b649de 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -68,6 +68,9 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData
[Description ("rawio value of lun device")]
string rawio;

+ [Description ("sgio value of lun device")]
+ string sgio;
+
[Description ("if device is shareable")]
boolean shareable;

diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index 0800311..abfb09f 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -488,6 +488,12 @@ static CMPIStatus set_disk_rasd_params(const CMPIBroker *broker,
(CMPIValue *)dev->dev.disk.rawio,
CMPI_chars);

+ if(dev->dev.disk.sgio)
+ CMSetProperty(inst,
+ "sgio",
+ (CMPIValue *)dev->dev.disk.sgio,
+ CMPI_chars);
+
if(dev->dev.disk.shareable)
CMSetProperty(inst,
"shareable",
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index a9f7ae0..e146470 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1189,6 +1189,11 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
else
dev->dev.disk.rawio = strdup(val);

+ if (cu_get_str_prop(inst, "sgio", &val) != CMPI_RC_OK)
+ dev->dev.disk.sgio = NULL;
+ else
+ dev->dev.disk.sgio = strdup(val);
+
if (cu_get_bool_prop(inst, "shareable", &shareable) != CMPI_RC_OK)
dev->dev.disk.shareable = false;
else
--
2.1.0

210
SOURCES/libvirt-cim-0.6.3-1c7dfda2.patch

@ -0,0 +1,210 @@ @@ -0,0 +1,210 @@
From 1c7dfda2b543da27ea092a7cb9deab8b2917acba Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Tue, 5 Nov 2013 10:03:31 +0100
Subject: [PATCH 32/48] build: Fix incorrect provider registration in upgrade
path

The scriplet logic was incorrectly assuming that the superseded package's
%postun script would be called before the superceding packages %pre/%post.
This effectively broke upgrades of libvirt-cim because all the providers
were deregistered.
We are now checking whether we are in an upgrade situation and if so
will not deregister the providers in postun.
Another enhancement is that we do a full deregistration in the %post
section for tog-pegasus now. This should make installs and upgrades more
robust against potentially damaged repositories (e.g., on development
systems).

As a reminder here's a short description of RPM's scriptlet processing.

action: install upgrade uninstall
%pre 1 >1 -
%post 1 >1 -
%preun - 1 0
%postun - 1 0

Scriptlet invocation order on upgrade
1. %pre(new_package)
2. %post(new_package)
3. %preun(old_package)
4. %postun(old_package)

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 115 +++++++++++++++++++++++++++++++---------------------
1 file changed, 68 insertions(+), 47 deletions(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index 459650c..b50cbd1 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -64,7 +64,6 @@ mkdir -p $RPM_BUILD_ROOT@INFO_STORE@
%clean
rm -fr $RPM_BUILD_ROOT

-%pre
%define REGISTRATION %{_datadir}/%{name}/*.registration
%define SCHEMA %{_datadir}/%{name}/*.mof

@@ -77,24 +76,46 @@ rm -fr $RPM_BUILD_ROOT
%define CIMV2_REG %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,ElementConformsToProfile,HostedAccessPoint}.registration
%define CIMV2_MOF %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,RegisteredProfile,ComputerSystem,ElementConformsToProfile,HostedAccessPoint}.mof

+%pre
# _If_ there is already a version of this installed, we must deregister
# the classes we plan to install in post, otherwise we may corrupt
# the pegasus repository. This is convention in other provider packages
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
- -n @CIM_VIRT_NS@ \
- -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+if [ $1 -gt 1 ]
+then
+ if [ -x /usr/sbin/cimserver ]
+ then
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n @CIM_VIRT_NS@ \
+ -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/interop \
+ -r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/PG_InterOp \
+ -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/cimv2\
+ -r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
+ fi

# Remove open-pegasus-specific providers installed in sfcb repository
# by older libvirt-cim packages
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
- -n root/PG_InterOp \
- -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
-
+ if [ -x /usr/sbin/sfcbd ]
+ then
+ %{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+ -n root/PG_InterOp \
+ -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
+ fi
+fi

%post
/sbin/ldconfig

-%{_datadir}/%{name}/install_base_schema.sh %{_datadir}/%{name}
+if [ $1 -eq 1 ]
+then
+# Install the CIM base schema if this is the initial install
+ %{_datadir}/%{name}/install_base_schema.sh %{_datadir}/%{name}
+fi

%if 0%{?fedora} >= 17 || 0%{?rhel} >= 7
if [ "`systemctl is-active tog-pegasus.service`" = "active" ]
@@ -112,65 +133,65 @@ rm -fr $RPM_BUILD_ROOT

if [ -x /usr/sbin/cimserver ]
then
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+ %{_datadir}/%{name}/provider-register.sh -t pegasus \
-n @CIM_VIRT_NS@ \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
- -n @CIM_VIRT_NS@ \
- -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+ %{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+ %{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/PG_InterOp \
-r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+ %{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/cimv2\
-r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
fi
if [ -x /usr/sbin/sfcbd ]
then
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
- -n root/virt \
- -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
+ %{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
+ %{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
+ %{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/cimv2\
-r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
fi

%preun
-if [ -x /usr/sbin/cimserver ]
+# The uninstall scriptlets are called after the install scriptlets
+# in the upgrade case. Therefore we must only deregister the providers
+# when $1 == 0 (final remove).
+if [ $1 -eq 0 ]
then
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
- -n root/virt \
- -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
- -n root/interop \
- -r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
- -n root/PG_InterOp \
- -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
- -n root/cimv2 \
- -r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
-fi
-if [ -x /usr/sbin/sfcbd ]
-then
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
- -n root/virt \
- -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
- -n root/interop \
- -r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
- -n root/cimv2 \
- -r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
+ if [ -x /usr/sbin/cimserver ]
+ then
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/virt \
+ -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/interop \
+ -r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/PG_InterOp \
+ -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+ -n root/cimv2 \
+ -r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
+ fi
+ if [ -x /usr/sbin/sfcbd ]
+ then
+ %{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+ -n root/virt \
+ -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+ -n root/interop \
+ -r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
+ %{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+ -n root/cimv2 \
+ -r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
+ fi
fi

%postun -p /sbin/ldconfig
--
1.8.5.3

49
SOURCES/libvirt-cim-0.6.3-1fae439d.patch

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
From 1fae439d0d06622d0f303c82c8b98f0a580c7774 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Thu, 29 Aug 2013 17:18:51 +0200
Subject: [PATCH 09/60] S390: Avoid the generation of default input and
graphics

KVM guests for the s390 architecture do not support graphics
and input devices. We use the os_info.fv.arch property to
recognize such guests and skip the default device generation
for those.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 12 ++++++++++++
1 file changed, 12 insertions(+)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 3df878f..301f046 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -583,6 +583,12 @@ static bool default_graphics_device(struct domain *domain)
if (domain->type == DOMAIN_LXC)
return true;

+ if ((domain->type == DOMAIN_KVM || domain->type == DOMAIN_QEMU) &&
+ domain->os_info.fv.arch != NULL &&
+ (XSTREQ(domain->os_info.fv.arch, "s390") ||
+ XSTREQ(domain->os_info.fv.arch, "s390x" )))
+ return true;
+
free(domain->dev_graphics);
domain->dev_graphics = calloc(1, sizeof(*domain->dev_graphics));
if (domain->dev_graphics == NULL) {
@@ -605,6 +611,12 @@ static bool default_input_device(struct domain *domain)
if (domain->type == DOMAIN_LXC)
return true;

+ if ((domain->type == DOMAIN_KVM || domain->type == DOMAIN_QEMU) &&
+ domain->os_info.fv.arch != NULL &&
+ (XSTREQ(domain->os_info.fv.arch, "s390") ||
+ XSTREQ(domain->os_info.fv.arch, "s390x" )))
+ return true;
+
free(domain->dev_input);
domain->dev_input = calloc(1, sizeof(*domain->dev_input));
if (domain->dev_input == NULL) {
--
2.1.0

458
SOURCES/libvirt-cim-0.6.3-21dea212.patch

@ -0,0 +1,458 @@ @@ -0,0 +1,458 @@
From 21dea2121ee1602e0b546b3e61b5a46c1ae2f54c Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:40 +0200
Subject: [PATCH 20/60] VSMS: Support for domains with console devices

An instance of KVM_ConsoleResourceAllocationSettingData can be added to
domain specification for VSMS DefineSystem() to define a console for a domain.
A console definition can not be modified or deleted.
It only can be added at system definition and deleted at system deletion.
If a KVM_ConsoleRASD is specified on a system definition,
no default graphics adapter definition is done.

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 314 +++++++++++++++++++++++++++---
1 file changed, 291 insertions(+), 23 deletions(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 6629b35..d626691 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -626,7 +626,8 @@ static bool default_input_device(struct domain *domain)

static bool add_default_devs(struct domain *domain)
{
- if (domain->dev_graphics_ct < 1) {
+ if (domain->dev_graphics_ct < 1 &&
+ domain->dev_console_ct < 1) {
if (!default_graphics_device(domain))
return false;
}
@@ -1339,47 +1340,294 @@ static int parse_sdl_address(const char *id,
return ret;
}

-static int parse_vnc_address(const char *id,
- char **ip,
- char **port)
+static int parse_ip_address(const char *id,
+ char **ip,
+ char **port)
{
int ret;
char *tmp_ip = NULL;
char *tmp_port = NULL;

- CU_DEBUG("Entering parse_vnc_address, address is %s", id);
+ CU_DEBUG("Entering parse_ip_address, address is %s", id);
if (strstr(id, "[") != NULL) {
/* its an ipv6 address */
ret = sscanf(id, "%a[^]]]:%as", &tmp_ip, &tmp_port);
- strcat(tmp_ip, "]");
+ if (tmp_ip != NULL) {
+ tmp_ip = realloc(tmp_ip, strlen(tmp_ip) + 2);
+ if (tmp_ip == NULL) {
+ ret = 0;
+ goto out;
+ }
+ strcat(tmp_ip, "]");
+ }
} else {
ret = sscanf(id, "%a[^:]:%as", &tmp_ip, &tmp_port);
}

- if (ret != 2) {
+ /* ret == 2: address and port, ret == 1: address only */
+ if (ret < 1) {
ret = 0;
goto out;
}

- if (ip)
+ if (ip) {
*ip = strdup(tmp_ip);
+ CU_DEBUG("IP = '%s'",*ip);
+ }

- if (port)
+ if (port && tmp_port) {
*port = strdup(tmp_port);
-
- ret = 1;
+ CU_DEBUG("Port = '%s'",*port);
+ }

out:
- if (ip && port)
- CU_DEBUG("Exiting parse_vnc_address, ip is %s, port is %s",
- *ip, *port);
-
free(tmp_ip);
free(tmp_port);

return ret;
}

+static bool parse_console_url(const char *url,
+ char **protocol,
+ char **host,
+ char **port)
+{
+ bool success = false;
+ char *tmp_protocol = NULL;
+ char *tmp_address = NULL;
+
+ CU_DEBUG("Entering parse_console_url:'%s'", url);
+
+ if (sscanf(url,"%a[^:]://%as", &tmp_protocol, &tmp_address) != 2)
+ goto out;
+
+ if (parse_ip_address(tmp_address, host, port) < 1)
+ goto out;
+
+ if (protocol) {
+ *protocol = strdup(tmp_protocol);
+ CU_DEBUG("Protocol = '%s'", *protocol);
+ }
+
+ success = true;
+
+ out:
+ free(tmp_protocol);
+ free(tmp_address);
+
+ return success;
+}
+
+static const char *_unixsock_console_rasd_to_vdev(CMPIInstance *inst,
+ struct console_device *cdev)
+{
+ const char *val = NULL;
+ const char *val2 = NULL;
+ char* protocol = NULL;
+
+ cdev->source_dev.unixsock.mode = NULL;
+ if (cu_get_str_prop(inst,"ConnectURL", &val) == CMPI_RC_OK) {
+ CU_DEBUG("ConnectURL = '%s'", val);
+ cdev->source_dev.unixsock.mode = strdup("connect");
+ }
+
+ if (cu_get_str_prop(inst, "BindURL", &val2) == CMPI_RC_OK) {
+ if (cdev->source_dev.unixsock.mode != NULL)
+ return "ConsoleRASD: Only one of ConnectURL or BindURL "
+ "is allowed for UNIX domain sockets.";
+ CU_DEBUG("BindURL = '%s'", val2);
+ cdev->source_dev.unixsock.mode = strdup("bind");
+ val = val2;
+ }
+
+ if (val) {
+ if (!parse_console_url(val, &protocol, &cdev->source_dev.unixsock.path, NULL))
+ return "ConsoleRASD: Invalid ConnectURL or BindURL for "
+ "UNIX domain socket client/server.";
+
+ if (protocol != NULL && !STREQC("file", protocol)) {
+ CU_DEBUG("Wrong ConsoleRASD protocol specified: '%s'", protocol);
+ free(protocol);
+ return "ConsoleRASD: Protocol 'file' was not specified for "
+ "ConnectURL or BindURL for UNIX domain socket client/server.";
+ }
+ free(protocol);
+ } else {
+ return "ConsoleRASD: ConnectURL or BindURL not specified for "
+ "UNIX domain socket client/server.";
+ }
+
+ return NULL;
+}
+
+static const char *_udp_console_rasd_to_vdev(CMPIInstance *inst,
+ struct console_device *cdev)
+{
+ const char *val = NULL;
+ char* protocol = NULL;
+
+ if (cu_get_str_prop(inst, "ConnectURL", &val) != CMPI_RC_OK)
+ return "ConsoleRASD: ConnectURL not specified for UDP network console.";
+
+ if (!parse_console_url(val, &protocol,
+ &cdev->source_dev.udp.connect_host,
+ &cdev->source_dev.udp.connect_service))
+ return "ConsoleRASD: Invalid ConnectURL specified for UDP network console.";
+
+ if (protocol != NULL && !STREQC("udp", protocol)) {
+ CU_DEBUG("Wrong ConsoleRASD protocol specified: '%s'", protocol);
+ free(protocol);
+ return "ConsoleRASD: Protocol 'udp' was not specified at "
+ "ConnectURL for UDP network console.";
+ }
+
+ free(protocol);
+
+ if (cu_get_str_prop(inst, "BindURL", &val) != CMPI_RC_OK)
+ return "ConsoleRASD: BindURL not specified for UDP network console.";
+
+ if (!parse_console_url(val, &protocol,
+ &cdev->source_dev.udp.bind_host,
+ &cdev->source_dev.udp.bind_service))
+ return "ConsoleRASD: Invalid BindURL specified for UDP network console.";
+
+ if (protocol != NULL && !STREQC("udp", protocol)) {
+ CU_DEBUG("Wrong ConsoleRASD protocol specified: '%s'", protocol);
+ free(protocol);
+ return "ConsoleRASD: Protocol 'udp' was not specified at BindURL "
+ "for UDP network console.";
+ }
+
+ free(protocol);
+ return NULL;
+}
+
+static const char *_tcp_console_rasd_to_vdev(CMPIInstance *inst,
+ struct console_device *cdev)
+{
+ const char *val = NULL;
+ const char *val2 = NULL;
+
+ cdev->source_dev.tcp.mode = NULL;
+ if (cu_get_str_prop(inst, "ConnectURL", &val) == CMPI_RC_OK) {
+ CU_DEBUG("ConnectURL = '%s'", val);
+ cdev->source_dev.tcp.mode = strdup("connect");
+ }
+
+ if (cu_get_str_prop(inst, "BindURL", &val2) == CMPI_RC_OK) {
+ if (cdev->source_dev.tcp.mode != NULL)
+ return "ConsoleRASD: Only one of ConnectURL or BindURL "
+ "is allowed for TCP sockets.";
+ CU_DEBUG("BindURL = '%s'", val2);
+ cdev->source_dev.tcp.mode = strdup("bind");
+ val = val2;
+ }
+
+ if (val) {
+ if (!parse_console_url(val,
+ &cdev->source_dev.tcp.protocol,
+ &cdev->source_dev.tcp.host,
+ &cdev->source_dev.tcp.service))
+ return "ConsoleRASD: Invalid ConnectURL or BindURL for "
+ "TCP client/server console.";
+ if (cdev->source_dev.tcp.service == NULL)
+ return "ConsoleRASD: Missing TCP port for TCP client/server console.";
+ } else {
+ return "ConsoleRASD: ConnectURL or BindURL not specified for "
+ "TCP client/server console.";
+ }
+
+ if (cdev->source_dev.tcp.protocol != NULL) {
+ if (STREQC("udp", cdev->source_dev.tcp.protocol)) {
+ CU_DEBUG("Wrong ConsoleRASD protocol specified: '%s'",
+ cdev->source_dev.tcp.protocol);
+ return "ConsoleRASD: Invalid protocol 'udp' was specified at "
+ "TCP client/server console.";
+ } else if (STREQC("file", cdev->source_dev.tcp.protocol)) {
+ CU_DEBUG("Wrong ConsoleRASD protocol specified: '%s'",
+ cdev->source_dev.tcp.protocol);
+ return "ConsoleRASD: Invalid protocol 'file' was specified at "
+ "TCP client/server console.";
+ }
+ }
+
+ return NULL;
+}
+
+static const char *console_rasd_to_vdev(CMPIInstance *inst,
+ struct virt_device *dev)
+{
+ int rc = 0;
+ const char *msg = NULL;
+ const char *val = NULL;
+ struct console_device *cdev = &dev->dev.console;
+ uint16_t tmp;
+
+ rc = cu_get_u16_prop(inst, "SourceType", &tmp);
+ if (rc != CMPI_RC_OK)
+ return "ConsoleRASD: SourceType field not specified.";
+
+ if (tmp >= CIM_CHARDEV_SOURCE_TYPE_INVALIDTYPE)
+ return "ConsoleRASD: Invalid SourceType value";
+
+ cdev->source_type = tmp;
+ CU_DEBUG("Processing SourceType: %d", cdev->source_type);
+
+ /* property not required */
+ if (cu_get_str_prop(inst, "TargetType", &val) == CMPI_RC_OK)
+ cdev->target_type = strdup(val);
+ CU_DEBUG("TargetType is '%s'", cdev->target_type ? : "NULL" );
+
+ switch (cdev->source_type) {
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ /* property not required */
+ if (cu_get_str_prop(inst, "SourcePath", &val) == CMPI_RC_OK)
+ cdev->source_dev.pty.path = strdup(val);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ if (cu_get_str_prop(inst, "SourcePath", &val) != CMPI_RC_OK)
+ return "ConsoleRASD: SourcePath not specified for Host device proxy.";
+ cdev->source_dev.dev.path = strdup(val);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ if (cu_get_str_prop(inst, "SourcePath", &val) != CMPI_RC_OK)
+ return "ConsoleRASD: SourcePath not specified for Device logfile.";
+ cdev->source_dev.file.path = strdup(val);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ if (cu_get_str_prop(inst, "SourcePath", &val) != CMPI_RC_OK)
+ return "ConsoleRASD: SourcePath not specified for Named pipe.";
+ cdev->source_dev.pipe.path = strdup(val);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ msg = _unixsock_console_rasd_to_vdev(inst, cdev);
+ if (msg != NULL)
+ return msg;
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ msg = _udp_console_rasd_to_vdev(inst, cdev);
+ if (msg != NULL)
+ return msg;
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ msg = _tcp_console_rasd_to_vdev(inst, cdev);
+ if (msg != NULL)
+ return msg;
+ break;
+
+ default:
+ /* Nothing to do for :
+ CIM_CHARDEV_SOURCE_TYPE_STDIO
+ CIM_CHARDEV_SOURCE_TYPE_NULL
+ CIM_CHARDEV_SOURCE_TYPE_VC
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+ */
+ break;
+ }
+
+ return NULL;
+}
+
static const char *graphics_rasd_to_vdev(CMPIInstance *inst,
struct virt_device *dev)
{
@@ -1394,7 +1642,7 @@ static const char *graphics_rasd_to_vdev(CMPIInstance *inst,
}
dev->dev.graphics.type = strdup(val);

- CU_DEBUG("graphics type = %s", dev->dev.graphics.type);
+ CU_DEBUG("graphics type = %s", dev->dev.graphics.type ? : "NULL");

/* FIXME: Add logic to prevent address:port collisions */
if (STREQC(dev->dev.graphics.type, "vnc")) {
@@ -1411,10 +1659,10 @@ static const char *graphics_rasd_to_vdev(CMPIInstance *inst,
val = "127.0.0.1:-1";
}

- ret = parse_vnc_address(val,
+ ret = parse_ip_address(val,
&dev->dev.graphics.dev.vnc.host,
&dev->dev.graphics.dev.vnc.port);
- if (ret != 1) {
+ if (ret != 2) {
msg = "GraphicsRASD field Address not valid";
goto out;
}
@@ -1540,6 +1788,8 @@ static const char *_sysvirt_rasd_to_vdev(CMPIInstance *inst,
return proc_rasd_to_vdev(inst, dev);
} else if (type == CIM_RES_TYPE_GRAPHICS) {
return graphics_rasd_to_vdev(inst, dev);
+ } else if (type == CIM_RES_TYPE_CONSOLE) {
+ return console_rasd_to_vdev(inst, dev);
} else if (type == CIM_RES_TYPE_INPUT) {
return input_rasd_to_vdev(inst, dev);
}
@@ -1601,7 +1851,7 @@ static const char *rasd_to_vdev(CMPIInstance *inst,
return msg;
}

-static char *add_device_nodup(struct virt_device *dev,
+static const char *add_device_nodup(struct virt_device *dev,
struct virt_device *list,
int max,
int *index)
@@ -1663,6 +1913,9 @@ static const char *classify_resources(CMPIArray *resources,
if (!make_space(&domain->dev_graphics, domain->dev_graphics_ct, count))
return "Failed to alloc graphics list";

+ if (!make_space(&domain->dev_console, domain->dev_console_ct, count))
+ return "Failed to alloc console list";
+
if (!make_space(&domain->dev_input, domain->dev_input_ct, count))
return "Failed to alloc input list";

@@ -1765,6 +2018,14 @@ static const char *classify_resources(CMPIArray *resources,
domain->dev_graphics,
gcount,
&domain->dev_graphics_ct);
+ } else if (type == CIM_RES_TYPE_CONSOLE) {
+ msg = rasd_to_vdev(inst,
+ domain,
+ &domain->dev_console[domain->dev_console_ct],
+ ns,
+ p_error);
+ if (msg == NULL)
+ domain->dev_console_ct+=1;
} else if (type == CIM_RES_TYPE_INPUT) {
domain->dev_input_ct = 1;
msg = rasd_to_vdev(inst,
@@ -2570,6 +2831,9 @@ static struct virt_device **find_list(struct domain *dominfo,
} else if (type == CIM_RES_TYPE_GRAPHICS) {
list = &dominfo->dev_graphics;
*count = &dominfo->dev_graphics_ct;
+ } else if (type == CIM_RES_TYPE_CONSOLE) {
+ list = &dominfo->dev_console;
+ *count = &dominfo->dev_console_ct;
} else if (type == CIM_RES_TYPE_INPUT) {
list = &dominfo->dev_input;
*count = &dominfo->dev_input_ct;
@@ -2693,7 +2957,8 @@ static CMPIStatus resource_del(struct domain *dominfo,

if (STREQ(dev->id, devid)) {
if ((type == CIM_RES_TYPE_GRAPHICS) ||
- (type == CIM_RES_TYPE_INPUT))
+ (type == CIM_RES_TYPE_CONSOLE) ||
+ (type == CIM_RES_TYPE_INPUT))
cu_statusf(_BROKER, &s, CMPI_RC_OK, "");
else {
s = _resource_dynamic(dominfo,
@@ -2774,7 +3039,9 @@ static CMPIStatus resource_add(struct domain *dominfo,
goto out;
}

- if ((type == CIM_RES_TYPE_GRAPHICS) || (type == CIM_RES_TYPE_INPUT)) {
+ if ((type == CIM_RES_TYPE_GRAPHICS) ||
+ (type == CIM_RES_TYPE_INPUT) ||
+ (type == CIM_RES_TYPE_CONSOLE)) {
(*count)++;
cu_statusf(_BROKER, &s, CMPI_RC_OK, "");
goto out;
@@ -2850,7 +3117,8 @@ static CMPIStatus resource_mod(struct domain *dominfo,
}

if ((type == CIM_RES_TYPE_GRAPHICS) ||
- (type == CIM_RES_TYPE_INPUT))
+ (type == CIM_RES_TYPE_INPUT) ||
+ (type == CIM_RES_TYPE_CONSOLE))
cu_statusf(_BROKER, &s, CMPI_RC_OK, "");
else {
#if LIBVIR_VERSION_NUMBER < 9000
--
2.1.0

80
SOURCES/libvirt-cim-0.6.3-222a3219.patch

@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
From 222a32198b3584ae221474a6d7288c91b8e76578 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Thu, 27 Mar 2014 16:36:32 -0400
Subject: [PATCH 56/60] Add MOFS and change install for ControllerPools

Add the new MOF and modify the build/install to handle.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
Makefile.am | 2 ++
libvirt-cim.spec.in | 2 ++
schema/ControllerPool.mof | 6 ++++++
schema/ControllerPool.registration | 3 +++
4 files changed, 13 insertions(+)
create mode 100644 schema/ControllerPool.mof
create mode 100644 schema/ControllerPool.registration

diff --git a/Makefile.am b/Makefile.am
index 24b11af..e332b5a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -56,6 +56,7 @@ MOFS = \
$(top_srcdir)/schema/PointingDevice.mof \
$(top_srcdir)/schema/GraphicsPool.mof \
$(top_srcdir)/schema/InputPool.mof \
+ $(top_srcdir)/schema/ControllerPool.mof \
$(top_srcdir)/schema/HostedAccessPoint.mof \
$(top_srcdir)/schema/ServiceAccessBySAP.mof \
$(top_srcdir)/schema/SAPAvailableForElement.mof \
@@ -147,6 +148,7 @@ REGS = \
$(top_srcdir)/schema/PointingDevice.registration \
$(top_srcdir)/schema/GraphicsPool.registration \
$(top_srcdir)/schema/InputPool.registration \
+ $(top_srcdir)/schema/ControllerPool.registration \
$(top_srcdir)/schema/HostedAccessPoint.registration \
$(top_srcdir)/schema/ServiceAccessBySAP.registration \
$(top_srcdir)/schema/SAPAvailableForElement.registration \
diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index f4e4fcf..d876b81 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -114,6 +114,7 @@ rm -fr $RPM_BUILD_ROOT
%{_datadir}/%{name}/PointingDevice.registration \\\
%{_datadir}/%{name}/GraphicsPool.registration \\\
%{_datadir}/%{name}/InputPool.registration \\\
+ %{_datadir}/%{name}/ControllerPool.registration \\\
%{_datadir}/%{name}/HostedAccessPoint.registration \\\
%{_datadir}/%{name}/ServiceAccessBySAP.registration \\\
%{_datadir}/%{name}/SAPAvailableForElement.registration \\\
@@ -176,6 +177,7 @@ rm -fr $RPM_BUILD_ROOT
%{_datadir}/%{name}/PointingDevice.mof \\\
%{_datadir}/%{name}/GraphicsPool.mof \\\
%{_datadir}/%{name}/InputPool.mof \\\
+ %{_datadir}/%{name}/ControllerPool.mof \\\
%{_datadir}/%{name}/HostedAccessPoint.mof \\\
%{_datadir}/%{name}/ServiceAccessBySAP.mof \\\
%{_datadir}/%{name}/SAPAvailableForElement.mof \\\
diff --git a/schema/ControllerPool.mof b/schema/ControllerPool.mof
new file mode 100644
index 0000000..6dbb8a8
--- /dev/null
+++ b/schema/ControllerPool.mof
@@ -0,0 +1,6 @@
+// Copyright Red Hat Corp. 2014
+
+[Provider("cmpi::Virt_DevicePool")]
+class KVM_ControllerPool : CIM_ResourcePool
+{
+};
diff --git a/schema/ControllerPool.registration b/schema/ControllerPool.registration
new file mode 100644
index 0000000..0785f83
--- /dev/null
+++ b/schema/ControllerPool.registration
@@ -0,0 +1,3 @@
+# Copyright Red Hat Corp. 2014
+# Classname Namespace ProviderName ProviderModule ProviderTypes
+KVM_ControllerPool root/virt Virt_DevicePool Virt_DevicePool instance
--
2.1.0

90
SOURCES/libvirt-cim-0.6.3-242ddaa6.patch

@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
From 242ddaa613c4d41cbdd063b73d20292049944b47 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 7 Oct 2013 16:02:37 +0200
Subject: [PATCH 24/60] KVMRedirectionSAP: Only return redirection SAPs for VNC
graphics

Since pty consoles still show up as GraphicsRASDs the check for
VNC redirection proved to be too rigid. Instead of failing the
associator call, PTY consoles will just be ignored now.
This is an old bug, but will be exposed when cimtest is extended
to handle consoles.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Daniel Hansel <daniel.hansel@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_KVMRedirectionSAP.c | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/Virt_KVMRedirectionSAP.c b/src/Virt_KVMRedirectionSAP.c
index 708b0d1..1533e52 100644
--- a/src/Virt_KVMRedirectionSAP.c
+++ b/src/Virt_KVMRedirectionSAP.c
@@ -264,28 +264,31 @@ static CMPIStatus get_vnc_sessions(const CMPIBroker *broker,
return s;
}

-static bool check_graphics(virDomainPtr dom,
- struct domain **dominfo)
+static int check_graphics(virDomainPtr dom,
+ struct domain **dominfo)
{
int ret = 0;
+ int i;

ret = get_dominfo(dom, dominfo);
if (!ret) {
CU_DEBUG("Unable to get domain info");
- return false;
+ return -1;
}

if ((*dominfo)->dev_graphics == NULL) {
CU_DEBUG("No graphics device associated with guest");
- return false;
+ return -1;
}

- if (!STREQC((*dominfo)->dev_graphics->dev.graphics.type, "vnc")) {
- CU_DEBUG("Only vnc devices have console redirection sessions");
- return false;
+ for (i = 0; i < (*dominfo)->dev_graphics_ct; i++) {
+ if (STREQC((*dominfo)->dev_graphics[i].dev.graphics.type, "vnc")) {
+ return i;
+ }
}

- return true;
+ CU_DEBUG("Only vnc devices have console redirection sessions");
+ return -1;
}

static CMPIStatus return_console_sap(const CMPIObjectPath *ref,
@@ -362,12 +365,13 @@ CMPIStatus enum_console_sap(const CMPIBroker *broker,
}

for (i = 0; i < count; i++) {
- if (!check_graphics(domain_list[i], &dominfo)) {
+ int pos = check_graphics(domain_list[i], &dominfo);
+ if (pos < 0) {
cleanup_dominfo(&dominfo);
continue;
}

- ret = sscanf(dominfo->dev_graphics->dev.graphics.dev.vnc.port,
+ ret = sscanf(dominfo->dev_graphics[pos].dev.graphics.dev.vnc.port,
"%d",
&lport);
if (ret != 1) {
@@ -449,7 +453,7 @@ CMPIStatus get_console_sap_by_name(const CMPIBroker *broker,
goto out;
}

- if (!check_graphics(dom, &dominfo)) {
+ if (check_graphics(dom, &dominfo) < 0) {
virt_set_status(broker, &s,
CMPI_RC_ERR_FAILED,
conn,
--
2.1.0

29
SOURCES/libvirt-cim-0.6.3-2cbbac52.patch

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
From 2cbbac52e45e0a21ed052adf79ec0e011f9e3b83 Mon Sep 17 00:00:00 2001
From: Pavel Hrdina <phrdina@redhat.com>
Date: Wed, 7 May 2014 12:52:15 +0200
Subject: [PATCH 58/60] xmlgen: fix build issue

Function controller_protocol_type_IDToStr() returns a const char
and we should abide that.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/xmlgen.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 3174ca9..a9a672d 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -807,7 +807,7 @@ static const char *controller_xml(xmlNodePtr root, struct domain *dominfo)
for (i = 0; i < dominfo->dev_controller_ct; i++) {
xmlNodePtr ctlr;
xmlNodePtr tmp;
- char *type_str;
+ const char *type_str;

struct virt_device *_dev = &dominfo->dev_controller[i];
if (_dev->type == CIM_RES_TYPE_UNKNOWN)
--
2.1.0

207
SOURCES/libvirt-cim-0.6.3-2e9c18d6.patch

@ -0,0 +1,207 @@ @@ -0,0 +1,207 @@
From 2e9c18d6dc04f79fab9ce46e16d69635d2ace48f Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Wed, 13 Nov 2013 19:07:10 +0100
Subject: [PATCH 37/60] FilterEntry: Fix endianness issues

A number of CIM properties was set in an endianness-unsafe manner
leading to failures on big endian systems.

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_FilterEntry.c | 53 ++++++++++++++++++++++++++------------------------
src/Virt_FilterEntry.h | 2 +-
src/Virt_FilterList.c | 3 ++-
3 files changed, 31 insertions(+), 27 deletions(-)

diff --git a/src/Virt_FilterEntry.c b/src/Virt_FilterEntry.c
index b7042da..ab4a512 100644
--- a/src/Virt_FilterEntry.c
+++ b/src/Virt_FilterEntry.c
@@ -59,8 +59,8 @@ struct rule_data_t {
const char *dstportend;
};

-static int octets_from_mac(const char * s, unsigned int *buffer,
- unsigned int size)
+static int octets_from_mac(const char * s, uint8_t *buffer,
+ unsigned int size)
{
unsigned int _buffer[6];
unsigned int i, n = 0;
@@ -86,8 +86,8 @@ static int octets_from_mac(const char * s, unsigned int *buffer,
return n;
}

-static int octets_from_ip(const char * s, unsigned int *buffer,
- unsigned int size)
+static int octets_from_ip(const char * s, uint8_t *buffer,
+ unsigned int size)
{
struct in6_addr addr;
unsigned int family = 0;
@@ -116,7 +116,8 @@ static int octets_from_ip(const char * s, unsigned int *buffer,
return n;
}

-static CMPIArray *octets_to_cmpi(const CMPIBroker *broker, unsigned int *bytes, int size)
+static CMPIArray *octets_to_cmpi(const CMPIBroker *broker, uint8_t *bytes,
+ int size)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
CMPIArray *array = NULL;
@@ -173,7 +174,7 @@ static char *cidr_to_str(const char *cidr)
return ret;
}

-static int convert_direction(const char *s)
+static uint16_t convert_direction(const char *s)
{
enum {NOT_APPLICABLE, INPUT, OUTPUT, BOTH} direction = NOT_APPLICABLE;

@@ -189,7 +190,7 @@ static int convert_direction(const char *s)
return direction;
}

-int convert_priority(const char *s)
+int16_t convert_priority(const char *s)
{
if (s == NULL)
return 0;
@@ -197,7 +198,7 @@ int convert_priority(const char *s)
return atoi(s);
}

-static int convert_action(const char *s)
+static uint16_t convert_action(const char *s)
{
enum {NONE=0, ACCEPT, DENY, REJECT, RETURN, CONTINUE} action = NONE;

@@ -216,7 +217,7 @@ static int convert_action(const char *s)
return action;
}

-static unsigned long convert_protocol_id(const char *s)
+static uint16_t convert_protocol_id(const char *s)
{
enum {NONE = 0, IPV4 = 2048, ARP = 2054, RARP = 32821, IPV6 = 34525} id = NONE;

@@ -239,7 +240,7 @@ static void convert_mac_rule_to_instance(
CMPIInstance *inst,
const CMPIBroker *broker)
{
- unsigned int bytes[48];
+ uint8_t bytes[48];
unsigned int size = 0;
CMPIArray *array = NULL;

@@ -280,7 +281,7 @@ static void convert_mac_rule_to_instance(
(CMPIValue *)&array, CMPI_uint8A);

if (rule->var.mac.protocol_id != NULL) {
- unsigned long n = convert_protocol_id(rule->var.mac.protocol_id);
+ uint16_t n = convert_protocol_id(rule->var.mac.protocol_id);

/* Unknown protocolid string. Try converting from hexadecimal value */
if (n == 0)
@@ -366,18 +367,19 @@ static void convert_ip_rule_to_instance(
CMPIInstance *inst,
const CMPIBroker *broker)
{
- unsigned int bytes[48];
+ uint8_t bytes[48];
unsigned int size = 0;
- unsigned int n = 0;
+ uint8_t ipver_num = 0;
+ uint16_t port_num = 0;
CMPIArray *array = NULL;
struct rule_data_t rule_data;

if (strstr(rule->protocol_id, "v6"))
- n = 6;
+ ipver_num = 6;
else
- n = 4;
+ ipver_num = 4;

- CMSetProperty(inst, "HdrIPVersion",(CMPIValue *)&n, CMPI_uint8);
+ CMSetProperty(inst, "HdrIPVersion",(CMPIValue *)&ipver_num, CMPI_uint8);

fill_rule_data(rule, &rule_data);

@@ -480,27 +482,27 @@ static void convert_ip_rule_to_instance(
}

if (rule_data.srcportstart) {
- n = atoi(rule_data.srcportstart);
+ port_num = atoi(rule_data.srcportstart);
CMSetProperty(inst, "HdrSrcPortStart",
- (CMPIValue *)&n, CMPI_uint16);
+ (CMPIValue *)&port_num, CMPI_uint16);
}

if (rule_data.srcportend) {
- n = atoi(rule_data.srcportend);
+ port_num = atoi(rule_data.srcportend);
CMSetProperty(inst, "HdrSrcPortEnd",
- (CMPIValue *)&n, CMPI_uint16);
+ (CMPIValue *)&port_num, CMPI_uint16);
}

if (rule_data.dstportstart) {
- n = atoi(rule_data.dstportstart);
+ port_num = atoi(rule_data.dstportstart);
CMSetProperty(inst, "HdrDestPortStart",
- (CMPIValue *)&n, CMPI_uint16);
+ (CMPIValue *)&port_num, CMPI_uint16);
}

if (rule_data.dstportend) {
- n = atoi(rule_data.dstportend);
+ port_num = atoi(rule_data.dstportend);
CMSetProperty(inst, "HdrDestPortEnd",
- (CMPIValue *)&n, CMPI_uint16);
+ (CMPIValue *)&port_num, CMPI_uint16);
}
}

@@ -515,7 +517,8 @@ static CMPIInstance *convert_rule_to_instance(
const char *sys_name = NULL;
const char *sys_ccname = NULL;
const char *basename = NULL;
- int action, direction, priority = 0;
+ uint16_t action, direction;
+ int16_t priority;

void (*convert_f)(struct acl_rule*, CMPIInstance*, const CMPIBroker*);

diff --git a/src/Virt_FilterEntry.h b/src/Virt_FilterEntry.h
index 5057fb0..0589aa0 100644
--- a/src/Virt_FilterEntry.h
+++ b/src/Virt_FilterEntry.h
@@ -77,7 +77,7 @@ CMPIStatus instance_from_rule(
*
* @param s A pointer to a string representing the priority
*/
-int convert_priority(const char *s);
+int16_t convert_priority(const char *s);
#endif

/*
diff --git a/src/Virt_FilterList.c b/src/Virt_FilterList.c
index 7026d8b..b248004 100644
--- a/src/Virt_FilterList.c
+++ b/src/Virt_FilterList.c
@@ -45,7 +45,8 @@ static CMPIInstance *convert_filter_to_instance(
CMPIInstance *inst = NULL;
const char *sys_name = NULL;
const char *sys_ccname = NULL;
- int direction = 0, priority;
+ uint16_t direction = 0;
+ int16_t priority;

inst = get_typed_instance(broker,
CLASSNAME(reference),
--
2.1.0

28
SOURCES/libvirt-cim-0.6.3-3c3a541d.patch

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
From 3c3a541db6824849d330930efb7c30f89cf826fa Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Thu, 8 Aug 2013 15:46:48 -0400
Subject: [PATCH 06/48] spec: Replace the path to the tar.gz file

Commit '07adabc2' seems to have inadvertently removed the path
to the source ftp file added by commit '5412bf11'.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index cd399b1..98f2a75 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -6,7 +6,7 @@ Version: @PACKAGE_VERSION@
Release: 1%{?dist}%{?extra_release}
License: LGPLv2+
Group: Development/Libraries
-Source: libvirt-cim-%{version}.tar.gz
+Source: ftp://libvirt.org/libvirt-cim/libvirt-cim-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
URL: http://libvirt.org/CIM/
Requires: libxml2 >= 2.6.0
--
1.8.5.3

1042
SOURCES/libvirt-cim-0.6.3-3e6f1489.patch

File diff suppressed because it is too large Load Diff

149
SOURCES/libvirt-cim-0.6.3-4013f9a0.patch

@ -0,0 +1,149 @@ @@ -0,0 +1,149 @@
From 4013f9a0d205be6c7edff9b1263ab350d781c4cc Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Wed, 22 Jan 2014 11:15:11 -0500
Subject: [PATCH 42/60] libxkutil:device_parsing: Coverity cleanups

A new version of Coverity found a number of issues:

parse_os(): RESOURCE_LEAK
- A benign issue due to using a for() loop in order to process the
XML fields. Although it's not possible to have a second entry with
the same text, Coverity doesn't know that so flagged each of the
get_attr_value() calls with a possible overwrite of allocated memory.
In order to "fix' that - just check for each being NULL prior to
the setting - a benign fix that shuts Coverity up

- A real issue was found - the 'loader' variable wasn't free()'d

parse_console_device(): RESOURCE_LEAK

- A benign issue due to using a for() loop in order to process the
XML fields results in 'target_port_ID' and 'udp_source_mode' being
flagged for possible overwrites. For the 'udp_source_mode' changed
the code to declare, use, free only within the scope of the case.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 41 +++++++++++++++++++++++------------------
1 file changed, 23 insertions(+), 18 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 56e39c7..4dd9e58 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -853,7 +853,6 @@ static int parse_console_device(xmlNode *node, struct virt_device **vdevs)
struct console_device *cdev = NULL;
char *source_type_str = NULL;
char *target_port_ID = NULL;
- char *udp_source_mode = NULL;

xmlNode *child = NULL;

@@ -875,7 +874,7 @@ static int parse_console_device(xmlNode *node, struct virt_device **vdevs)
CU_DEBUG("console device type ID = %d", cdev->source_type);

for (child = node->children; child != NULL; child = child->next) {
- if (XSTREQ(child->name, "target")) {
+ if (XSTREQ(child->name, "target") && target_port_ID == NULL) {
cdev->target_type = get_attr_value(child, "type");
CU_DEBUG("Console device target type = '%s'",
cdev->target_type ? : "NULL");
@@ -910,7 +909,9 @@ static int parse_console_device(xmlNode *node, struct virt_device **vdevs)
get_attr_value(child, "path");
break;
case CIM_CHARDEV_SOURCE_TYPE_UDP:
- udp_source_mode = get_attr_value(child, "mode");
+ {
+ char *udp_source_mode = get_attr_value(child,
+ "mode");
if (udp_source_mode == NULL)
goto err;
if (STREQC(udp_source_mode, "bind")) {
@@ -925,10 +926,13 @@ static int parse_console_device(xmlNode *node, struct virt_device **vdevs)
get_attr_value(child, "service");
} else {
CU_DEBUG("unknown udp mode: %s",
- udp_source_mode ? : "NULL");
+ udp_source_mode);
+ free(udp_source_mode);
goto err;
}
+ free(udp_source_mode);
break;
+ }
case CIM_CHARDEV_SOURCE_TYPE_TCP:
cdev->source_dev.tcp.mode =
get_attr_value(child, "mode");
@@ -965,14 +969,12 @@ static int parse_console_device(xmlNode *node, struct virt_device **vdevs)
*vdevs = vdev;
free(source_type_str);
free(target_port_ID);
- free(udp_source_mode);

return 1;

err:
free(source_type_str);
free(target_port_ID);
- free(udp_source_mode);
cleanup_console_device(cdev);
free(vdev);

@@ -1500,33 +1502,35 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
for (child = os->children; child != NULL; child = child->next) {
if (XSTREQ(child->name, "type")) {
STRPROP(dominfo, os_info.pv.type, child);
- arch = get_attr_value(child, "arch");
- machine = get_attr_value(child, "machine");
- } else if (XSTREQ(child->name, "kernel"))
+ if (arch == NULL)
+ arch = get_attr_value(child, "arch");
+ if (machine == NULL)
+ machine = get_attr_value(child, "machine");
+ } else if (XSTREQ(child->name, "kernel") && kernel == NULL)
kernel = get_node_content(child);
- else if (XSTREQ(child->name, "initrd"))
+ else if (XSTREQ(child->name, "initrd") && initrd == NULL)
initrd = get_node_content(child);
- else if (XSTREQ(child->name, "cmdline"))
+ else if (XSTREQ(child->name, "cmdline") && cmdline == NULL)
cmdline = get_node_content(child);
- else if (XSTREQ(child->name, "loader"))
+ else if (XSTREQ(child->name, "loader") && loader == NULL)
loader = get_node_content(child);
- else if (XSTREQ(child->name, "boot")) {
+ else if (XSTREQ(child->name, "boot") && boot == NULL) {
char **tmp_list = NULL;

- tmp_list = (char **)realloc(blist,
- (bl_size + 1) *
+ tmp_list = (char **)realloc(blist,
+ (bl_size + 1) *
sizeof(char *));
if (tmp_list == NULL) {
// Nothing you can do. Just go on.
CU_DEBUG("Could not alloc space for "
"boot device");
- continue;
+ continue;
}
blist = tmp_list;
-
+
blist[bl_size] = get_attr_value(child, "dev");
bl_size++;
- } else if (XSTREQ(child->name, "init"))
+ } else if (XSTREQ(child->name, "init") && init == NULL)
init = get_node_content(child);
}

@@ -1580,6 +1584,7 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
free(kernel);
free(initrd);
free(cmdline);
+ free(loader);
free(boot);
free(init);
cleanup_bootlist(blist, bl_size);
--
2.1.0

98
SOURCES/libvirt-cim-0.6.3-43ea7135.patch

@ -0,0 +1,98 @@ @@ -0,0 +1,98 @@
From 43ea7135654413b50601612ab0ab18cd8c47d84c Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Mon, 26 May 2014 17:00:35 +0800
Subject: [PATCH 60/60] Complete the support for dumpCore

Add API support for dumpCore field of Memory devices and fix issue in
parse_mem_device() when parsing dumpCore field.

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 5 +++--
schema/ResourceAllocationSettingData.mof | 3 +++
src/Virt_RASD.c | 8 ++++++++
src/Virt_VirtualSystemManagementService.c | 11 +++++++++++
4 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index f863cc5..815feea 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -850,9 +850,9 @@ static int parse_mem_device(xmlNode *node, struct virt_device **vdevs)
else if (XSTREQ(node->name, "memory")) {
sscanf(content, "%" PRIu64, &mdev->maxsize);
tmpval = get_attr_value(node, "dumpCore");
- if (tmpval && XSTREQ(tmpval, "on")) {
+ if (tmpval && STREQC(tmpval, "on")) {
mdev->dumpCore = MEM_DUMP_CORE_ON;
- } else if (tmpval && XSTREQ(content, "off")) {
+ } else if (tmpval && STREQC(tmpval, "off")) {
mdev->dumpCore = MEM_DUMP_CORE_OFF;
} else {
mdev->dumpCore = MEM_DUMP_CORE_NOT_SET;
@@ -1438,6 +1438,7 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
} else if (dev->type == CIM_RES_TYPE_MEM) {
dev->dev.mem.size = _dev->dev.mem.size;
dev->dev.mem.maxsize = _dev->dev.mem.maxsize;
+ dev->dev.mem.dumpCore = _dev->dev.mem.dumpCore;
} else if (dev->type == CIM_RES_TYPE_PROC) {
dev->dev.vcpu.quantity = _dev->dev.vcpu.quantity;
} else if (dev->type == CIM_RES_TYPE_EMU) {
diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index f78d423..ba57b55 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -229,6 +229,9 @@ class Xen_MemResourceAllocationSettingData : Xen_ResourceAllocationSettingData
]
class KVM_MemResourceAllocationSettingData : KVM_ResourceAllocationSettingData
{
+ [Description ("dumpCore could be set as 'on' or 'off'. "
+ "it also could be leave null.")]
+ boolean dumpCore;
};

[Description ("LXC virtual memory"),
diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index 761d053..9a028bd 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -1047,6 +1047,14 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
(CMPIValue *)&dev->dev.mem.size, CMPI_uint64);
CMSetProperty(inst, "Limit",
(CMPIValue *)&dev->dev.mem.maxsize, CMPI_uint64);
+
+ if (dev->dev.mem.dumpCore != MEM_DUMP_CORE_NOT_SET) {
+ bool dumpCore = true;
+ if (dev->dev.mem.dumpCore == MEM_DUMP_CORE_OFF)
+ dumpCore = false;
+ CMSetProperty(inst, "dumpCore",
+ (CMPIValue *)&dumpCore, CMPI_boolean);
+ }
} else if (dev->type == CIM_RES_TYPE_PROC) {
set_proc_rasd_params(broker, ref, dev, host, inst);
} else if (dev->type == CIM_RES_TYPE_GRAPHICS) {
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index c640360..bf96afe 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1239,6 +1239,17 @@ static const char *mem_rasd_to_vdev(CMPIInstance *inst,
const char *units;
CMPIrc ret;
int shift;
+ bool dumpCore;
+
+ ret = cu_get_bool_prop(inst, "dumpCore", &dumpCore);
+ if (ret != CMPI_RC_OK) {
+ dev->dev.mem.dumpCore = MEM_DUMP_CORE_NOT_SET;
+ } else {
+ if (dumpCore)
+ dev->dev.mem.dumpCore = MEM_DUMP_CORE_ON;
+ else
+ dev->dev.mem.dumpCore = MEM_DUMP_CORE_OFF;
+ }

ret = cu_get_u64_prop(inst, "VirtualQuantity", &dev->dev.mem.size);
if (ret != CMPI_RC_OK)
--
2.1.0

400
SOURCES/libvirt-cim-0.6.3-48b28b6a.patch

@ -0,0 +1,400 @@ @@ -0,0 +1,400 @@
From 48b28b6aec23b82c0239aee60af2a470c06dde1a Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Mon, 17 Mar 2014 19:21:23 -0400
Subject: [PATCH 51/60] Parse/Store controller XML tags

Parse and store the <controller> XML tags. The generated DeviceID will
be a combination of "controller" + XML device "name" + XML Index "value".
This should be unique enough now and generates "controller:pci:0" or
"controller:usb:0" DeviceID's.

In the future, if support is added for the "<master>" XML child a new
mechanism will need to be put in place since one of those controllers is
designed to have the same name and index - what changes is the function
for the device.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 119 ++++++++++++++++++++++++++++++++++++++++++++-
libxkutil/xmlgen.c | 74 +++++++++++++++++++++++++++-
2 files changed, 191 insertions(+), 2 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index d2d3859..f863cc5 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007, 2013
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -49,6 +49,7 @@
#define GRAPHICS_XPATH (xmlChar *)"/domain/devices/graphics | "\
"/domain/devices/console"
#define INPUT_XPATH (xmlChar *)"/domain/devices/input"
+#define CONTROLLER_XPATH (xmlChar *)"/domain/devices/controller"

#define DEFAULT_BRIDGE "xenbr0"
#define DEFAULT_NETWORK "default"
@@ -69,6 +70,7 @@ static void cleanup_device_address(struct device_address *addr)
if (addr == NULL)
return;

+ CU_DEBUG("Cleanup %d addresses", addr->ct);
for (i = 0; i < addr->ct; i++) {
free(addr->key[i]);
free(addr->value[i]);
@@ -84,6 +86,7 @@ static void cleanup_disk_device(struct disk_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean Disk type %s", dev->type);
free(dev->type);
free(dev->device);
free(dev->driver);
@@ -103,6 +106,7 @@ static void cleanup_vsi_device(struct vsi_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean VSI type %s", dev->vsi_type);
free(dev->vsi_type);
free(dev->manager_id);
free(dev->type_id);
@@ -117,6 +121,7 @@ static void cleanup_net_device(struct net_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean net type %s", dev->type);
free(dev->type);
free(dev->mac);
free(dev->source);
@@ -134,6 +139,7 @@ static void cleanup_emu_device(struct emu_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean emu %s", dev->path);
free(dev->path);
}

@@ -157,6 +163,7 @@ static void cleanup_graphics_device(struct graphics_device *dev)
if (dev == NULL || dev->type == NULL)
return;

+ CU_DEBUG("Clean graphics type %s", dev->type);
if (STREQC(dev->type, "sdl"))
cleanup_sdl_device(dev);
else
@@ -170,6 +177,7 @@ static void cleanup_path_device(struct path_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean path device %s", dev->path);
free(dev->path);

}
@@ -179,6 +187,7 @@ static void cleanup_unixsock_device(struct unixsock_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean unixsock device");
free(dev->path);
free(dev->mode);

@@ -189,6 +198,7 @@ static void cleanup_tcp_device(struct tcp_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean tcp device");
free(dev->mode);
free(dev->protocol);
free(dev->host);
@@ -201,6 +211,7 @@ static void cleanup_udp_device(struct udp_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean udb bind device");
free(dev->bind_host);
free(dev->bind_service);
free(dev->connect_host);
@@ -212,6 +223,7 @@ static void cleanup_console_device(struct console_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean console source_type %d", dev->source_type);
switch (dev->source_type)
{
case CIM_CHARDEV_SOURCE_TYPE_PTY:
@@ -304,10 +316,24 @@ static void cleanup_input_device(struct input_device *dev)
if (dev == NULL)
return;

+ CU_DEBUG("Clean input device %s", dev->type);
free(dev->type);
free(dev->bus);
}

+static void cleanup_controller_device(struct controller_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ CU_DEBUG("Clean controller device %d", dev->type);
+ free(dev->model);
+ free(dev->queues);
+ free(dev->ports);
+ free(dev->vectors);
+ cleanup_device_address(&dev->address);
+}
+
void cleanup_virt_device(struct virt_device *dev)
{
if (dev == NULL)
@@ -325,6 +351,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_CONTROLLER)
+ cleanup_controller_device(&dev->dev.controller);

free(dev->id);

@@ -339,6 +367,7 @@ void cleanup_virt_devices(struct virt_device **_devs, int count)
for (i = 0; i < count; i++)
cleanup_virt_device(&devs[i]);

+ CU_DEBUG("All devices cleaned");
free(devs);
*_devs = NULL;
}
@@ -1107,6 +1136,75 @@ static int parse_input_device(xmlNode *node, struct virt_device **vdevs)
return 0;
}

+static int parse_controller_device(xmlNode *cnode, struct virt_device **vdevs)
+{
+ struct virt_device *vdev = NULL;
+ struct controller_device *cdev = NULL;
+ char *type_str = NULL;
+ xmlNode *child = NULL;
+ char *index = NULL;
+ int ret;
+
+ vdev = calloc(1, sizeof(*vdev));
+ if (vdev == NULL)
+ goto err;
+
+ cdev = &(vdev->dev.controller);
+
+ type_str = get_attr_value(cnode, "type");
+ if (type_str == NULL) {
+ CU_DEBUG("No type");
+ goto err;
+ }
+ CU_DEBUG("controller device type = %s", type_str);
+ cdev->type = controller_protocol_type_StrToID(type_str);
+ if (cdev->type == CIM_CONTROLLER_PROTOCOL_TYPE_UNKNOWN) {
+ CU_DEBUG("Unknown controller protocol type (%d)", cdev->type);
+ goto err;
+ }
+
+ index = get_attr_value(cnode, "index");
+ if (index != NULL) {
+ sscanf(index, "%" PRIu64, &cdev->index);
+ free(index);
+ } else {
+ CU_DEBUG("No index");
+ goto err;
+ }
+
+ cdev->model = get_attr_value(cnode, "model");
+ cdev->ports = get_attr_value(cnode, "ports");
+ cdev->vectors = get_attr_value(cnode, "vectors");
+
+ for (child = cnode->children; child != NULL; child = child->next) {
+ if (XSTREQ(child->name, "address")) {
+ parse_device_address(child, &cdev->address);
+ } else if (XSTREQ(child->name, "driver")) {
+ cdev->queues = get_attr_value(child, "queues");
+ }
+ }
+ vdev->type = CIM_RES_TYPE_CONTROLLER;
+
+ ret = asprintf(&vdev->id, "controller:%s:%" PRIu64,
+ type_str, cdev->index);
+ if (ret == -1) {
+ CU_DEBUG("Failed to create controller id string");
+ goto err;
+ }
+ CU_DEBUG("Controller id is %s", vdev->id);
+ free(type_str);
+
+ *vdevs = vdev;
+
+ return 1;
+ err:
+ free(type_str);
+ cleanup_controller_device(cdev);
+ free(vdev);
+
+ return 0;
+}
+
static bool resize_devlist(struct virt_device **list, int newsize)
{
struct virt_device *_list;
@@ -1230,6 +1328,11 @@ static int parse_devices(const char *xml, struct virt_device **_list, int type)
func = &parse_input_device;
break;

+ case CIM_RES_TYPE_CONTROLLER:
+ xpathstr = CONTROLLER_XPATH;
+ func = &parse_controller_device;
+ break;
+
default:
CU_DEBUG("Unrecognized device type. Returning.");
goto err1;
@@ -1351,7 +1454,17 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
} else if (dev->type == CIM_RES_TYPE_CONSOLE) {
console_device_dup(&dev->dev.console,
&_dev->dev.console);
+ } else if (dev->type == CIM_RES_TYPE_CONTROLLER) {
+ dev->dev.controller.type = _dev->dev.controller.type;
+ dev->dev.controller.index = _dev->dev.controller.index;
+ DUP_FIELD(dev, _dev, dev.controller.model);
+ DUP_FIELD(dev, _dev, dev.controller.ports);
+ DUP_FIELD(dev, _dev, dev.controller.vectors);
+ DUP_FIELD(dev, _dev, dev.controller.queues);
+ duplicate_device_address(&dev->dev.controller.address,
+ &_dev->dev.controller.address);
}
+
return dev;
}

@@ -1731,6 +1844,9 @@ int get_dominfo_from_xml(const char *xml, struct domain **dominfo)
(*dominfo)->dev_vcpu_ct = parse_devices(xml,
&(*dominfo)->dev_vcpu,
CIM_RES_TYPE_PROC);
+ (*dominfo)->dev_controller_ct = parse_devices(xml,
+ &(*dominfo)->dev_controller,
+ CIM_RES_TYPE_CONTROLLER);

return ret;

@@ -1819,6 +1935,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_controller, dom->dev_controller_ct);

free(dom);

diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 18c4765..3174ca9 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007, 2013
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -798,6 +798,72 @@ static const char *input_xml(xmlNodePtr root, struct domain *dominfo)
return NULL;
}

+static const char *controller_xml(xmlNodePtr root, struct domain *dominfo)
+{
+ int i;
+ const char *msg = NULL;
+
+ CU_DEBUG("Found %d controllers", dominfo->dev_controller_ct);
+ for (i = 0; i < dominfo->dev_controller_ct; i++) {
+ xmlNodePtr ctlr;
+ xmlNodePtr tmp;
+ char *type_str;
+
+ struct virt_device *_dev = &dominfo->dev_controller[i];
+ if (_dev->type == CIM_RES_TYPE_UNKNOWN)
+ continue;
+
+ struct controller_device *cdev = &_dev->dev.controller;
+
+ ctlr = xmlNewChild(root, NULL, BAD_CAST "controller", NULL);
+ if (ctlr == NULL)
+ return XML_ERROR;
+
+
+ type_str = controller_protocol_type_IDToStr(cdev->type);
+ if (type_str == NULL)
+ return XML_ERROR;
+
+ CU_DEBUG("Type=%s Index=%" PRIu64, type_str, cdev->index);
+ xmlNewProp(ctlr, BAD_CAST "type",
+ BAD_CAST type_str);
+
+ /* If index is missing, let libvirt generate it */
+ if (cdev->index != CONTROLLER_INDEX_NOT_SET) {
+ char *index;
+ if (asprintf(&index, "%" PRIu64, cdev->index) == -1)
+ return XML_ERROR;
+ xmlNewProp(ctlr, BAD_CAST "index", BAD_CAST index);
+ free(index);
+ }
+
+ /* Optional */
+ if (cdev->model)
+ xmlNewProp(ctlr, BAD_CAST "model",
+ BAD_CAST cdev->model);
+ if (cdev->ports)
+ xmlNewProp(ctlr, BAD_CAST "ports",
+ BAD_CAST cdev->ports);
+ if (cdev->vectors)
+ xmlNewProp(ctlr, BAD_CAST "vectors",
+ BAD_CAST cdev->vectors);
+ if (cdev->queues) {
+ tmp = xmlNewChild(ctlr, NULL, BAD_CAST "driver", NULL);
+ xmlNewProp(tmp, BAD_CAST "queueus",
+ BAD_CAST cdev->queues);
+ }
+ if (cdev->address.ct > 0) {
+ msg = device_address_xml(ctlr, &cdev->address);
+ if (msg != NULL) {
+ CU_DEBUG("Failed to set the address");
+ return msg;
+ }
+ }
+ }
+
+ return NULL;
+}
+
static char *system_xml(xmlNodePtr root, struct domain *domain)
{
xmlNodePtr tmp;
@@ -1129,6 +1195,11 @@ char *device_to_xml(struct virt_device *_dev)
dominfo->dev_input_ct = 1;
dominfo->dev_input = dev;
break;
+ case CIM_RES_TYPE_CONTROLLER:
+ func = controller_xml;
+ dominfo->dev_controller_ct = 1;
+ dominfo->dev_controller = dev;
+ break;
default:
cleanup_virt_devices(&dev, 1);
goto out;
@@ -1167,6 +1238,7 @@ char *system_to_xml(struct domain *dominfo)
&console_xml,
&graphics_xml,
&emu_xml,
+ &controller_xml,
NULL
};

--
2.1.0

222
SOURCES/libvirt-cim-0.6.3-4954aa8c.patch

@ -0,0 +1,222 @@ @@ -0,0 +1,222 @@
From 4954aa8c9e659fe593cf368c82a62124754d4c9c Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Tue, 18 Mar 2014 08:52:53 -0400
Subject: [PATCH 50/60] Add virtual controller device types

Add data and strutures for a virtual controller device

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.h | 17 +++++-
src/svpc_types.h | 129 ++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 144 insertions(+), 2 deletions(-)

diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index a92e223..afddc1d 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007, 2013
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -163,6 +163,17 @@ struct input_device {
char *bus;
};

+#define CONTROLLER_INDEX_NOT_SET -1
+struct controller_device {
+ uint16_t type;
+ uint64_t index;
+ char *model;
+ char *ports;
+ char *vectors;
+ char *queues;
+ struct device_address address;
+};
+
struct virt_device {
uint16_t type;
union {
@@ -174,6 +185,7 @@ struct virt_device {
struct graphics_device graphics;
struct console_device console;
struct input_device input;
+ struct controller_device controller;
} dev;
char *id;
};
@@ -249,6 +261,9 @@ struct domain {

struct virt_device *dev_vcpu;
int dev_vcpu_ct;
+
+ struct virt_device *dev_controller;
+ int dev_controller_ct;
};

struct virt_device *virt_device_dup(struct virt_device *dev);
diff --git a/src/svpc_types.h b/src/svpc_types.h
index 404e428..d9f8032 100644
--- a/src/svpc_types.h
+++ b/src/svpc_types.h
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007, 2013
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -24,6 +24,9 @@

#define CIM_OPERATIONAL_STATUS 2

+/* From the ResourceType list for CIM_ResourceAllocationSettingData.html
+ * Found on http://schemas.dmtf.org/wbem/cim-html/2.31.0
+ */
#define CIM_RES_TYPE_ALL 0
#define CIM_RES_TYPE_OTHER 1
#define CIM_RES_TYPE_PROC 3
@@ -33,9 +36,11 @@
#define CIM_RES_TYPE_GRAPHICS 24
#define CIM_RES_TYPE_INPUT 13
#define CIM_RES_TYPE_UNKNOWN 1000
+/* libvirt-cim specific values can start here */
#define CIM_RES_TYPE_IMAGE 32768
#define CIM_RES_TYPE_CONSOLE 32769
#define CIM_RES_TYPE_EMU 32770
+#define CIM_RES_TYPE_CONTROLLER 32771

#define CIM_RES_TYPE_COUNT 7
const static int cim_res_types[CIM_RES_TYPE_COUNT] =
@@ -266,4 +271,126 @@ static inline const char* chardev_source_type_IDToStr(int type)
return type_str;
}

+/* enum for Controller ProtocolSupported values
+ *
+ * From the ProtocolSupported list for CIM_Controller.html
+ * Found on http://schemas.dmtf.org/wbem/cim-html/2.31.0
+ */
+enum CIM_controller_protocol_type {
+ CIM_CONTROLLER_PROTOCOL_TYPE_OTHER = 1,
+ CIM_CONTROLLER_PROTOCOL_TYPE_UNKNOWN = 2,
+ CIM_CONTROLLER_PROTOCOL_TYPE_EISA = 3,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ISA = 4,
+ CIM_CONTROLLER_PROTOCOL_TYPE_PCI = 5,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ATA = 6,
+ CIM_CONTROLLER_PROTOCOL_TYPE_FD = 7,
+ CIM_CONTROLLER_PROTOCOL_TYPE_1496 = 8,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_PI = 9,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_FC = 10,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_SB = 11,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_SB2 = 12,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_SSA = 13,
+ CIM_CONTROLLER_PROTOCOL_TYPE_VESA = 14,
+ CIM_CONTROLLER_PROTOCOL_TYPE_PCMCIA = 15,
+ CIM_CONTROLLER_PROTOCOL_TYPE_USB = 16,
+ CIM_CONTROLLER_PROTOCOL_TYPE_PP = 17,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ESCON = 18,
+ CIM_CONTROLLER_PROTOCOL_TYPE_DIAG = 19,
+ CIM_CONTROLLER_PROTOCOL_TYPE_I2C = 20,
+ CIM_CONTROLLER_PROTOCOL_TYPE_POWER = 21,
+ CIM_CONTROLLER_PROTOCOL_TYPE_HIPPI = 22,
+ CIM_CONTROLLER_PROTOCOL_TYPE_MULTIBUS = 23,
+ CIM_CONTROLLER_PROTOCOL_TYPE_VME = 24,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IPI = 25,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IEEE488 = 26,
+ CIM_CONTROLLER_PROTOCOL_TYPE_RS232 = 27,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IEEE8023_10BASE5 = 28,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IEEE8023_10BASE2 = 29,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IEEE8023_1BASE5 = 30,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IEEE8023_10BROAD36 = 31,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IEEE8023_100BASEVG = 32,
+ CIM_CONTROLLER_PROTOCOL_TYPE_TOKENRING = 33,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ANSIX3T9 = 34,
+ CIM_CONTROLLER_PROTOCOL_TYPE_MCA = 35,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ESDI = 36,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IDE = 37,
+ CIM_CONTROLLER_PROTOCOL_TYPE_CMD = 38,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ST506 = 39,
+ CIM_CONTROLLER_PROTOCOL_TYPE_DSSI = 40,
+ CIM_CONTROLLER_PROTOCOL_TYPE_QIC2 = 41,
+ CIM_CONTROLLER_PROTOCOL_TYPE_ENH_ATA = 42,
+ CIM_CONTROLLER_PROTOCOL_TYPE_AGP = 43,
+ CIM_CONTROLLER_PROTOCOL_TYPE_TWIRP = 44,
+ CIM_CONTROLLER_PROTOCOL_TYPE_FIR = 45,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SIR = 46,
+ CIM_CONTROLLER_PROTOCOL_TYPE_IRBUS = 47,
+ CIM_CONTROLLER_PROTOCOL_TYPE_SATA = 48,
+ /* libvirt specific */
+ CIM_CONTROLLER_PROTOCOL_TYPE_CCID = 32678,
+ CIM_CONTROLLER_PROTOCOL_TYPE_VIRTIO_SERIAL = 32769,
+};
+
+static inline int controller_protocol_type_StrToID(const char *type_str)
+{
+ int rc = CIM_CONTROLLER_PROTOCOL_TYPE_UNKNOWN;
+
+ if (type_str == NULL)
+ return rc;
+
+ if (STREQC(type_str, "ide"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_IDE;
+ else if (STREQC(type_str, "fdc"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_FD;
+ else if (STREQC(type_str, "scsi"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_SSA; /* REVISIT */
+ else if (STREQC(type_str, "sata"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_SATA;
+ else if (STREQC(type_str, "ccid"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_CCID;
+ else if (STREQC(type_str, "virtio-serial"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_VIRTIO_SERIAL;
+ else if (STREQC(type_str, "pci"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_PCI;
+ else if (STREQC(type_str, "usb"))
+ rc = CIM_CONTROLLER_PROTOCOL_TYPE_USB;
+
+ return rc;
+}
+
+static inline const char* controller_protocol_type_IDToStr(int type)
+{
+ char *type_str = NULL;
+
+ switch (type)
+ {
+ case CIM_CONTROLLER_PROTOCOL_TYPE_IDE:
+ type_str = "ide";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_FD:
+ type_str = "fdc";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_SCSI_SSA:
+ type_str = "scsi";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_SATA:
+ type_str = "sata";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_CCID:
+ type_str = "ccid";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_VIRTIO_SERIAL:
+ type_str = "virtio-serial";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_PCI:
+ type_str = "pci";
+ break;
+ case CIM_CONTROLLER_PROTOCOL_TYPE_USB:
+ type_str = "usb";
+ break;
+ default:
+ break;
+ }
+ return type_str;
+}
+
#endif
--
2.1.0

309
SOURCES/libvirt-cim-0.6.3-4f74864c.patch

@ -0,0 +1,309 @@ @@ -0,0 +1,309 @@
From 4f74864c72ffbb05c8b02ab9d12c581e22da359f Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 14 Oct 2013 17:29:41 +0200
Subject: [PATCH 26/60] libxkutil: Support for device addresses

New data type for device addresses based on the generic
"address" element of the libvirt domain XML.
Contains XML parsing and generation code for device addresses.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 113 +++++++++++++++++++++++++++++++++++++++++++++
libxkutil/device_parsing.h | 11 +++++
libxkutil/xmlgen.c | 28 +++++++++++
3 files changed, 152 insertions(+)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index aecca4c..97419d2 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -63,6 +63,22 @@
/* Device parse function */
typedef int (*dev_parse_func_t)(xmlNode *, struct virt_device **);

+static void cleanup_device_address(struct device_address *addr)
+{
+ int i;
+ if (addr == NULL)
+ return;
+
+ for (i = 0; i < addr->ct; i++) {
+ free(addr->key[i]);
+ free(addr->value[i]);
+ }
+
+ free(addr->key);
+ free(addr->value);
+ addr->ct = 0;
+}
+
static void cleanup_disk_device(struct disk_device *dev)
{
if (dev == NULL)
@@ -77,6 +93,7 @@ static void cleanup_disk_device(struct disk_device *dev)
free(dev->virtual_dev);
free(dev->bus_type);
free(dev->access_mode);
+ cleanup_device_address(&dev->address);
}

static void cleanup_vsi_device(struct vsi_device *dev)
@@ -107,6 +124,7 @@ static void cleanup_net_device(struct net_device *dev)
free(dev->filter_ref);
free(dev->poolid);
cleanup_vsi_device(&dev->vsi);
+ cleanup_device_address(&dev->address);
}

static void cleanup_emu_device(struct emu_device *dev)
@@ -351,6 +369,67 @@ char *get_node_content(xmlNode *node)
return buf;
}

+int add_device_address_property(struct device_address *devaddr,
+ const char *key,
+ const char *value)
+{
+ char *k = NULL;
+ char *v = NULL;
+ char **list = NULL;
+
+ if (key != NULL && value != NULL) {
+ k = strdup(key);
+ v = strdup(value);
+ if (k == NULL || v == NULL)
+ goto err;
+
+ list = realloc(devaddr->key, sizeof(char*) * (devaddr->ct+1));
+ if (list == NULL)
+ goto err;
+ devaddr->key = list;
+
+ list = realloc(devaddr->value, sizeof(char*) * (devaddr->ct+1));
+ if (list == NULL)
+ goto err;
+ devaddr->value = list;
+
+ devaddr->key[devaddr->ct] = k;
+ devaddr->value[devaddr->ct] = v;
+ devaddr->ct += 1;
+ return 1;
+ }
+
+ err:
+ free(k);
+ free(v);
+ free(list);
+ return 0;
+}
+
+
+static int parse_device_address(xmlNode *anode, struct device_address *devaddr)
+{
+ xmlAttr *attr = NULL;
+ char *name = NULL;
+ char *value = NULL;
+
+ for (attr = anode->properties; attr != NULL; attr = attr->next) {
+ name = (char*) attr->name;
+ value = get_attr_value(anode, name);
+ if (!add_device_address_property(devaddr, name, value))
+ goto err;
+ free(value);
+ }
+
+ return 1;
+
+ err:
+ cleanup_device_address(devaddr);
+ free(value);
+
+ return 0;
+}
+
static int parse_fs_device(xmlNode *dnode, struct virt_device **vdevs)
{
struct virt_device *vdev = NULL;
@@ -386,6 +465,8 @@ static int parse_fs_device(xmlNode *dnode, struct virt_device **vdevs)
}
} else if (XSTREQ(child->name, "driver")) {
ddev->driver_type = get_attr_value(child, "type");
+ } else if (XSTREQ(child->name, "address")) {
+ parse_device_address(child, &ddev->address);
}
}

@@ -459,6 +540,8 @@ static int parse_block_device(xmlNode *dnode, struct virt_device **vdevs)
ddev->readonly = true;
} else if (XSTREQ(child->name, "shareable")) {
ddev->shareable = true;
+ } else if (XSTREQ(child->name, "address")) {
+ parse_device_address(child, &ddev->address);
}
}

@@ -598,6 +681,8 @@ static int parse_net_device(xmlNode *inode, struct virt_device **vdevs)
ndev->filter_ref = get_attr_value(child, "filter");
} else if (XSTREQ(child->name, "virtualport")) {
parse_vsi_device(child, ndev);
+ } else if (XSTREQ(child->name, "address")) {
+ parse_device_address(child, &ndev->address);
#if LIBVIR_VERSION_NUMBER >= 9000
} else if (XSTREQ(child->name, "bandwidth")) {
/* Network QoS bandwidth support */
@@ -1167,6 +1252,32 @@ static int parse_devices(const char *xml, struct virt_device **_list, int type)
return count;
}

+static void duplicate_device_address(struct device_address *to, const struct device_address *from)
+{
+ int i;
+
+ if (from == NULL || to == NULL || from->ct == 0)
+ return;
+
+ to->ct = from->ct;
+ to->key = calloc(from->ct, sizeof(char*));
+ to->value = calloc(from->ct, sizeof(char*));
+ if (to->key == NULL || to->value == NULL)
+ goto err;
+
+ for (i = 0; i < from->ct; i++) {
+ to->key[i] = strdup(from->key[i]);
+ to->value[i] = strdup(from->value[i]);
+ if (to->key[i] == NULL || to->value[i] == NULL)
+ goto err;
+ }
+
+ return;
+
+ err:
+ cleanup_device_address(to);
+}
+
struct virt_device *virt_device_dup(struct virt_device *_dev)
{
struct virt_device *dev;
@@ -1196,6 +1307,7 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
DUP_FIELD(dev, _dev, dev.net.vsi.profile_id);
dev->dev.net.reservation = _dev->dev.net.reservation;
dev->dev.net.limit = _dev->dev.net.limit;
+ duplicate_device_address(&dev->dev.net.address, &_dev->dev.net.address);
} else if (dev->type == CIM_RES_TYPE_DISK) {
DUP_FIELD(dev, _dev, dev.disk.type);
DUP_FIELD(dev, _dev, dev.disk.device);
@@ -1209,6 +1321,7 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
dev->dev.disk.disk_type = _dev->dev.disk.disk_type;
dev->dev.disk.readonly = _dev->dev.disk.readonly;
dev->dev.disk.shareable = _dev->dev.disk.shareable;
+ duplicate_device_address(&dev->dev.disk.address, &_dev->dev.disk.address);
} else if (dev->type == CIM_RES_TYPE_MEM) {
dev->dev.mem.size = _dev->dev.mem.size;
dev->dev.mem.maxsize = _dev->dev.mem.maxsize;
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 2803d6a..531703d 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -33,6 +33,12 @@

#include "../src/svpc_types.h"

+struct device_address {
+ uint32_t ct;
+ char **key;
+ char **value;
+};
+
struct vsi_device {
char *vsi_type;
char *manager_id;
@@ -56,6 +62,7 @@ struct disk_device {
char *bus_type;
char *cache;
char *access_mode; /* access modes for DISK_FS (filesystem) type */
+ struct device_address address;
};

struct net_device {
@@ -70,6 +77,7 @@ struct net_device {
uint64_t reservation;
uint64_t limit;
struct vsi_device vsi;
+ struct device_address address;
};

struct mem_device {
@@ -257,6 +265,9 @@ int get_devices(virDomainPtr dom, struct virt_device **list, int type,
void cleanup_virt_device(struct virt_device *dev);
void cleanup_virt_devices(struct virt_device **devs, int count);

+int add_device_address_property(struct device_address *devaddr,
+ const char *key, const char *value);
+
char *get_node_content(xmlNode *node);
char *get_attr_value(xmlNode *node, char *attrname);

diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 7e8801d..40e2905 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -178,6 +178,26 @@ static const char *console_xml(xmlNodePtr root, struct domain *dominfo)
BAD_CAST cdev->target_type);
}
}
+
+ return NULL;
+}
+
+static char *device_address_xml(xmlNodePtr root, struct device_address *addr)
+{
+ int i;
+ xmlNodePtr address;
+
+ if (addr == NULL || addr->ct == 0)
+ return NULL;
+
+ address = xmlNewChild(root, NULL, BAD_CAST "address", NULL);
+ if (address == NULL)
+ return XML_ERROR;
+
+ for (i = 0; i < addr->ct; i++) {
+ xmlNewProp(address, BAD_CAST addr->key[i] , BAD_CAST addr->value[i]);
+ }
+
return NULL;
}

@@ -225,6 +245,9 @@ static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
if (dev->shareable)
xmlNewChild(disk, NULL, BAD_CAST "shareable", NULL);

+ if (dev->address.ct > 0)
+ return device_address_xml(disk, &dev->address);
+
return NULL;
}

@@ -279,6 +302,8 @@ static const char *disk_file_xml(xmlNodePtr root, struct disk_device *dev)
if (dev->shareable)
xmlNewChild(disk, NULL, BAD_CAST "shareable", NULL);

+ if (dev->address.ct > 0)
+ return device_address_xml(disk, &dev->address);

return NULL;
}
@@ -520,6 +545,9 @@ static const char *net_xml(xmlNodePtr root, struct domain *dominfo)
}
#endif

+ if (dev->dev.net.address.ct > 0)
+ msg = device_address_xml(nic, &dev->dev.net.address);
+
if (STREQ(dev->dev.net.type, "network")) {
msg = set_net_source(nic, net, "network");
} else if (STREQ(dev->dev.net.type, "bridge")) {
--
2.1.0

162
SOURCES/libvirt-cim-0.6.3-53a4dff9.patch

@ -0,0 +1,162 @@ @@ -0,0 +1,162 @@
From 53a4dff9797a9d36918ec14fa560efde4d5142e5 Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Fri, 4 Apr 2014 11:16:47 -0400
Subject: [PATCH 55/60] Controller: Add associations for KVM_Controller

Add the various associations to make the KVM_Controller work

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_ElementAllocatedFromPool.c | 4 +++-
src/Virt_ElementSettingData.c | 3 ++-
src/Virt_ServiceAffectsElement.c | 8 +++++---
src/Virt_SettingsDefineState.c | 4 +++-
src/Virt_SystemDevice.c | 3 ++-
src/Virt_VSSDComponent.c | 3 ++-
6 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/Virt_ElementAllocatedFromPool.c b/src/Virt_ElementAllocatedFromPool.c
index 2c2f2d1..262c9b9 100644
--- a/src/Virt_ElementAllocatedFromPool.c
+++ b/src/Virt_ElementAllocatedFromPool.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -275,6 +275,7 @@ static char* device[] = {
"KVM_LogicalDisk",
"KVM_DisplayController",
"KVM_PointingDevice",
+ "KVM_Controller",
"LXC_Processor",
"LXC_Memory",
"LXC_NetworkPort",
@@ -297,6 +298,7 @@ static char* device_or_pool[] = {
"KVM_LogicalDisk",
"KVM_DisplayController",
"KVM_PointingDevice",
+ "KVM_Controller",
"LXC_Processor",
"LXC_Memory",
"LXC_NetworkPort",
diff --git a/src/Virt_ElementSettingData.c b/src/Virt_ElementSettingData.c
index c088e49..5845c86 100644
--- a/src/Virt_ElementSettingData.c
+++ b/src/Virt_ElementSettingData.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Kaitlin Rupert <karupert@us.ibm.com>
@@ -137,6 +137,7 @@ static char* resource_allocation_setting_data[] = {
"KVM_GraphicsResourceAllocationSettingData",
"KVM_ConsoleResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
+ "KVM_ControllerResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
diff --git a/src/Virt_ServiceAffectsElement.c b/src/Virt_ServiceAffectsElement.c
index 9810e02..d64a877 100644
--- a/src/Virt_ServiceAffectsElement.c
+++ b/src/Virt_ServiceAffectsElement.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2008
+ * Copyright IBM Corp. 2008-2014
*
* Authors:
* Kaitlin Rupert <karupert@us.ibm.com>
@@ -101,9 +101,10 @@ static CMPIStatus validate_cs_or_dev_ref(const CMPIContext *context,

if (STREQC(classname, "ComputerSystem")) {
s = get_domain_by_ref(_BROKER, ref, &inst);
- } else if ((STREQC(classname, "PointingDevice")) ||
+ } else if ((STREQC(classname, "PointingDevice")) ||
+ (STREQC(classname, "Controller")) ||
(STREQC(classname, "DisplayController"))) {
- s = get_device_by_ref(_BROKER, ref, &inst);
+ s = get_device_by_ref(_BROKER, ref, &inst);
}

free(classname);
@@ -146,6 +147,7 @@ static char* affected_ele[] = {
"Xen_DisplayController",
"KVM_DisplayController",
"LXC_DisplayController",
+ "KVM_Controller",
NULL
};

diff --git a/src/Virt_SettingsDefineState.c b/src/Virt_SettingsDefineState.c
index c8cda97..6338d7c 100644
--- a/src/Virt_SettingsDefineState.c
+++ b/src/Virt_SettingsDefineState.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -336,6 +336,7 @@ static char* logical_device[] = {
"KVM_DisplayController",
"KVM_ConsoleDisplayController",
"KVM_PointingDevice",
+ "KVM_Controller",
"LXC_Processor",
"LXC_Memory",
"LXC_NetworkPort",
@@ -361,6 +362,7 @@ static char* resource_allocation_setting_data[] = {
"KVM_GraphicsResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
"KVM_ConsoleResourceAllocationSettingData",
+ "KVM_ControllerResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
diff --git a/src/Virt_SystemDevice.c b/src/Virt_SystemDevice.c
index d2e526d..ae13ecb 100644
--- a/src/Virt_SystemDevice.c
+++ b/src/Virt_SystemDevice.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -144,6 +144,7 @@ static char* part_component[] = {
"KVM_DisplayController",
"KVM_ConsoleDisplayController",
"KVM_PointingDevice",
+ "KVM_Controller",
"LXC_Processor",
"LXC_Memory",
"LXC_NetworkPort",
diff --git a/src/Virt_VSSDComponent.c b/src/Virt_VSSDComponent.c
index 35bffde..fc223c2 100644
--- a/src/Virt_VSSDComponent.c
+++ b/src/Virt_VSSDComponent.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -141,6 +141,7 @@ static char* part_component[] = {
"KVM_GraphicsResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
"KVM_ConsoleResourceAllocationSettingData",
+ "KVM_ControllerResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
--
2.1.0

63
SOURCES/libvirt-cim-0.6.3-54778c78.patch

@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
From 54778c7811594a731254e086a46dcc5f25ad2ee7 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Tue, 21 Jan 2014 16:23:16 -0500
Subject: [PATCH 40/48] spec: Fix docs/*.html packaging issue

Using a more recent rpmbuild on f20, I found that the 'make rpm' was failing:

Installed (but unpackaged) file(s) found:
/usr/share/doc/libvirt-cim-0.6.3/html/architecture.html
/usr/share/doc/libvirt-cim-0.6.3/html/downloads.html
/usr/share/doc/libvirt-cim-0.6.3/html/index.html
/usr/share/doc/libvirt-cim-0.6.3/html/intro.html
/usr/share/doc/libvirt-cim-0.6.3/html/libvirt-cim.html
/usr/share/doc/libvirt-cim-0.6.3/html/news.html
/usr/share/doc/libvirt-cim-0.6.3/html/patches.html
/usr/share/doc/libvirt-cim-0.6.3/html/platforms.html
/usr/share/doc/libvirt-cim-0.6.3/html/schema.html
make: *** [rpm] Error 1

After a bit of research - I found the following page that describes a
workaround to add "%define _unpackaged_files_terminate_build 0" to the
spec file:

http://www.oldrpm.org/hintskinks/unpackaged/

However, figuring that wasn't a great solution - I found a libvirt change
that provided a way to work around what was being seen, see:

http://www.redhat.com/archives/libvir-list/2013-November/msg00441.html

It seems as though having that %doc doc/*.html is not proper any more.
With this change I can once again build RPM packages

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index c96451b..24ef280 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -60,6 +60,7 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libxkutil.so
mkdir -p $RPM_BUILD_ROOT/etc/ld.so.conf.d
echo %{_libdir}/cmpi > $RPM_BUILD_ROOT/etc/ld.so.conf.d/libvirt-cim.%{_arch}.conf
mkdir -p $RPM_BUILD_ROOT@INFO_STORE@
+mv $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-cim-%{version} libvirt-cim-docs

%clean
rm -fr $RPM_BUILD_ROOT
@@ -347,9 +348,8 @@ fi
%defattr(-, root, root)
%{_sysconfdir}/libvirt/cim

-%doc README COPYING doc/CodingStyle doc/SubmittingPatches
+%doc README COPYING doc/CodingStyle doc/SubmittingPatches libvirt-cim-docs/*
%doc base_schema/README.DMTF
-%doc doc/*.html
%{_libdir}/lib*.so*
%{_libdir}/cmpi/lib*.so*
%{_datadir}/libvirt-cim
--
1.8.5.3

39
SOURCES/libvirt-cim-0.6.3-55d3f9fc.patch

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
From 55d3f9fc5b9b0e45ed843a40a70b24d168d83d86 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Wed, 22 Jan 2014 13:21:17 -0500
Subject: [PATCH 44/60] RAFP: Coverity cleanup

A new version of Coverity found:

filter_by_pool(): RESOURCE_LEAK
- Because the code is run within a for() loop Coverity complains
that the returned 'poolid' is not free'd during each pass through
the loop. So even though it may not be fetched again, just free()
and reinitialize 'poolid' after usage

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_ResourceAllocationFromPool.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/Virt_ResourceAllocationFromPool.c b/src/Virt_ResourceAllocationFromPool.c
index 7088900..7bee729 100644
--- a/src/Virt_ResourceAllocationFromPool.c
+++ b/src/Virt_ResourceAllocationFromPool.c
@@ -120,9 +120,12 @@ static int filter_by_pool(struct inst_list *dest,
poolid = pool_member_of(_BROKER, CLASSNAME(op), type, rasd_id);
if ((poolid != NULL) && STREQ(poolid, _poolid))
inst_list_add(dest, inst);
- }

- free(poolid);
+ if (poolid != NULL) {
+ free(poolid);
+ poolid = NULL;
+ }
+ }

return dest->cur;
}
--
2.1.0

115
SOURCES/libvirt-cim-0.6.3-5787acc15.patch

@ -0,0 +1,115 @@ @@ -0,0 +1,115 @@
From 5787acc1531d32b13223d8804c88142ed188e753 Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Tue, 27 May 2014 16:14:10 +0800
Subject: [PATCH 59/60] Add disk device='lun' support

Besides 'disk', 'cdrom', 'floppy' and 'filesystem', there is one
more value 'lun' should be supported by value of device field in
the disk device. So this patch adds it into libvirt-cim. Now device
like <disk type='block' device='lun'> could be operated by class.

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
schema/ResourceAllocationSettingData.mof | 8 ++++----
src/Virt_RASD.c | 3 +++
src/Virt_RASD.h | 1 +
src/Virt_SettingsDefineCapabilities.c | 5 ++++-
src/Virt_VirtualSystemManagementService.c | 5 ++++-
5 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index 9c387f0..f78d423 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -10,8 +10,8 @@ class Xen_DiskResourceAllocationSettingData : Xen_ResourceAllocationSettingData
string VirtualDevice;

[Description ("Device emulation type"),
- ValueMap {"0", "1", "2"},
- Values {"Disk", "CDROM", "floppy"}]
+ ValueMap {"0", "1", "2", "4"},
+ Values {"Disk", "CDROM", "floppy", "lun"}]
uint16 EmulatedType;

[Description ("Bus type of the device")]
@@ -43,8 +43,8 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData
string VirtualDevice;

[Description ("Device emulation type"),
- ValueMap {"0", "1", "2", "3"},
- Values {"Disk", "CDROM", "floppy", "filesystem"}]
+ ValueMap {"0", "1", "2", "3", "4"},
+ Values {"Disk", "CDROM", "floppy", "filesystem", "lun"}]
uint16 EmulatedType;

[Description ("Bus type of the device")]
diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index 3c62c2d..761d053 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -444,6 +444,9 @@ static CMPIStatus set_disk_rasd_params(const CMPIBroker *broker,
else if ((dev->dev.disk.device != NULL) &&
STREQ(dev->dev.disk.device, "floppy"))
type = VIRT_DISK_TYPE_FLOPPY;
+ else if ((dev->dev.disk.device != NULL) &&
+ STREQ(dev->dev.disk.device, "lun"))
+ type = VIRT_DISK_TYPE_LUN;
else
type = VIRT_DISK_TYPE_DISK;

diff --git a/src/Virt_RASD.h b/src/Virt_RASD.h
index 400143f..49d7195 100644
--- a/src/Virt_RASD.h
+++ b/src/Virt_RASD.h
@@ -27,6 +27,7 @@
#define VIRT_DISK_TYPE_CDROM 1
#define VIRT_DISK_TYPE_FLOPPY 2
#define VIRT_DISK_TYPE_FS 3
+#define VIRT_DISK_TYPE_LUN 4

char *rasd_to_xml(CMPIInstance *rasd);

diff --git a/src/Virt_SettingsDefineCapabilities.c b/src/Virt_SettingsDefineCapabilities.c
index 756e46b..85cb27a 100644
--- a/src/Virt_SettingsDefineCapabilities.c
+++ b/src/Virt_SettingsDefineCapabilities.c
@@ -1071,9 +1071,12 @@ static CMPIStatus set_disk_props(int type,
(CMPIValue *)"FV disk", CMPI_chars);
}

- if (emu_type == VIRT_DISK_TYPE_DISK) {
+ if (emu_type == VIRT_DISK_TYPE_DISK ||
+ emu_type == VIRT_DISK_TYPE_LUN) {
CMSetProperty(inst, "VirtualQuantity",
(CMPIValue *)&disk_size, CMPI_uint64);
+ if (emu_type == VIRT_DISK_TYPE_LUN)
+ dev = "sda";
} else if (emu_type == VIRT_DISK_TYPE_CDROM) {
dev = "hdc";
} else if (emu_type == VIRT_DISK_TYPE_FLOPPY) {
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index f673c38..c640360 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1114,7 +1114,8 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
type = VIRT_DISK_TYPE_DISK;

if ((type == VIRT_DISK_TYPE_DISK) ||
- (type == VIRT_DISK_TYPE_FS)){
+ (type == VIRT_DISK_TYPE_FS) ||
+ (type == VIRT_DISK_TYPE_LUN)){
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, "
@@ -1149,6 +1150,8 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
dev->dev.disk.device = strdup("floppy");
else if (type == VIRT_DISK_TYPE_FS)
dev->dev.disk.device = strdup("filesystem");
+ else if (type == VIRT_DISK_TYPE_LUN)
+ dev->dev.disk.device = strdup("lun");
else
return "Invalid value for EmulatedType";

--
2.1.0

74
SOURCES/libvirt-cim-0.6.3-583ea685.patch

@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
From 583ea68595acd012c1a99328302fd16b6fe04caf Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:41 +0200
Subject: [PATCH 21/60] VSMS: add default console

A new function to add a default console has been added. As with
the default graphics and default input device, the default device
generation is optional and depends on the domain type and
architecture.
Initially, we only create an s390 console, which is necessary to
define a runnable guest.

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 34 +++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index d626691..d51f230 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -592,6 +592,38 @@ static bool default_graphics_device(struct domain *domain)
return true;
}

+static bool default_console_device(struct domain *domain)
+{
+ /* currently only taking care for s390 guests */
+ if ((domain->type == DOMAIN_KVM || domain->type == DOMAIN_QEMU) &&
+ domain->os_info.fv.arch != NULL &&
+ (XSTREQ(domain->os_info.fv.arch, "s390") ||
+ XSTREQ(domain->os_info.fv.arch, "s390x" ))) {
+ char * consoletype = NULL;
+ if (domain->os_info.fv.machine != NULL &&
+ XSTREQ(domain->os_info.fv.machine, "s390-ccw-virtio")) {
+ consoletype = "sclp";
+ } else {
+ consoletype = "virtio";
+ }
+ free(domain->dev_console);
+ domain->dev_console = calloc(1, sizeof(*domain->dev_console));
+ if (domain->dev_console == NULL) {
+ CU_DEBUG("Failed to allocate default console device.");
+ return false;
+ }
+ CU_DEBUG("Defining default console device for s390.");
+ domain->dev_console->type = CIM_RES_TYPE_CONSOLE;
+ domain->dev_console->dev.console.source_type =
+ CIM_CHARDEV_SOURCE_TYPE_PTY;
+ domain->dev_console->dev.console.target_type =
+ strdup(consoletype);
+ domain->dev_console_ct = 1;
+ }
+
+ return true;
+}
+
static bool default_input_device(struct domain *domain)
{
if (domain->type == DOMAIN_LXC)
@@ -628,6 +660,8 @@ static bool add_default_devs(struct domain *domain)
{
if (domain->dev_graphics_ct < 1 &&
domain->dev_console_ct < 1) {
+ if (!default_console_device(domain))
+ return false;
if (!default_graphics_device(domain))
return false;
}
--
2.1.0

236
SOURCES/libvirt-cim-0.6.3-58d6e308.patch

@ -0,0 +1,236 @@ @@ -0,0 +1,236 @@
From 58d6e30844573de15aa597ab184e5720a08528ba Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Thu, 27 Mar 2014 16:39:47 -0400
Subject: [PATCH 57/60] Add code and associations for ControllerPool

Add the code and make adjustments to have ControllerPool support

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_DevicePool.c | 55 +++++++++++++++++++++++-
src/Virt_ElementAllocatedFromPool.c | 2 +
src/Virt_ElementCapabilities.c | 4 +-
src/Virt_HostedResourcePool.c | 3 +-
src/Virt_ResourceAllocationFromPool.c | 2 +
src/Virt_ResourcePoolConfigurationCapabilities.c | 2 +-
src/Virt_ResourcePoolConfigurationService.c | 2 +
7 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/src/Virt_DevicePool.c b/src/Virt_DevicePool.c
index aae7ed4..6c61b64 100644
--- a/src/Virt_DevicePool.c
+++ b/src/Virt_DevicePool.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -797,6 +797,8 @@ char *pool_member_of(const CMPIBroker *broker,
poolid = strdup("GraphicsPool/0");
else if (type == CIM_RES_TYPE_INPUT)
poolid = strdup("InputPool/0");
+ else if (type == CIM_RES_TYPE_CONTROLLER)
+ poolid = strdup("ControllerPool/0");
else
return NULL;

@@ -817,6 +819,8 @@ uint16_t res_type_from_pool_classname(const char *classname)
return CIM_RES_TYPE_GRAPHICS;
else if (strstr(classname, "InputPool"))
return CIM_RES_TYPE_INPUT;
+ else if (strstr(classname, "ControllerPool"))
+ return CIM_RES_TYPE_CONTROLLER;
else
return CIM_RES_TYPE_UNKNOWN;
}
@@ -835,6 +839,8 @@ uint16_t res_type_from_pool_id(const char *id)
return CIM_RES_TYPE_GRAPHICS;
else if (strstr(id, "InputPool"))
return CIM_RES_TYPE_INPUT;
+ else if (strstr(id, "ControllerPool"))
+ return CIM_RES_TYPE_CONTROLLER;
else
return CIM_RES_TYPE_UNKNOWN;
}
@@ -1502,6 +1508,43 @@ static CMPIStatus inputpool_instance(virConnectPtr conn,
return s;
}

+static CMPIStatus controllerpool_instance(virConnectPtr conn,
+ struct inst_list *list,
+ const char *ns,
+ const char *_id,
+ const CMPIBroker *broker)
+{
+ const char *id = "ControllerPool/0";
+ CMPIInstance *inst;
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+
+ if ((_id != NULL) && (!STREQC(_id, "0"))) {
+ cu_statusf(broker, &s,
+ CMPI_RC_ERR_FAILED,
+ "No such controller pool `%s'", id);
+ return s;
+ }
+
+ inst = get_typed_instance(broker,
+ pfx_from_conn(conn),
+ "ControllerPool",
+ ns,
+ false);
+ if (inst == NULL) {
+ cu_statusf(broker, &s,
+ CMPI_RC_ERR_FAILED,
+ "Failed to get instance of %s_ControllerPool",
+ pfx_from_conn(conn));
+ return s;
+ }
+
+ set_params(inst, CIM_RES_TYPE_CONTROLLER, id, NULL, NULL, true);
+
+ inst_list_add(list, inst);
+
+ return s;
+}
+
static CMPIStatus _get_pools(const CMPIBroker *broker,
const CMPIObjectPath *reference,
const uint16_t type,
@@ -1563,6 +1606,14 @@ static CMPIStatus _get_pools(const CMPIBroker *broker,
id,
broker);

+ if ((type == CIM_RES_TYPE_CONTROLLER) ||
+ (type == CIM_RES_TYPE_ALL))
+ s = controllerpool_instance(conn,
+ list,
+ NAMESPACE(reference),
+ id,
+ broker);
+
if (type == CIM_RES_TYPE_UNKNOWN)
cu_statusf(broker, &s,
CMPI_RC_ERR_NOT_FOUND,
@@ -1712,6 +1763,8 @@ CMPIInstance *parent_device_pool(const CMPIBroker *broker,
id = "GraphicsPool/0";
} else if (type == CIM_RES_TYPE_INPUT) {
id = "InputPool/0";
+ } else if (type == CIM_RES_TYPE_CONTROLLER) {
+ id = "ControllerPool/0";
} else {
cu_statusf(broker, s,
CMPI_RC_ERR_INVALID_PARAMETER,
diff --git a/src/Virt_ElementAllocatedFromPool.c b/src/Virt_ElementAllocatedFromPool.c
index 262c9b9..a5fef12 100644
--- a/src/Virt_ElementAllocatedFromPool.c
+++ b/src/Virt_ElementAllocatedFromPool.c
@@ -253,6 +253,7 @@ static char* pool[] = {
"KVM_DiskPool",
"KVM_GraphicsPool",
"KVM_InputPool",
+ "KVM_ControllerPool",
"LXC_ProcessorPool",
"LXC_MemoryPool",
"LXC_NetworkPool",
@@ -317,6 +318,7 @@ static char* device_or_pool[] = {
"KVM_DiskPool",
"KVM_GraphicsPool",
"KVM_InputPool",
+ "KVM_ControllerPool",
"LXC_ProcessorPool",
"LXC_MemoryPool",
"LXC_NetworkPool",
diff --git a/src/Virt_ElementCapabilities.c b/src/Virt_ElementCapabilities.c
index 77aad9a..0cb3e1e 100644
--- a/src/Virt_ElementCapabilities.c
+++ b/src/Virt_ElementCapabilities.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -416,6 +416,7 @@ static char* host_sys_and_service_and_rp[] = {
"KVM_DiskPool",
"KVM_GraphicsPool",
"KVM_InputPool",
+ "KVM_ControllerPool",
"LXC_ProcessorPool",
"LXC_MemoryPool",
"LXC_NetworkPool",
@@ -553,6 +554,7 @@ static char* resource_pool[] = {
"KVM_DiskPool",
"KVM_GraphicsPool",
"KVM_InputPool",
+ "KVM_ControllerPool",
"LXC_ProcessorPool",
"LXC_MemoryPool",
"LXC_NetworkPool",
diff --git a/src/Virt_HostedResourcePool.c b/src/Virt_HostedResourcePool.c
index 0863853..e0459c5 100644
--- a/src/Virt_HostedResourcePool.c
+++ b/src/Virt_HostedResourcePool.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -113,6 +113,7 @@ static char* part_component[] = {
"KVM_DiskPool",
"KVM_GraphicsPool",
"KVM_InputPool",
+ "KVM_ControllerPool",
"LXC_ProcessorPool",
"LXC_MemoryPool",
"LXC_NetworkPool",
diff --git a/src/Virt_ResourceAllocationFromPool.c b/src/Virt_ResourceAllocationFromPool.c
index 7bee729..98bd24e 100644
--- a/src/Virt_ResourceAllocationFromPool.c
+++ b/src/Virt_ResourceAllocationFromPool.c
@@ -194,6 +194,7 @@ static char* antecedent[] = {
"KVM_DiskPool",
"KVM_GraphicsPool",
"KVM_InputPool",
+ "KVM_ControllerPool",
"LXC_ProcessorPool",
"LXC_MemoryPool",
"LXC_NetworkPool",
@@ -216,6 +217,7 @@ static char* dependent[] = {
"KVM_ProcResourceAllocationSettingData",
"KVM_GraphicsResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
+ "KVM_ControllerResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
diff --git a/src/Virt_ResourcePoolConfigurationCapabilities.c b/src/Virt_ResourcePoolConfigurationCapabilities.c
index 63045bf..28a5de2 100644
--- a/src/Virt_ResourcePoolConfigurationCapabilities.c
+++ b/src/Virt_ResourcePoolConfigurationCapabilities.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
diff --git a/src/Virt_ResourcePoolConfigurationService.c b/src/Virt_ResourcePoolConfigurationService.c
index 02de834..ab83beb 100644
--- a/src/Virt_ResourcePoolConfigurationService.c
+++ b/src/Virt_ResourcePoolConfigurationService.c
@@ -431,6 +431,8 @@ static char *get_pool_id(int res_type,
pool = "GraphicsPool";
else if (res_type == CIM_RES_TYPE_INPUT)
pool = "InputPool";
+ else if (res_type == CIM_RES_TYPE_CONTROLLER)
+ pool = "ControllerPool";
else
pool = "Unknown";

--
2.1.0

73
SOURCES/libvirt-cim-0.6.3-5940d2c8.patch

@ -0,0 +1,73 @@ @@ -0,0 +1,73 @@
From 5940d2c8abdf8872b779319fc1f85f066e37c2de Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 14 Oct 2013 17:29:40 +0200
Subject: [PATCH 25/60] RASD/schema: Add properties for device address
representation

Certain device types are only identifiable uniquely via a device
address from the guest's perspective. Adding or removing devices
has the potential to change the address of other unrelated devices
and impact the guest's operation. Therefore it is less desirable
to rely on implicit device address allocation but rather to use
persistent device addresses.

Depending on the device's bus type (PCI, SCSI, USB, CCW ...) the
address specification format can vary, see also the libvirt
domain XML documentation. To account for the various formats
device addresses are specified with two array properties in the
respective RASD classes: AddressProperties and AddressValues.
The former contains a list of address property names and the latter
the values.

E.g., a PCI address is specified by the properties domain, bus,
slot and function. Therefore, for a PCI device RASD we could
have:

AddressProperties = ['type', 'domain','bus', 'slot', 'function']
AddressValues = ['pci', '0x0000', '0x00', '0x01', '0x2']

resulting in a libvirt address element:

<address type='pci' domain='0x0000' bus='0x00' slot='0x01'
function='0x2'/>

Initially, we support only disk and network devices for KVM guests.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
schema/ResourceAllocationSettingData.mof | 12 ++++++++++++
1 file changed, 12 insertions(+)

diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index ebc4806..bf1fbb6 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -67,6 +67,12 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData

[Description ("if device is shareable")]
boolean shareable;
+
+ [Description ("Device address property names")]
+ string AddressProperties[];
+
+ [Description ("Device address property values")]
+ string AddressValues[];
};

[Description ("LXC virtual disk configuration"),
@@ -167,6 +173,12 @@ class KVM_NetResourceAllocationSettingData : KVM_ResourceAllocationSettingData

[Description ("Filter REF")]
string FilterRef;
+
+ [Description ("Device address property names")]
+ string AddressProperties[];
+
+ [Description ("Device address property values")]
+ string AddressValues[];
};

[Description ("LXC virtual network configuration"),
--
2.1.0

38
SOURCES/libvirt-cim-0.6.3-5d2626f6.patch

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
From 5d2626f6e743e76b18272ec5e6bf4ee7e46cfee4 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Thu, 8 Aug 2013 15:50:29 -0400
Subject: [PATCH 07/48] spec: Fix capitalization for version check

Following seen on rpm -ivh install:

Preparing... ################################# [100%]
Updating / installing...
1:libvirt-cim-0.6.3-1.fc19 ################################# [100%]
/var/tmp/rpm-tmp.uY5oGu: line 5: /etc/init.d/tog-pegasus: No such file or directory

Turns out commit id '8480cc79' inadvertently capitalized Fedora when replacing
a check that got removed by commit id '07adabc2'.

"Fedora" shouldn't have been capitalized in the check to use
systemctl instead of /etc/init.d/tog-pegasus

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index 98f2a75..459650c 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -96,7 +96,7 @@ rm -fr $RPM_BUILD_ROOT

%{_datadir}/%{name}/install_base_schema.sh %{_datadir}/%{name}

-%if 0%{?Fedora} >= 17 || 0%{?rhel} >= 7
+%if 0%{?fedora} >= 17 || 0%{?rhel} >= 7
if [ "`systemctl is-active tog-pegasus.service`" = "active" ]
then
systemctl restart tog-pegasus.service
--
1.8.5.3

169
SOURCES/libvirt-cim-0.6.3-6024403e.patch

@ -0,0 +1,169 @@ @@ -0,0 +1,169 @@
From 6024403e02643db81555e3333463b2f0e1b206b5 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Thu, 29 Aug 2013 17:18:50 +0200
Subject: [PATCH 09/48] VSSD: Add properties for arch and machine

For architectures like s390 the machine type is relevant for
the proper guest construction. We add the necessary properties
to the schema and the C structures and the necessary code
for CIM-to-libvirt mapping.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 12 ++++++++++++
libxkutil/device_parsing.h | 2 ++
libxkutil/xmlgen.c | 6 ++++++
schema/VSSD.mof | 6 ++++++
src/Virt_VSSD.c | 9 +++++++++
src/Virt_VirtualSystemManagementService.c | 14 ++++++++++++++
6 files changed, 49 insertions(+)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index ad0f19c..7af3953 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -1116,6 +1116,8 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
xmlNode *child;
char **blist = NULL;
unsigned bl_size = 0;
+ char *arch = NULL;
+ char *machine = NULL;
char *kernel = NULL;
char *initrd = NULL;
char *cmdline = NULL;
@@ -1126,6 +1128,8 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
for (child = os->children; child != NULL; child = child->next) {
if (XSTREQ(child->name, "type")) {
STRPROP(dominfo, os_info.pv.type, child);
+ arch = get_attr_value(child, "arch");
+ machine = get_attr_value(child, "machine");
} else if (XSTREQ(child->name, "kernel"))
kernel = get_node_content(child);
else if (XSTREQ(child->name, "initrd"))
@@ -1173,9 +1177,13 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
case DOMAIN_KVM:
case DOMAIN_QEMU:
dominfo->os_info.fv.loader = loader;
+ dominfo->os_info.fv.arch = arch;
+ dominfo->os_info.fv.machine = machine;
dominfo->os_info.fv.bootlist_ct = bl_size;
dominfo->os_info.fv.bootlist = blist;
loader = NULL;
+ arch = NULL;
+ machine = NULL;
blist = NULL;
bl_size = 0;
break;
@@ -1195,6 +1203,8 @@ static int parse_os(struct domain *dominfo, xmlNode *os)
break;
}

+ free(arch);
+ free(machine);
free(kernel);
free(initrd);
free(cmdline);
@@ -1398,6 +1408,8 @@ void cleanup_dominfo(struct domain **dominfo)
(dom->type == DOMAIN_KVM) || (dom->type == DOMAIN_QEMU)) {
free(dom->os_info.fv.type);
free(dom->os_info.fv.loader);
+ free(dom->os_info.fv.arch);
+ free(dom->os_info.fv.machine);
cleanup_bootlist(dom->os_info.fv.bootlist,
dom->os_info.fv.bootlist_ct);
} else if (dom->type == DOMAIN_LXC) {
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 979b792..df5080c 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -139,6 +139,8 @@ struct pv_os_info {

struct fv_os_info {
char *type; /* Should always be 'hvm' */
+ char *arch;
+ char *machine;
char *loader;
unsigned bootlist_ct;
char **bootlist;
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 30e9a5e..2ca2341 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -811,6 +811,12 @@ static char *_kvm_os_xml(xmlNodePtr root, struct domain *domain)
if (tmp == NULL)
return XML_ERROR;

+ if (os->arch)
+ xmlNewProp(tmp, BAD_CAST "arch", BAD_CAST os->arch);
+
+ if (os->machine)
+ xmlNewProp(tmp, BAD_CAST "machine", BAD_CAST os->machine);
+
ret = _fv_bootlist_xml(root, os);
if (ret == 0)
return XML_ERROR;
diff --git a/schema/VSSD.mof b/schema/VSSD.mof
index 0359d67..2734d8e 100644
--- a/schema/VSSD.mof
+++ b/schema/VSSD.mof
@@ -48,6 +48,12 @@ class KVM_VirtualSystemSettingData : Virt_VirtualSystemSettingData
[Description ("The emulator the guest should use during runtime.")]
string Emulator;

+ [Description ("The guest's architecture.")]
+ string Arch;
+
+ [Description ("The guest's machine type")]
+ string Machine;
+
};

[Description (
diff --git a/src/Virt_VSSD.c b/src/Virt_VSSD.c
index 3363b38..67e56aa 100644
--- a/src/Virt_VSSD.c
+++ b/src/Virt_VSSD.c
@@ -121,6 +121,15 @@ static CMPIStatus _set_fv_prop(const CMPIBroker *broker,
goto out;
}

+ if (dominfo->os_info.fv.arch != NULL)
+ CMSetProperty(inst, "Arch",
+ (CMPIValue *)dominfo->os_info.fv.arch,
+ CMPI_chars);
+
+ if (dominfo->os_info.fv.machine != NULL)
+ CMSetProperty(inst, "Machine",
+ (CMPIValue *)dominfo->os_info.fv.machine,
+ CMPI_chars);
out:
return s;
}
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 8ced2d6..3df878f 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -543,6 +543,20 @@ static int fv_vssd_to_domain(CMPIInstance *inst,
if (!fv_set_emulator(domain, val))
return 0;

+ free(domain->os_info.fv.arch);
+ ret = cu_get_str_prop(inst, "Arch", &val);
+ if (ret == CMPI_RC_OK)
+ domain->os_info.fv.arch = strdup(val);
+ else
+ domain->os_info.fv.arch = NULL;
+
+ free(domain->os_info.fv.machine);
+ ret = cu_get_str_prop(inst, "Machine", &val);
+ if (ret == CMPI_RC_OK)
+ domain->os_info.fv.machine = strdup(val);
+ else
+ domain->os_info.fv.machine = NULL;
+
return 1;
}

--
1.8.5.3

29
SOURCES/libvirt-cim-0.6.3-605090b6.patch

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
From 605090b6a0a025afa3b1c1588c33fca68a30fa17 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Fri, 6 Sep 2013 14:09:56 +0200
Subject: [PATCH 14/60] xml_parse_test: Call cleanup_dominfo before exiting

This avoids misleading valgrind output running xml_parse_test.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/xml_parse_test.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/libxkutil/xml_parse_test.c b/libxkutil/xml_parse_test.c
index af5e508..374bcf6 100644
--- a/libxkutil/xml_parse_test.c
+++ b/libxkutil/xml_parse_test.c
@@ -521,6 +521,8 @@ int main(int argc, char **argv)
return 4;
}

+ cleanup_dominfo(&dominfo);
+
return 0;
}

--
2.1.0

99
SOURCES/libvirt-cim-0.6.3-63acad05.patch

@ -0,0 +1,99 @@ @@ -0,0 +1,99 @@
From 63acad058adca7ae2fa7edd57eb0c1e84998a783 Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
Date: Tue, 28 Apr 2015 13:56:00 +0200
Subject: [PATCH] list_util.h: Drop inline modifiers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

There's no need to mark a function as inline in the function
declaration. In fact, it causes a compilation error:

CC xmlgen.lo
In file included from acl_parsing.h:29:0,
from xmlgen.h:26,
from capability_parsing.c:37:
list_util.h:67:21: error: inline function ‘list_node_prev_node’ declared but never defined [-Werror]
inline list_node_t *list_node_prev_node(list_node_t *node);
^
list_util.h:66:14: error: inline function ‘list_node_prev’ declared but never defined [-Werror]
inline void *list_node_prev(list_node_t *node);
^
list_util.h:64:21: error: inline function ‘list_node_next_node’ declared but never defined [-Werror]
inline list_node_t *list_node_next_node(list_node_t *node);
^
list_util.h:63:14: error: inline function ‘list_node_next’ declared but never defined [-Werror]
inline void *list_node_next(list_node_t *node);
^
list_util.h:61:21: error: inline function ‘list_last_node’ declared but never defined [-Werror]
inline list_node_t *list_last_node(list_t *list);
^
list_util.h:60:14: error: inline function ‘list_last’ declared but never defined [-Werror]
inline void *list_last(list_t *list);
^
list_util.h:58:21: error: inline function ‘list_first_node’ declared but never defined [-Werror]
inline list_node_t *list_first_node(list_t *list);
^
list_util.h:57:14: error: inline function ‘list_first’ declared but never defined [-Werror]
inline void *list_first(list_t *list);
^
list_util.h:55:13: error: inline function ‘list_node_data_set’ declared but never defined [-Werror]
inline void list_node_data_set(list_node_t *node, void *data);
^
list_util.h:54:14: error: inline function ‘list_node_data_get’ declared but never defined [-Werror]
inline void *list_node_data_get(list_node_t *node);
^
list_util.h:52:21: error: inline function ‘list_count’ declared but never defined [-Werror]
inline unsigned int list_count(list_t *list);
^
cc1: all warnings being treated as errors
Makefile:499: recipe for target 'capability_parsing.lo' failed
make[2]: *** [capability_parsing.lo] Error 1
make[2]: *** Waiting for unfinished jobs....

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/list_util.h | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/libxkutil/list_util.h b/libxkutil/list_util.h
index 6510272..6582dfe 100644
--- a/libxkutil/list_util.h
+++ b/libxkutil/list_util.h
@@ -49,22 +49,22 @@ void list_remove_node(list_t *list, list_node_t *node);

bool list_foreach(list_t *list, list_foreach_cb cb, void *user_data);

-inline unsigned int list_count(list_t *list);
+unsigned int list_count(list_t *list);

-inline void *list_node_data_get(list_node_t *node);
-inline void list_node_data_set(list_node_t *node, void *data);
+void *list_node_data_get(list_node_t *node);
+void list_node_data_set(list_node_t *node, void *data);

-inline void *list_first(list_t *list);
-inline list_node_t *list_first_node(list_t *list);
+void *list_first(list_t *list);
+list_node_t *list_first_node(list_t *list);

-inline void *list_last(list_t *list);
-inline list_node_t *list_last_node(list_t *list);
+void *list_last(list_t *list);
+list_node_t *list_last_node(list_t *list);

-inline void *list_node_next(list_node_t *node);
-inline list_node_t *list_node_next_node(list_node_t *node);
+void *list_node_next(list_node_t *node);
+list_node_t *list_node_next_node(list_node_t *node);

-inline void *list_node_prev(list_node_t *node);
-inline list_node_t *list_node_prev_node(list_node_t *node);
+void *list_node_prev(list_node_t *node);
+list_node_t *list_node_prev_node(list_node_t *node);

#ifdef __cplusplus
} /* extern "C" */
--
2.1.0

32
SOURCES/libvirt-cim-0.6.3-6a13c463.patch

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
From 6a13c463d1599a513ad861c4d814ca836650f88e Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Wed, 20 Nov 2013 19:43:17 +0100
Subject: [PATCH 38/60] libxkutil: Added missing address element for filesystem
'disk'

This was an omission from the original patch series adding
device address support. For disks of type filesystem the addresses
were parsed however not written back.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/xmlgen.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 40e2905..931f0c9 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -342,6 +342,9 @@ static const char *disk_fs_xml(xmlNodePtr root, struct disk_device *dev)
return XML_ERROR;
xmlNewProp(tmp, BAD_CAST "dir", BAD_CAST dev->virtual_dev);

+ if (dev->address.ct > 0)
+ return device_address_xml(fs, &dev->address);
+
return NULL;
}

--
2.1.0

102
SOURCES/libvirt-cim-0.6.3-6bc7bfdf.patch

@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
From 6bc7bfdf7a162b0812bfe8e6f73e5fde3925e001 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 14 Oct 2013 17:29:43 +0200
Subject: [PATCH 28/60] VSMS: Support for device addresses

This allows to define KVM guests with persistent device addresses
for disks and network interfaces.
The new function rasd_to_device_address extracts the address
properties from the disk or network RASD and fills the
device_address sub-structure of the affected virt_device.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 51 ++++++++++++++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index d51f230..b813be6 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -890,6 +890,50 @@ static const char *_net_rand_mac(const CMPIObjectPath *ref)
return _mac;
}

+static const char *rasd_to_device_address(CMPIInstance *inst,
+ struct device_address *addr)
+{
+ CMPICount c1;
+ CMPICount c2;
+ CMPIArray *arr_keys;
+ CMPIArray *arr_values;
+ CMPIData data_key;
+ CMPIData data_value;
+ const char *str_key;
+ const char *str_value;
+ int i;
+ const char * msg = NULL;
+
+ if (cu_get_array_prop(inst, "AddressProperties", &arr_keys) != CMPI_RC_OK ||
+ cu_get_array_prop(inst, "AddressValues", &arr_values) != CMPI_RC_OK)
+ goto out;
+
+ c1 = CMGetArrayCount(arr_keys, NULL);
+ c2 = CMGetArrayCount(arr_values, NULL);
+
+ if (c1 != c2) {
+ msg = "AddressProperties not matching AddressValues";
+ goto out;
+ }
+
+ for (i = 0; i < c1; i++) {
+ data_key = CMGetArrayElementAt(arr_keys, i, NULL);
+ data_value = CMGetArrayElementAt(arr_values, i, NULL);
+
+ if (!CMIsNullValue(data_key) && !CMIsNullValue(data_key)) {
+ str_key = CMGetCharPtr(data_key.value.string);
+ str_value = CMGetCharPtr(data_value.value.string);
+ if (!add_device_address_property(addr, str_key, str_value)) {
+ msg = "Could not set address properties in vdev";
+ goto out;
+ }
+ }
+ }
+
+ out:
+ return msg;
+}
+
static const char *net_rasd_to_vdev(CMPIInstance *inst,
struct virt_device *dev,
const char *ns)
@@ -1040,6 +1084,8 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
&dev->dev.net.limit) != CMPI_RC_OK)
dev->dev.net.limit = 0;

+ msg = rasd_to_device_address(inst, &dev->dev.net.address);
+
out:
free(network);
return msg;
@@ -1050,6 +1096,7 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
char **p_error)
{
const char *val = NULL;
+ const char *msg = NULL;
uint16_t type;
bool read = false;
int rc;
@@ -1161,7 +1208,9 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
free(dev->id);
dev->id = strdup(dev->dev.disk.virtual_dev);

- return NULL;
+ msg = rasd_to_device_address(inst, &dev->dev.disk.address);
+
+ return msg;
}

static const char *lxc_disk_rasd_to_vdev(CMPIInstance *inst,
--
2.1.0

34
SOURCES/libvirt-cim-0.6.3-6f050582.patch

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
From 6f050582eb9baad3fc7e3f57b9b4c6c17035afba Mon Sep 17 00:00:00 2001
From: Daniel Hansel <daniel.hansel@linux.vnet.ibm.com>
Date: Tue, 12 Nov 2013 17:28:42 +0100
Subject: [PATCH 30/60] libvirt-cim: Changed resource type value EMU

To avoid conflicts with CIM resource type OTHER the value of the
resource type EMU is changed.

Signed-off-by: Daniel Hansel <daniel.hansel@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/svpc_types.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/svpc_types.h b/src/svpc_types.h
index 0f46a86..404e428 100644
--- a/src/svpc_types.h
+++ b/src/svpc_types.h
@@ -30,12 +30,12 @@
#define CIM_RES_TYPE_MEM 4
#define CIM_RES_TYPE_NET 10
#define CIM_RES_TYPE_DISK 17
-#define CIM_RES_TYPE_EMU 1
#define CIM_RES_TYPE_GRAPHICS 24
#define CIM_RES_TYPE_INPUT 13
#define CIM_RES_TYPE_UNKNOWN 1000
#define CIM_RES_TYPE_IMAGE 32768
#define CIM_RES_TYPE_CONSOLE 32769
+#define CIM_RES_TYPE_EMU 32770

#define CIM_RES_TYPE_COUNT 7
const static int cim_res_types[CIM_RES_TYPE_COUNT] =
--
2.1.0

71
SOURCES/libvirt-cim-0.6.3-7e164fbd.patch

@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
From 7e164fbdac05e955fe21c5bacc4aeee171821fd5 Mon Sep 17 00:00:00 2001
From: Michal Privoznik <mprivozn@redhat.com>
Date: Tue, 6 Aug 2013 14:41:33 +0200
Subject: [PATCH 02/48] get_dominfo: Use VIR_DOMAIN_XML_SECURE more wisely

Currently, even if we are connected RO to the libvirtd, we try to dump
domain XML with secure information (VIR_DOMAIN_XML_SECURE flag). This
is, however, forbidden in libvirt. With RO connection, we should not use
the SECURE flag at all.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 9 +++++++--
libxkutil/misc_util.c | 2 +-
libxkutil/misc_util.h | 1 +
3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 7900e06..ffdf682 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -31,6 +31,7 @@
#include <libcmpiutil/libcmpiutil.h>

#include "device_parsing.h"
+#include "misc_util.h"
#include "xmlgen.h"
#include "../src/svpc_types.h"

@@ -1283,8 +1284,12 @@ int get_dominfo(virDomainPtr dom, struct domain **dominfo)
char *xml;
int ret = 0;
int start;
- xml = virDomainGetXMLDesc(dom,
- VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE);
+ int flags = VIR_DOMAIN_XML_INACTIVE;
+
+ if (!is_read_only())
+ flags |= VIR_DOMAIN_XML_SECURE;
+
+ xml = virDomainGetXMLDesc(dom, flags);

if (xml == NULL) {
CU_DEBUG("Failed to get dom xml with libvirt API.");
diff --git a/libxkutil/misc_util.c b/libxkutil/misc_util.c
index 9e7e0d5..2164dd0 100644
--- a/libxkutil/misc_util.c
+++ b/libxkutil/misc_util.c
@@ -219,7 +219,7 @@ static int libvirt_cim_config_get(LibvirtcimConfigProperty *prop)
}
#endif

-static int is_read_only(void)
+int is_read_only(void)
{
static LibvirtcimConfigProperty prop = {
"readonly", CONFIG_BOOL, {0}, 0};
diff --git a/libxkutil/misc_util.h b/libxkutil/misc_util.h
index fd4f191..056c327 100644
--- a/libxkutil/misc_util.h
+++ b/libxkutil/misc_util.h
@@ -153,6 +153,7 @@ int virt_set_status(const CMPIBroker *broker,
#define REF2STR(r) CMGetCharPtr(CMObjectPathToString(r, NULL))

/* get libvirt-cim config */
+int is_read_only(void);
const char *get_mig_ssh_tmp_key(void);
bool get_disable_kvm(void);
const char *get_lldptool_query_options(void);
--
1.8.5.3

51
SOURCES/libvirt-cim-0.6.3-7e5f561c.patch

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
From 7e5f561c35a58a35225fccd6ecd418f2715e2a1a Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Fri, 11 Oct 2013 13:47:32 +0200
Subject: [PATCH 34/60] VSDC: Fix endianess issues

SetProperty was called with int instead of uint16_t in a few places.
This leads to failures on big-endian systems like s390. Found
by running cimtest.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_SettingsDefineCapabilities.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/Virt_SettingsDefineCapabilities.c b/src/Virt_SettingsDefineCapabilities.c
index 78c128c..fe16e3f 100644
--- a/src/Virt_SettingsDefineCapabilities.c
+++ b/src/Virt_SettingsDefineCapabilities.c
@@ -1349,7 +1349,7 @@ static CMPIStatus _new_volume_template(const CMPIObjectPath *ref,
int ret = 0;
struct virt_pool *pool = NULL;
CMPIInstance *inst = NULL;
- int type = 0;
+ uint16_t type = 0;
const char *name;
const char *path;
uint16_t alloc = 0;
@@ -1712,13 +1712,13 @@ static CMPIStatus disk_pool_template(const CMPIObjectPath *ref,
CMPIArray *array;
CMPIStatus s = {CMPI_RC_OK, NULL};
const char *path = "/dev/null";
- int type[7] = {DISK_POOL_DIR,
- DISK_POOL_FS,
- DISK_POOL_NETFS,
- DISK_POOL_DISK,
- DISK_POOL_ISCSI,
- DISK_POOL_LOGICAL,
- DISK_POOL_SCSI};
+ uint16_t type[7] = {DISK_POOL_DIR,
+ DISK_POOL_FS,
+ DISK_POOL_NETFS,
+ DISK_POOL_DISK,
+ DISK_POOL_ISCSI,
+ DISK_POOL_LOGICAL,
+ DISK_POOL_SCSI};
int pool_types = 7;
int i;
uint16_t autostart;
--
2.1.0

141
SOURCES/libvirt-cim-0.6.3-7f3288be.patch

@ -0,0 +1,141 @@ @@ -0,0 +1,141 @@
From 7f3288be65c532f219389d8258b4940bb1e9cc5c Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Tue, 21 Jan 2014 19:41:42 -0500
Subject: [PATCH 41/60] libxkutil:pool_parsing: Coverity cleanups

A new version of Coverity found a number of issues:

get_pool_from_xml(): FORWARD_NULL
parse_disk_pool(): RESOURCE_LEAK
- If parse_disk_pool() returned name == NULL, then the strdup() of
name into pool->id would dereference the NULL pointer leading to
a segfault.

Furthermore parse_disk_pool() had a few issues. First the 'type_str'
could be NULL, so that needs to be checked. Second, 'type_str' was
never free()'d (the get_attr_value returns a strdup()'d value).

Realizing all that resulted in a few extra changes to not strdup()
a value that we strdup()'d

Eventually get_pool_from_xml() will return to get_disk_pool() which
returns to diskpool_set_capacity() or _new_volume_template() which
both error out when return value != 0 (although, I did change the
latter to be more explicit and match the former).

Finally, even though the parsing of the element will only ever have
one "name" value - Coverity doesn't know that, so as a benign fix be
sure to not overwrite 'name' if "name" isn't already set.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/pool_parsing.c | 39 ++++++++++++++++++-----------------
src/Virt_SettingsDefineCapabilities.c | 2 +-
2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/libxkutil/pool_parsing.c b/libxkutil/pool_parsing.c
index 922ff32..80bd4ca 100644
--- a/libxkutil/pool_parsing.c
+++ b/libxkutil/pool_parsing.c
@@ -194,15 +194,17 @@ char *get_disk_pool_type(uint16_t type)

}

-static const char *parse_disk_pool(xmlNodeSet *nsv, struct disk_pool *pool)
+static char *parse_disk_pool(xmlNodeSet *nsv, struct disk_pool *pool)
{
xmlNode **nodes = nsv->nodeTab;
xmlNode *child;
- const char *type_str = NULL;
- const char *name = NULL;
+ char *type_str = NULL;
+ char *name = NULL;
int type = 0;

type_str = get_attr_value(nodes[0], "type");
+ if (type_str == NULL)
+ return NULL;

if (STREQC(type_str, "dir"))
type = DISK_POOL_DIR;
@@ -220,12 +222,15 @@ static const char *parse_disk_pool(xmlNodeSet *nsv, struct disk_pool *pool)
type = DISK_POOL_SCSI;
else
type = DISK_POOL_UNKNOWN;
+ free(type_str);

pool->pool_type = type;
-
+
for (child = nodes[0]->children; child != NULL; child = child->next) {
- if (XSTREQ(child->name, "name")) {
+ if (XSTREQ(child->name, "name") && name == NULL) {
name = get_node_content(child);
+ if (name == NULL)
+ return NULL;
} else if (XSTREQ(child->name, "target"))
parse_disk_target(child, pool);
else if (XSTREQ(child->name, "source"))
@@ -238,14 +243,18 @@ static const char *parse_disk_pool(xmlNodeSet *nsv, struct disk_pool *pool)
int get_pool_from_xml(const char *xml, struct virt_pool *pool, int type)
{
int len;
- int ret = 0;
+ int ret = 1;
xmlDoc *xmldoc;
xmlXPathContext *xpathctx;
xmlXPathObject *xpathobj;
const xmlChar *xpathstr = (xmlChar *)"/pool";
- const char *name;

CU_DEBUG("Pool XML : %s", xml);
+
+ /* FIXME: Add support for parsing network pools */
+ if (type == CIM_RES_TYPE_NET)
+ return 0;
+
len = strlen(xml) + 1;

if ((xmldoc = xmlParseMemory(xml, len)) == NULL)
@@ -257,22 +266,14 @@ int get_pool_from_xml(const char *xml, struct virt_pool *pool, int type)
if ((xpathobj = xmlXPathEvalExpression(xpathstr, xpathctx)) == NULL)
goto err3;

- /* FIXME: Add support for parsing network pools */
- if (type == CIM_RES_TYPE_NET) {
- ret = 0;
- goto err1;
- }
-
memset(pool, 0, sizeof(*pool));

- pool->type = CIM_RES_TYPE_DISK;
- name = parse_disk_pool(xpathobj->nodesetval,
- &(pool)->pool_info.disk);
- if (name == NULL)
+ pool->type = CIM_RES_TYPE_DISK;
+ pool->id = parse_disk_pool(xpathobj->nodesetval,
+ &(pool)->pool_info.disk);
+ if (pool->id != NULL)
ret = 0;

- pool->id = strdup(name);
-
xmlXPathFreeObject(xpathobj);
err3:
xmlXPathFreeContext(xpathctx);
diff --git a/src/Virt_SettingsDefineCapabilities.c b/src/Virt_SettingsDefineCapabilities.c
index fe16e3f..756e46b 100644
--- a/src/Virt_SettingsDefineCapabilities.c
+++ b/src/Virt_SettingsDefineCapabilities.c
@@ -1376,7 +1376,7 @@ static CMPIStatus _new_volume_template(const CMPIObjectPath *ref,
}

ret = get_disk_pool(poolptr, &pool);
- if (ret == 1) {
+ if (ret != 0) {
virt_set_status(_BROKER, &s,
CMPI_RC_ERR_FAILED,
virStoragePoolGetConnect(poolptr),
--
2.1.0

516
SOURCES/libvirt-cim-0.6.3-8a060e0d.patch

@ -0,0 +1,516 @@ @@ -0,0 +1,516 @@
From 8a060e0d178fd88c78fa2aad147492b4949ff63b Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:38 +0200
Subject: [PATCH 18/60] RASD: Schema and Provider Support for Console RASDs

Representing console devices was very limited with the previous
approach using a special graphical display. For instance it
was not possible to define different target types (serial, virtio,
sclp) nor to exploit all source types (pty, file, tcp, ...)
available in libvirt.

With the following new RASD classes it is possible to define
real console resources:
KVM_ConsoleResouceAllocationSettingData
Xen_ConsoleResouceAllocationSettingData
LXC_ConsoleResouceAllocationSettingData

The ResourceType of the returned instances is is '1' (Other) and the
OtherResourceType is 'console'.

Implemented CIM operations:
enumerate instances
enumerate instance names
get instance

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
schema/ResourceAllocationSettingData.mof | 246 +++++++++++++++++++++-
schema/ResourceAllocationSettingData.registration | 5 +-
src/Virt_RASD.c | 149 ++++++++++++-
3 files changed, 397 insertions(+), 3 deletions(-)

diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index 871ab04..ebc4806 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -1,4 +1,4 @@
-// Copyright IBM Corp. 2007
+// Copyright IBM Corp. 2007, 2013

[Description ("Xen virtual disk configuration"),
Provider("cmpi::Virt_RASD")
@@ -445,3 +445,247 @@ class KVM_StorageVolumeResourceAllocationSettingData : KVM_ResourceAllocationSet
string AllocationUnits;
};

+[Description ("KVM virtual character device"),
+ Provider("cmpi::Virt_RASD")
+]
+class KVM_CharacterResourceAllocationSettingData : KVM_ResourceAllocationSettingData
+{
+ [Description ("The type of resource in the source/host environment."),
+ ValueMap {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"},
+ Values {"null", "vc", "pty", "dev", "file", "pipe",
+ "stdio", "udp", "tcp", "unix", "spicevmc"},
+ ModelCorrespondence {"KVM_CharacterResourceAllocationSettingData.SourcePath",
+ "KVM_CharacterResourceAllocationSettingData.ConnectURL",
+ "KVM_CharacterResourceAllocationSettingData.BindURL"}]
+ uint16 SourceType;
+
+ [Description ("If SourceType=4 ('file'),this is the full qualified file path. "
+ "The file is opened and all data sent to the character device "
+ "is written to the file. "
+ "If SourceType=2 ('pty'),this is the full qualified Pseudo TTY path. "
+ "A Pseudo TTY is allocated using /dev/ptmx. "
+ "If SourceType=3 ('dev'), this is the full qualified file path "
+ "to the underlying phsical character device. The device types must "
+ "match, eg the emulated serial port should only be connected to a "
+ "host serial port - don't connect a serial port to a parallel port. "
+ "If SourceType=5 ('pipe'), this is the full qualified file path "
+ "of a named pipe."),
+ ModelCorrespondence {"KVM_CharacterResourceAllocationSettingData.SourceType"}]
+ string SourcePath;
+
+ [Description ("This URL describes the connection to a remote or local location "
+ "where the character devices acts as a client."
+ "To use a literal IPv6 address in the URI, the literal address should be "
+ "enclosed in '[' and ']' characters. "
+ "If SourceType=7 ('udp'), this is defines a udp remote host and port connection "
+ "to send packages. That the character device acts as a UDP netconsole service, "
+ "sending and receiving packets, the BindURL property must also be defined. "
+ "This is a lossy service. "
+ "Only 'udp' is valid for the protocol part of the URI. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. udp://0.0.0.0:2245 "
+ "If SourceType=8 ('tcp'), this is defines a remote host and port connection. "
+ "The protocol part of the URI can be: 'raw', 'telnet', 'telnets', 'tls'. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. raw://[3ffe:2a00:100:7031::1]:2245 "
+ "If SourceType=9 ('unix'), this is defined the full qualified file path "
+ "of a Unix domain socket. Only 'file' is valid for the protocol part of the URI. "
+ "Format of the URL: file://<full qualified file path>. "
+ "e.g. file:///tmp/console-out"),
+ ModelCorrespondence {"KVM_CharacterResourceAllocationSettingData.SourceType"}]
+ string ConnectURL;
+
+ [Description ("This URL describes the connection to a remote or local location "
+ "where the character devices acts as a server. "
+ "To use a literal IPv6 address in the URI, the literal address should be "
+ "enclosed in '[' and ']' characters. "
+ "If SourceType=7 ('udp'), this is defines a udp remote host and port connection "
+ "to receive packages. That the character device acts as a UDP netconsole service, "
+ "sending and receiving packets, the ConnectURL property must also be defined. "
+ "This is a lossy service. "
+ "Only 'udp' is valid for the protocol part of the URI. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. udp://0.0.0.0:2245 "
+ "If SourceType=8 ('tcp'), this is defines a remote host and port connection. "
+ "The protocol part of the URI can be: 'raw', 'telnet', 'telnets', 'tls'. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. raw://[3ffe:2a00:100:7031::1]:2245 "
+ "If SourceType=9 ('unix'), this is defined the full qualified file path "
+ "of a Unix domain socket. Only 'file' is valid for the protocol part of the URI. "
+ "Format of the URL: file://<full qualified file path>. "
+ "e.g. file:///tmp/console-in"),
+ ModelCorrespondence {"KVM_CharacterResourceAllocationSettingData.SourceType"}]
+ string BindURL;
+};
+
+
+[Description ("KVM virtual console device. It is identified by: "
+ "CIM_ResourceAllocationSettingData.ResourceType=1 ( 'Other' ) and "
+ "CIM_ResourceAllocationSettingData.OtherResourceType='console'"),
+ Provider("cmpi::Virt_RASD")
+]
+class KVM_ConsoleResourceAllocationSettingData : KVM_CharacterResourceAllocationSettingData
+{
+ [Description ("The type of the console in the target/guest environment.")]
+ string TargetType;
+};
+
+
+
+[Description ("Xen virtual character device"),
+ Provider("cmpi::Virt_RASD")
+]
+class Xen_CharacterResourceAllocationSettingData : Xen_ResourceAllocationSettingData
+{
+ [Description ("The type of resource in the source/host environment."),
+ ValueMap {"0","1", "2", "3", "4", "5", "6", "7", "8", "9", "10"},
+ Values {"null", "vc", "pty", "dev", "file", "pipe",
+ "stdio", "udp", "tcp", "unix", "spicevmc"},
+ ModelCorrespondence {"Xen_CharacterResourceAllocationSettingData.SourcePath",
+ "Xen_CharacterResourceAllocationSettingData.ConnectURL",
+ "Xen_CharacterResourceAllocationSettingData.BindURL"}]
+ uint16 SourceType;
+
+ [Description ("If SourceType=4 ('file'),this is the full qualified file path. "
+ "The file is opened and all data sent to the character device "
+ "is written to the file. "
+ "If SourceType=2 ('pty'),this is the full qualified Pseudo TTY path. "
+ "A Pseudo TTY is allocated using /dev/ptmx. "
+ "If SourceType=3 ('dev'), this is the full qualified file path "
+ "to the underlying phsical character device. The device types must "
+ "match, eg the emulated serial port should only be connected to a "
+ "host serial port - don't connect a serial port to a parallel port. "
+ "If SourceType=5 ('pipe'), this is the full qualified file path "
+ "of a named pipe."),
+ ModelCorrespondence {"Xen_CharacterResourceAllocationSettingData.SourceType"}]
+ string SourcePath;
+
+ [Description ("This URL describes the connection to a remote or local location "
+ "where the character devices acts as a client."
+ "To use a literal IPv6 address in the URI, the literal address should be "
+ "enclosed in '[' and ']' characters. "
+ "If SourceType=7 ('udp'), this is defines a udp remote host and port connection "
+ "to send packages. That the character device acts as a UDP netconsole service, "
+ "sending and receiving packets, the BindURL property must also be defined. "
+ "This is a lossy service. "
+ "Only 'udp' is valid for the protocol part of the URI. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. udp://0.0.0.0:2245 "
+ "If SourceType=8 ('tcp'), this is defines a remote host and port connection. "
+ "The protocol part of the URI can be: 'raw', 'telnet', 'telnets', 'tls'. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. raw://[3ffe:2a00:100:7031::1]:2245 "
+ "If SourceType=9 ('unix'), this is defined the full qualified file path "
+ "of a Unix domain socket. Only 'file' is valid for the protocol part of the URI. "
+ "Format of the URL: file://<full qualified file path>. "
+ "e.g. file:///tmp/console-out"),
+ ModelCorrespondence {"Xen_CharacterResourceAllocationSettingData.SourceType"}]
+ string ConnectURL;
+
+ [Description ("This URL describes the connection to a remote or local location "
+ "where the character devices acts as a server. "
+ "To use a literal IPv6 address in the URI, the literal address should be "
+ "enclosed in '[' and ']' characters. "
+ "If SourceType=7 ('udp'), this is defines a udp remote host and port connection "
+ "to receive packages. That the character device acts as a UDP netconsole service, "
+ "sending and receiving packets, the ConnectURL property must also be defined. "
+ "This is a lossy service. "
+ "Only 'udp' is valid for the protocol part of the URI. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. udp://0.0.0.0:2245 "
+ "If SourceType=8 ('tcp'), this is defines a remote host and port connection. "
+ "The protocol part of the URI can be: 'raw', 'telnet', 'telnets', 'tls'. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. raw://[3ffe:2a00:100:7031::1]:2245 "
+ "If SourceType=9 ('unix'), this is defined the full qualified file path "
+ "of a Unix domain socket. Only 'file' is valid for the protocol part of the URI. "
+ "Format of the URL: file://<full qualified file path>. "
+ "e.g. file:///tmp/console-in"),
+ ModelCorrespondence {"Xen_CharacterResourceAllocationSettingData.SourceType"}]
+ string BindURL;
+};
+
+
+[Description ("Xen virtual console device. It is identified by: "
+ "CIM_ResourceAllocationSettingData.ResourceType=1 ( 'Other' ) and "
+ "CIM_ResourceAllocationSettingData.OtherResourceType='console'"),
+ Provider("cmpi::Virt_RASD")
+]
+class Xen_ConsoleResourceAllocationSettingData : Xen_CharacterResourceAllocationSettingData
+{
+ [Description ( "The type of the console in the target/guest environment.")]
+ string TargetType;
+};
+
+[Description ("LXC virtual character device"),
+ Provider("cmpi::Virt_RASD")
+]
+class LXC_CharacterResourceAllocationSettingData : LXC_ResourceAllocationSettingData
+{
+ [Description ("The type of resource in the source/host environment."),
+ ValueMap {"0","1", "2", "3", "4", "5", "6", "7", "8", "9", "10"},
+ Values {"null", "vc", "pty", "dev", "file", "pipe",
+ "stdio", "udp", "tcp", "unix", "spicevmc"},
+ ModelCorrespondence {"LXC_CharacterResourceAllocationSettingData.SourcePath",
+ "LXC_CharacterResourceAllocationSettingData.ConnectURL",
+ "LXC_CharacterResourceAllocationSettingData.BindURL"}]
+ uint16 SourceType;
+
+ [Description ("If SourceType=4 ('file'),this is the full qualified file path. "
+ "The file is opened and all data sent to the character device "
+ "is written to the file. "
+ "If SourceType=2 ('pty'),this is the full qualified Pseudo TTY path. "
+ "A Pseudo TTY is allocated using /dev/ptmx. "
+ "If SourceType=3 ('dev'), this is the full qualified file path "
+ "to the underlying phsical character device. The device types must "
+ "match, eg the emulated serial port should only be connected to a "
+ "host serial port - don't connect a serial port to a parallel port. "
+ "If SourceType=5 ('pipe'), this is the full qualified file path "
+ "of a named pipe."),
+ ModelCorrespondence {"LXC_CharacterResourceAllocationSettingData.SourceType"}]
+ string SourcePath;
+
+ [Description ("This URL describes the connection to a remote or local location "
+ "where the character devices acts as a client."
+ "To use a literal IPv6 address in the URI, the literal address should be "
+ "enclosed in '[' and ']' characters. "
+ "If SourceType=7 ('udp'), this is defines a udp remote host and port connection "
+ "to send packages. That the character device acts as a UDP netconsole service, "
+ "sending and receiving packets, the BindURL property must also be defined. "
+ "This is a lossy service. "
+ "Only 'udp' is valid for the protocol part of the URI. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. udp://0.0.0.0:2245 "
+ "If SourceType=8 ('tcp'), this is defines a remote host and port connection. "
+ "The protocol part of the URI can be: 'raw', 'telnet', 'telnets', 'tls'. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. raw://[3ffe:2a00:100:7031::1]:2245 "
+ "If SourceType=9 ('unix'), this is defined the full qualified file path "
+ "of a Unix domain socket. Only 'file' is valid for the protocol part of the URI. "
+ "Format of the URL: file://<full qualified file path>. "
+ "e.g. file:///tmp/console-out"),
+ ModelCorrespondence {"LXC_CharacterResourceAllocationSettingData.SourceType"}]
+ string ConnectURL;
+
+ [Description ("This URL describes the connection to a remote or local location "
+ "where the character devices acts as a server. "
+ "To use a literal IPv6 address in the URI, the literal address should be "
+ "enclosed in '[' and ']' characters. "
+ "If SourceType=7 ('udp'), this is defines a udp remote host and port connection "
+ "to receive packages. That the character device acts as a UDP netconsole service, "
+ "sending and receiving packets, the ConnectURL property must also be defined. "
+ "This is a lossy service. "
+ "Only 'udp' is valid for the protocol part of the URI. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. udp://0.0.0.0:2245 "
+ "If SourceType=8 ('tcp'), this is defines a remote host and port connection. "
+ "The protocol part of the URI can be: 'raw', 'telnet', 'telnets', 'tls'. "
+ "Format of the URL: <protocol>://<host>:<port>. e.g. raw://[3ffe:2a00:100:7031::1]:2245 "
+ "If SourceType=9 ('unix'), this is defined the full qualified file path "
+ "of a Unix domain socket. Only 'file' is valid for the protocol part of the URI. "
+ "Format of the URL: file://<full qualified file path>. "
+ "e.g. file:///tmp/console-in"),
+ ModelCorrespondence {"LXC_CharacterResourceAllocationSettingData.SourceType"}]
+ string BindURL;
+};
+
+
+[Description ("LXC virtual console device. It is identified by: "
+ "CIM_ResourceAllocationSettingData.ResourceType=1 ( 'Other' ) and "
+ "CIM_ResourceAllocationSettingData.OtherResourceType='console'"),
+ Provider("cmpi::Virt_RASD")
+]
+class LXC_ConsoleResourceAllocationSettingData : LXC_CharacterResourceAllocationSettingData
+{
+ [Description ("The type of the console in the target/guest environment.")]
+ string TargetType;
+};
diff --git a/schema/ResourceAllocationSettingData.registration b/schema/ResourceAllocationSettingData.registration
index 2747f91..b969bfe 100644
--- a/schema/ResourceAllocationSettingData.registration
+++ b/schema/ResourceAllocationSettingData.registration
@@ -1,4 +1,4 @@
-# Copyright IBM Corp. 2007
+# Copyright IBM Corp. 2007, 2013
# Classname Namespace ProviderName ProviderModule ProviderTypes
Xen_DiskResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
Xen_NetResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
@@ -6,14 +6,17 @@ Xen_ProcResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
Xen_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
Xen_GraphicsResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
Xen_InputResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
+Xen_ConsoleResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_DiskResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_NetResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_ProcResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_GraphicsResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_InputResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
+KVM_ConsoleResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_DiskResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_ProcResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_GraphicsResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_InputResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
+LXC_ConsoleResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index 150ccd3..e28d4e6 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -662,6 +662,143 @@ static CMPIStatus set_graphics_rasd_params(const struct virt_device *dev,
return s;
}

+static char* _build_console_url(const char *protocol,
+ const char *host,
+ const char *port)
+{
+ char* result = NULL;
+
+ if (host == NULL)
+ goto out;
+
+ if (protocol != NULL && STREQC("file", protocol)) {
+ /* The host string contains the file name.
+ Even if the file name does not start with a '/'
+ it is treated by libvirt as a full qualified path.
+ */
+ if (host[0] == '/') {
+ if (asprintf(&result, "file://%s", host) < 0)
+ result = NULL;
+ goto out;
+ } else {
+ if (asprintf(&result, "file:///%s", host) < 0)
+ result = NULL;
+ goto out;
+ }
+ }
+ /* The assumption is that the host does not contain a port.
+ If the host string contains a ':',
+ the host is treated as an IPv6 address.
+ */
+ if (strchr(host, ':') == NULL) {
+ if (port == NULL) {
+ if (asprintf(&result,"%s://%s", protocol, host) < 0)
+ result = NULL;
+ goto out;
+ } else {
+ if (asprintf(&result,"%s://%s:%s", protocol,
+ host,port) < 0)
+ result = NULL;
+ goto out;
+ }
+ }
+ out:
+ return result;
+}
+
+
+static CMPIStatus set_console_rasd_params(const struct virt_device *vdev,
+ CMPIInstance *inst)
+{
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+ const struct console_device *cdev = NULL;
+ char* tmp = NULL;
+
+ cdev = &vdev->dev.console;
+
+ CMSetProperty(inst, "OtherResourceType", "console", CMPI_chars);
+ CMSetProperty(inst, "SourceType",
+ (CMPIValue *)&cdev->source_type, CMPI_uint16);
+ CMSetProperty(inst, "TargetType",
+ (CMPIValue *)cdev->target_type, CMPI_chars);
+
+ switch (cdev->source_type) {
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ CMSetProperty(inst, "SourcePath",
+ (CMPIValue *)cdev->source_dev.pty.path,
+ CMPI_chars);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ CMSetProperty(inst, "SourcePath",
+ (CMPIValue *)cdev->source_dev.dev.path,
+ CMPI_chars);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ CMSetProperty(inst, "SourcePath",
+ (CMPIValue *)cdev->source_dev.file.path,
+ CMPI_chars);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ CMSetProperty(inst, "SourcePath",
+ (CMPIValue *)cdev->source_dev.pipe.path,
+ CMPI_chars);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ tmp = _build_console_url("file",
+ cdev->source_dev.unixsock.path, NULL);
+ if (cdev->source_dev.unixsock.mode != NULL) {
+ if (STREQC(cdev->source_dev.unixsock.mode, "bind"))
+ CMSetProperty(inst, "BindURL",
+ (CMPIValue *)tmp, CMPI_chars);
+ else if (STREQC(cdev->source_dev.unixsock.mode,
+ "connect"))
+ CMSetProperty(inst, "ConnectURL",
+ (CMPIValue *)tmp, CMPI_chars);
+ }
+ free(tmp);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ tmp = _build_console_url("udp",
+ cdev->source_dev.udp.bind_host,
+ cdev->source_dev.udp.bind_service);
+ CMSetProperty(inst, "BindURL",
+ (CMPIValue *)tmp, CMPI_chars);
+ free(tmp);
+
+ tmp = _build_console_url("udp",
+ cdev->source_dev.udp.connect_host,
+ cdev->source_dev.udp.connect_service);
+ CMSetProperty(inst, "ConnectURL", (CMPIValue *)tmp, CMPI_chars);
+ free(tmp);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ tmp = _build_console_url(cdev->source_dev.tcp.protocol,
+ cdev->source_dev.tcp.host,
+ cdev->source_dev.tcp.service);
+ if (cdev->source_dev.tcp.mode != NULL) {
+ if (STREQC(cdev->source_dev.tcp.mode, "bind"))
+ CMSetProperty(inst, "BindURL",
+ (CMPIValue *)tmp, CMPI_chars);
+ else if (STREQC(cdev->source_dev.tcp.mode, "connect"))
+ CMSetProperty(inst, "ConnectURL",
+ (CMPIValue *)tmp, CMPI_chars);
+ }
+ free(tmp);
+ break;
+
+ default:
+ /* Nothing to do for :
+ CIM_CHARDEV_SOURCE_TYPE_STDIO
+ CIM_CHARDEV_SOURCE_TYPE_NULL
+ CIM_CHARDEV_SOURCE_TYPE_VC
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+ */
+ break;
+ }
+
+ return s;
+}
+
static CMPIStatus set_input_rasd_params(const struct virt_device *dev,
CMPIInstance *inst)
{
@@ -721,6 +858,9 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
} else if (dev->type == CIM_RES_TYPE_GRAPHICS) {
type = CIM_RES_TYPE_GRAPHICS;
base = "GraphicsResourceAllocationSettingData";
+ } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
+ type = CIM_RES_TYPE_OTHER;
+ base = "ConsoleResourceAllocationSettingData";
} else if (dev->type == CIM_RES_TYPE_INPUT) {
type = CIM_RES_TYPE_INPUT;
base = "InputResourceAllocationSettingData";
@@ -777,6 +917,8 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
s = set_graphics_rasd_params(dev, inst, host, CLASSNAME(ref));
} else if (dev->type == CIM_RES_TYPE_INPUT) {
s = set_input_rasd_params(dev, inst);
+ } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
+ s = set_console_rasd_params(dev, inst);
}

/* FIXME: Put the HostResource in place */
@@ -909,6 +1051,8 @@ CMPIrc res_type_from_rasd_classname(const char *cn, uint16_t *type)
*type = CIM_RES_TYPE_INPUT;
else if (STREQ(base, "StorageVolumeResourceAllocationSettingData"))
*type = CIM_RES_TYPE_IMAGE;
+ else if (STREQ(base, "ConsoleResourceAllocationSettingData"))
+ *type = CIM_RES_TYPE_CONSOLE;
else
goto out;

@@ -940,6 +1084,9 @@ CMPIrc rasd_classname_from_type(uint16_t type, const char **classname)
case CIM_RES_TYPE_GRAPHICS:
*classname = "GraphicsResourceAllocationSettingData";
break;
+ case CIM_RES_TYPE_CONSOLE:
+ *classname = "ConsoleResourceAllocationSettingData";
+ break;
case CIM_RES_TYPE_INPUT:
*classname = "InputResourceAllocationSettingData";
break;
--
2.1.0

40
SOURCES/libvirt-cim-0.6.3-8eb5c1e7.patch

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
From 8eb5c1e7b2547ad516aeb97d4407758c27c05a54 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Wed, 22 Jan 2014 13:28:06 -0500
Subject: [PATCH 45/60] EAFP: Coverity cleanup

A new version of Coverity found:

get_dev_from_pool(): RESOURCE_LEAK
- Because the code is run within a for() loop Coverity complains
that the returned 'poolid' is not free'd during each pass through
the loop. So even though it may not be fetched again, just free()
and reinitialize 'poolid' after usage

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_ElementAllocatedFromPool.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/Virt_ElementAllocatedFromPool.c b/src/Virt_ElementAllocatedFromPool.c
index 03d856a..2c2f2d1 100644
--- a/src/Virt_ElementAllocatedFromPool.c
+++ b/src/Virt_ElementAllocatedFromPool.c
@@ -124,10 +124,14 @@ static CMPIStatus get_dev_from_pool(const CMPIObjectPath *ref,
poolid = pool_member_of(_BROKER, cn, type, dev_id);
if (poolid && STREQ(poolid, _poolid))
inst_list_add(list, inst);
+
+ if (poolid) {
+ free(poolid);
+ poolid = NULL;
+ }
}

out:
- free(poolid);
inst_list_free(&tmp);

return s;
--
2.1.0

131
SOURCES/libvirt-cim-0.6.3-93ea8130.patch

@ -0,0 +1,131 @@ @@ -0,0 +1,131 @@
From 93ea8130081b8450981320c7c4e7b1b65a75f269 Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:36 +0200
Subject: [PATCH 16/60] schema: New SVPC types for chardev/consoles

C definitions for the console source types, defining the representation
of the consoles in the hypervisor host. Includes mapping from and to
string representations.

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/svpc_types.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 96 insertions(+), 1 deletion(-)

diff --git a/src/svpc_types.h b/src/svpc_types.h
index 99dd56f..2e4d73f 100644
--- a/src/svpc_types.h
+++ b/src/svpc_types.h
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -167,5 +167,100 @@ enum CIM_op_status {
CIM_OP_STATUS_POWER_MODE = 18,
};

+/* emum for the Character device Source resource types */
+enum CIM_chardev_source_type {
+ CIM_CHARDEV_SOURCE_TYPE_NULL = 0,
+ CIM_CHARDEV_SOURCE_TYPE_VC = 1,
+ CIM_CHARDEV_SOURCE_TYPE_PTY = 2,
+ CIM_CHARDEV_SOURCE_TYPE_DEV = 3,
+ CIM_CHARDEV_SOURCE_TYPE_FILE = 4,
+ CIM_CHARDEV_SOURCE_TYPE_PIPE = 5,
+ CIM_CHARDEV_SOURCE_TYPE_STDIO = 6,
+ CIM_CHARDEV_SOURCE_TYPE_UDP = 7,
+ CIM_CHARDEV_SOURCE_TYPE_TCP = 8,
+ CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK = 9,
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC = 10,
+ /* please insert new source types above */
+ CIM_CHARDEV_SOURCE_TYPE_INVALIDTYPE,
+ CIM_CHARDEV_SOURCE_TYPE_UNKNOWN = 32768,
+};
+
+static inline int chardev_source_type_StrToID(const char *type_str)
+{
+ int rc = CIM_CHARDEV_SOURCE_TYPE_UNKNOWN;
+
+ if (type_str == NULL)
+ return rc;
+
+ if (STREQC(type_str, "null"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_NULL;
+ else if (STREQC(type_str, "vc"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_VC;
+ else if (STREQC(type_str, "pty"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_PTY;
+ else if (STREQC(type_str, "dev"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_DEV;
+ else if (STREQC(type_str, "file"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_FILE;
+ else if (STREQC(type_str, "pipe"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_PIPE;
+ else if (STREQC(type_str, "stdio"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_STDIO;
+ else if (STREQC(type_str, "udp"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_UDP;
+ else if (STREQC(type_str, "tcp"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_TCP;
+ else if (STREQC(type_str, "unix"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK;
+ else if (STREQC(type_str, "spicevmc"))
+ rc = CIM_CHARDEV_SOURCE_TYPE_SPICEVMC;
+
+ return rc;
+}
+
+static inline const char* chardev_source_type_IDToStr(int type)
+{
+ char *type_str = NULL;
+
+ switch (type)
+ {
+ case CIM_CHARDEV_SOURCE_TYPE_NULL:
+ type_str = "null";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_VC:
+ type_str = "vc";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ type_str = "pty";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ type_str = "dev";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ type_str = "file";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ type_str = "pipe";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_STDIO:
+ type_str = "stdio";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ type_str = "udp";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ type_str = "tcp";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ type_str = "unix";
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_SPICEVMC:
+ type_str = "spicevmc";
+ break;
+ default:
+ break;
+ }
+ return type_str;
+}

#endif
--
2.1.0

42
SOURCES/libvirt-cim-0.6.3-95f0d418.patch

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
From 95f0d418fe4240a0ea2706cc400828ec90984844 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Tue, 5 Nov 2013 10:03:33 +0100
Subject: [PATCH 34/48] schema: Fix class removal with Pegasus

In provider de-registration step, the provider-register.sh
script is attempting to delete all libvirt-cim classes from
the Pegasus repository. Pegasus refuses to delete classes
if it still has child classes in the repository.
While the MOF files are processed in reverse order, the classes
were still deleted in their original order, which can fail due
to inter-class dependencies.
Changed to reverse the class deletion order on a per MOF
file base.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
provider-register.sh | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/provider-register.sh b/provider-register.sh
index b730ef3..abe8e95 100755
--- a/provider-register.sh
+++ b/provider-register.sh
@@ -332,8 +332,12 @@ pegasus_uninstall()
echo "Error: wbemexec not found" >&2
return 1
fi
- CLASSES=`cat $mymofs 2> /dev/null | grep '^class'| cut -d ' ' -f 2 | uniq`
-
+ for mof in $mymofs
+ do
+ # We must delete the classes in reverse order per MOF file
+ MOFCLASSES=`cat $mof 2> /dev/null | grep '^[[:space:]]*class' | sed 's/ \+/ /g' | tac | cut -d ' ' -f 2`
+ CLASSES="$CLASSES $MOFCLASSES"
+ done
for _TEMPDIR in /var/tmp /tmp
do
if test -w $_TEMPDIR
--
1.8.5.3

78
SOURCES/libvirt-cim-0.6.3-9a4f2a32.patch

@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
From 9a4f2a3219fd8bc9d96353b051fe5853a440e7d5 Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Fri, 11 Oct 2013 13:47:34 +0200
Subject: [PATCH 35/60] VSSM: Fix endianness issue in domain properties

The properties for the on_xxx actions must be 16-bit values in
order to avoid failures on big endian systems.

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Reviewed-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 2 +-
libxkutil/device_parsing.h | 8 ++++----
src/Virt_VirtualSystemManagementService.c | 4 ++--
3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 97419d2..8a90653 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -1602,7 +1602,7 @@ static int parse_features(struct domain *dominfo, xmlNode *features)
return 1;
}

-static void set_action(int *val, xmlNode *child)
+static void set_action(uint16_t *val, xmlNode *child)
{
char *action = (char *)xmlNodeGetContent(child);

diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 531703d..92427c1 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -213,7 +213,7 @@ struct domain {
bool acpi;
bool apic;
bool pae;
- int autostrt;
+ uint16_t autostrt;

union {
struct pv_os_info pv;
@@ -221,9 +221,9 @@ struct domain {
struct lxc_os_info lxc;
} os_info;

- int on_poweroff;
- int on_reboot;
- int on_crash;
+ uint16_t on_poweroff;
+ uint16_t on_reboot;
+ uint16_t on_crash;

struct virt_device *dev_graphics;
int dev_graphics_ct;
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 6548d08..5c7238f 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -719,13 +719,13 @@ static int vssd_to_domain(CMPIInstance *inst,
if (ret != CMPI_RC_OK)
tmp = 0;

- domain->on_poweroff = (int)tmp;
+ domain->on_poweroff = tmp;

ret = cu_get_u16_prop(inst, "AutomaticRecoveryAction", &tmp);
if (ret != CMPI_RC_OK)
tmp = CIM_VSSD_RECOVERY_NONE;

- domain->on_crash = (int)tmp;
+ domain->on_crash = tmp;

if (cu_get_bool_prop(inst, "IsFullVirt", &fullvirt) != CMPI_RC_OK)
fullvirt = false;
--
2.1.0

217
SOURCES/libvirt-cim-0.6.3-9c1d321b.patch

@ -0,0 +1,217 @@ @@ -0,0 +1,217 @@
From 9c1d321b14334b390ab84a2ff708566037b19130 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Tue, 5 Nov 2013 10:03:32 +0100
Subject: [PATCH 33/48] build: Fix provider registration issues

This commit addresses an issue with provider registration during
RPM install or update.
The schema registration by wildcard doesn't take into consideration
that there are dependencies between the MOF files leading to
a partially populated repository and a not working libvirt-cim
provider.
Fixed by explicitly stating the mof and registration files in the
necessary order.

Further a minor false error message coming from the systemd service
detection was bound to cause irritation. This is suppressed now.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 167 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 157 insertions(+), 10 deletions(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index b50cbd1..c96451b 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -64,17 +64,164 @@ mkdir -p $RPM_BUILD_ROOT@INFO_STORE@
%clean
rm -fr $RPM_BUILD_ROOT

-%define REGISTRATION %{_datadir}/%{name}/*.registration
-%define SCHEMA %{_datadir}/%{name}/*.mof
+%define REGISTRATION %{_datadir}/%{name}/ComputerSystem.registration \\\
+ %{_datadir}/%{name}/LogicalDisk.registration \\\
+ %{_datadir}/%{name}/NetworkPort.registration \\\
+ %{_datadir}/%{name}/Memory.registration \\\
+ %{_datadir}/%{name}/Processor.registration \\\
+ %{_datadir}/%{name}/SystemDevice.registration \\\
+ %{_datadir}/%{name}/VSSD.registration \\\
+ %{_datadir}/%{name}/HostSystem.registration \\\
+ %{_datadir}/%{name}/HostedDependency.registration \\\
+ %{_datadir}/%{name}/VirtualSystemManagementService.registration \\\
+ %{_datadir}/%{name}/VirtualSystemManagementCapabilities.registration \\\
+ %{_datadir}/%{name}/EnabledLogicalElementCapabilities.registration \\\
+ %{_datadir}/%{name}/AllocationCapabilities.registration \\\
+ %{_datadir}/%{name}/SettingsDefineCapabilities.registration \\\
+ %{_datadir}/%{name}/MemoryPool.registration \\\
+ %{_datadir}/%{name}/ElementCapabilities.registration \\\
+ %{_datadir}/%{name}/ProcessorPool.registration \\\
+ %{_datadir}/%{name}/DiskPool.registration \\\
+ %{_datadir}/%{name}/HostedResourcePool.registration \\\
+ %{_datadir}/%{name}/ComputerSystemIndication.registration \\\
+ %{_datadir}/%{name}/ResourceAllocationSettingDataIndication.registration \\\
+ %{_datadir}/%{name}/SwitchService.registration \\\
+ %{_datadir}/%{name}/ComputerSystemMigrationIndication.registration \\\
+ %{_datadir}/%{name}/ResourceAllocationSettingData.registration \\\
+ %{_datadir}/%{name}/ResourcePoolConfigurationService.registration \\\
+ %{_datadir}/%{name}/ResourcePoolConfigurationCapabilities.registration \\\
+ %{_datadir}/%{name}/VSSDComponent.registration \\\
+ %{_datadir}/%{name}/SettingsDefineState.registration \\\
+ %{_datadir}/%{name}/NetPool.registration \\\
+ %{_datadir}/%{name}/ResourceAllocationFromPool.registration \\\
+ %{_datadir}/%{name}/ElementAllocatedFromPool.registration \\\
+ %{_datadir}/%{name}/HostedService.registration \\\
+ %{_datadir}/%{name}/ElementSettingData.registration \\\
+ %{_datadir}/%{name}/VSMigrationCapabilities.registration \\\
+ %{_datadir}/%{name}/VSMigrationService.registration \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.registration \\\
+ %{_datadir}/%{name}/VSMigrationSettingData.registration \\\
+ %{_datadir}/%{name}/VirtualSystemSnapshotService.registration \\\
+ %{_datadir}/%{name}/VirtualSystemSnapshotServiceCapabilities.registration \\\
+ %{_datadir}/%{name}/ConcreteComponent.registration \\\
+ %{_datadir}/%{name}/ConsoleRedirectionService.registration \\\
+ %{_datadir}/%{name}/ConsoleRedirectionServiceCapabilities.registration \\\
+ %{_datadir}/%{name}/ServiceAffectsElement.registration \\\
+ %{_datadir}/%{name}/KVMRedirectionSAP.registration \\\
+ %{_datadir}/%{name}/DisplayController.registration \\\
+ %{_datadir}/%{name}/PointingDevice.registration \\\
+ %{_datadir}/%{name}/GraphicsPool.registration \\\
+ %{_datadir}/%{name}/InputPool.registration \\\
+ %{_datadir}/%{name}/HostedAccessPoint.registration \\\
+ %{_datadir}/%{name}/ServiceAccessBySAP.registration \\\
+ %{_datadir}/%{name}/SAPAvailableForElement.registration \\\
+ %{_datadir}/%{name}/FilterEntry.registration \\\
+ %{_datadir}/%{name}/FilterList.registration \\\
+ %{_datadir}/%{name}/EntriesInFilterList.registration \\\
+ %{_datadir}/%{name}/NestedFilterList.registration \\\
+ %{_datadir}/%{name}/AppliedFilterList.registration \\\
+ %{_datadir}/%{name}/HostedFilterList.registration

-%define INTEROP_REG %{_datadir}/%{name}/{RegisteredProfile,ElementConformsToProfile,ReferencedProfile}.registration
-%define INTEROP_MOF %{_datadir}/%{name}/{ComputerSystem,HostSystem,RegisteredProfile,DiskPool,MemoryPool,NetPool,ProcessorPool,VSMigrationService,ElementConformsToProfile,ReferencedProfile,AllocationCapabilities}.mof
+%define SCHEMA %{_datadir}/%{name}/ComputerSystem.mof \\\
+ %{_datadir}/%{name}/LogicalDisk.mof \\\
+ %{_datadir}/%{name}/NetworkPort.mof \\\
+ %{_datadir}/%{name}/Memory.mof \\\
+ %{_datadir}/%{name}/Processor.mof \\\
+ %{_datadir}/%{name}/SystemDevice.mof \\\
+ %{_datadir}/%{name}/Virt_VSSD.mof \\\
+ %{_datadir}/%{name}/VSSD.mof \\\
+ %{_datadir}/%{name}/HostSystem.mof \\\
+ %{_datadir}/%{name}/HostedDependency.mof \\\
+ %{_datadir}/%{name}/VirtualSystemManagementService.mof \\\
+ %{_datadir}/%{name}/VirtualSystemManagementCapabilities.mof \\\
+ %{_datadir}/%{name}/EnabledLogicalElementCapabilities.mof \\\
+ %{_datadir}/%{name}/AllocationCapabilities.mof \\\
+ %{_datadir}/%{name}/SettingsDefineCapabilities.mof \\\
+ %{_datadir}/%{name}/MemoryPool.mof \\\
+ %{_datadir}/%{name}/ElementCapabilities.mof \\\
+ %{_datadir}/%{name}/ProcessorPool.mof \\\
+ %{_datadir}/%{name}/DiskPool.mof \\\
+ %{_datadir}/%{name}/HostedResourcePool.mof \\\
+ %{_datadir}/%{name}/RegisteredProfile.mof \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.mof \\\
+ %{_datadir}/%{name}/ComputerSystemIndication.mof \\\
+ %{_datadir}/%{name}/ResourceAllocationSettingDataIndication.mof \\\
+ %{_datadir}/%{name}/SwitchService.mof \\\
+ %{_datadir}/%{name}/ComputerSystemMigrationIndication.mof \\\
+ %{_datadir}/%{name}/Virt_ResourceAllocationSettingData.mof \\\
+ %{_datadir}/%{name}/ResourceAllocationSettingData.mof \\\
+ %{_datadir}/%{name}/ResourcePoolConfigurationService.mof \\\
+ %{_datadir}/%{name}/ResourcePoolConfigurationCapabilities.mof \\\
+ %{_datadir}/%{name}/VSSDComponent.mof \\\
+ %{_datadir}/%{name}/SettingsDefineState.mof \\\
+ %{_datadir}/%{name}/NetPool.mof \\\
+ %{_datadir}/%{name}/ResourceAllocationFromPool.mof \\\
+ %{_datadir}/%{name}/ElementAllocatedFromPool.mof \\\
+ %{_datadir}/%{name}/HostedService.mof \\\
+ %{_datadir}/%{name}/ElementSettingData.mof \\\
+ %{_datadir}/%{name}/VSMigrationCapabilities.mof \\\
+ %{_datadir}/%{name}/VSMigrationService.mof \\\
+ %{_datadir}/%{name}/VSMigrationSettingData.mof \\\
+ %{_datadir}/%{name}/VirtualSystemSnapshotService.mof \\\
+ %{_datadir}/%{name}/VirtualSystemSnapshotServiceCapabilities.mof \\\
+ %{_datadir}/%{name}/ConcreteComponent.mof \\\
+ %{_datadir}/%{name}/ConsoleRedirectionService.mof \\\
+ %{_datadir}/%{name}/ConsoleRedirectionServiceCapabilities.mof \\\
+ %{_datadir}/%{name}/ServiceAffectsElement.mof \\\
+ %{_datadir}/%{name}/KVMRedirectionSAP.mof \\\
+ %{_datadir}/%{name}/DisplayController.mof \\\
+ %{_datadir}/%{name}/PointingDevice.mof \\\
+ %{_datadir}/%{name}/GraphicsPool.mof \\\
+ %{_datadir}/%{name}/InputPool.mof \\\
+ %{_datadir}/%{name}/HostedAccessPoint.mof \\\
+ %{_datadir}/%{name}/ServiceAccessBySAP.mof \\\
+ %{_datadir}/%{name}/SAPAvailableForElement.mof \\\
+ %{_datadir}/%{name}/FilterEntry.mof \\\
+ %{_datadir}/%{name}/FilterList.mof \\\
+ %{_datadir}/%{name}/EntriesInFilterList.mof \\\
+ %{_datadir}/%{name}/NestedFilterList.mof \\\
+ %{_datadir}/%{name}/AppliedFilterList.mof \\\
+ %{_datadir}/%{name}/HostedFilterList.mof

-%define PGINTEROP_REG %{_datadir}/%{name}/{RegisteredProfile,ElementConformsToProfile,ReferencedProfile}.registration
-%define PGINTEROP_MOF %{_datadir}/%{name}/{RegisteredProfile,ElementConformsToProfile,ReferencedProfile}.mof
+%define INTEROP_REG %{_datadir}/%{name}/RegisteredProfile.registration \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.registration \\\
+ %{_datadir}/%{name}/ReferencedProfile.registration

-%define CIMV2_REG %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,ElementConformsToProfile,HostedAccessPoint}.registration
-%define CIMV2_MOF %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,RegisteredProfile,ComputerSystem,ElementConformsToProfile,HostedAccessPoint}.mof
+%define INTEROP_MOF %{_datadir}/%{name}/ComputerSystem.mof \\\
+ %{_datadir}/%{name}/HostSystem.mof \\\
+ %{_datadir}/%{name}/RegisteredProfile.mof \\\
+ %{_datadir}/%{name}/DiskPool.mof \\\
+ %{_datadir}/%{name}/MemoryPool.mof \\\
+ %{_datadir}/%{name}/NetPool.mof \\\
+ %{_datadir}/%{name}/ProcessorPool.mof \\\
+ %{_datadir}/%{name}/VSMigrationService.mof \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.mof \\\
+ %{_datadir}/%{name}/ReferencedProfile.mof \\\
+ %{_datadir}/%{name}/AllocationCapabilities.mof
+
+%define PGINTEROP_REG %{_datadir}/%{name}/RegisteredProfile.registration \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.registration \\\
+ %{_datadir}/%{name}/ReferencedProfile.registration
+
+%define PGINTEROP_MOF %{_datadir}/%{name}/RegisteredProfile.mof \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.mof \\\
+ %{_datadir}/%{name}/ReferencedProfile.mof
+
+%define CIMV2_REG %{_datadir}/%{name}/HostedResourcePool.registration \\\
+ %{_datadir}/%{name}/ElementCapabilities.registration \\\
+ %{_datadir}/%{name}/HostedService.registration \\\
+ %{_datadir}/%{name}/HostedDependency.registration \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.registration \\\
+ %{_datadir}/%{name}/HostedAccessPoint.registration
+
+%define CIMV2_MOF %{_datadir}/%{name}/HostedResourcePool.mof \\\
+ %{_datadir}/%{name}/ElementCapabilities.mof \\\
+ %{_datadir}/%{name}/HostedService.mof \\\
+ %{_datadir}/%{name}/HostedDependency.mof \\\
+ %{_datadir}/%{name}/RegisteredProfile.mof \\\
+ %{_datadir}/%{name}/ComputerSystem.mof \\\
+ %{_datadir}/%{name}/ElementConformsToProfile.mof \\\
+ %{_datadir}/%{name}/HostedAccessPoint.mof

%pre
# _If_ there is already a version of this installed, we must deregister
@@ -118,12 +265,12 @@ then
fi

%if 0%{?fedora} >= 17 || 0%{?rhel} >= 7
- if [ "`systemctl is-active tog-pegasus.service`" = "active" ]
+ if [ "`systemctl is-active tog-pegasus.service 2> /dev/null`" = "active" ]
then
systemctl restart tog-pegasus.service
fi

- if [ "`systemctl is-active sblim-sfcb.service`" = "active" ]
+ if [ "`systemctl is-active sblim-sfcb.service 2> /dev/null`" = "active" ]
then
systemctl restart sblim-sfcb.service
fi
--
1.8.5.3

165
SOURCES/libvirt-cim-0.6.3-a16ca9d0.patch

@ -0,0 +1,165 @@ @@ -0,0 +1,165 @@
From a16ca9d025005a755cd1e9b353a376333a958f5b Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Thu, 27 Mar 2014 11:08:21 -0400
Subject: [PATCH 52/60] Add virtual controller object definitions to mofs

Add the mofs and registration to support the Controller Logical Device
and RASD. The Contoller Logical Device will be a child of the
CIM_Controller class and the Controller RASD will be a child of
the CIM_RASD.

Install the mofs and definitions, but don't yet link things up

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
Makefile.am | 4 ++-
libvirt-cim.spec.in | 2 ++
schema/Controller.mof | 7 +++++
schema/Controller.registration | 4 +++
schema/ResourceAllocationSettingData.mof | 37 ++++++++++++++++++++++-
schema/ResourceAllocationSettingData.registration | 3 +-
6 files changed, 54 insertions(+), 3 deletions(-)
create mode 100644 schema/Controller.mof
create mode 100644 schema/Controller.registration

diff --git a/Makefile.am b/Makefile.am
index 69b65cf..24b11af 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright IBM Corp. 2007
+# Copyright IBM Corp. 2007-2014
AUTOMAKE_OPTIONS=dist-bzip2

SUBDIRS = libxkutil src doc base_schema
@@ -52,6 +52,7 @@ MOFS = \
$(top_srcdir)/schema/ServiceAffectsElement.mof \
$(top_srcdir)/schema/KVMRedirectionSAP.mof \
$(top_srcdir)/schema/DisplayController.mof \
+ $(top_srcdir)/schema/Controller.mof \
$(top_srcdir)/schema/PointingDevice.mof \
$(top_srcdir)/schema/GraphicsPool.mof \
$(top_srcdir)/schema/InputPool.mof \
@@ -142,6 +143,7 @@ REGS = \
$(top_srcdir)/schema/ServiceAffectsElement.registration \
$(top_srcdir)/schema/KVMRedirectionSAP.registration \
$(top_srcdir)/schema/DisplayController.registration \
+ $(top_srcdir)/schema/Controller.registration \
$(top_srcdir)/schema/PointingDevice.registration \
$(top_srcdir)/schema/GraphicsPool.registration \
$(top_srcdir)/schema/InputPool.registration \
diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index 01ee329..f4e4fcf 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -110,6 +110,7 @@ rm -fr $RPM_BUILD_ROOT
%{_datadir}/%{name}/ServiceAffectsElement.registration \\\
%{_datadir}/%{name}/KVMRedirectionSAP.registration \\\
%{_datadir}/%{name}/DisplayController.registration \\\
+ %{_datadir}/%{name}/Controller.registration \\\
%{_datadir}/%{name}/PointingDevice.registration \\\
%{_datadir}/%{name}/GraphicsPool.registration \\\
%{_datadir}/%{name}/InputPool.registration \\\
@@ -171,6 +172,7 @@ rm -fr $RPM_BUILD_ROOT
%{_datadir}/%{name}/ServiceAffectsElement.mof \\\
%{_datadir}/%{name}/KVMRedirectionSAP.mof \\\
%{_datadir}/%{name}/DisplayController.mof \\\
+ %{_datadir}/%{name}/Controller.mof \\\
%{_datadir}/%{name}/PointingDevice.mof \\\
%{_datadir}/%{name}/GraphicsPool.mof \\\
%{_datadir}/%{name}/InputPool.mof \\\
diff --git a/schema/Controller.mof b/schema/Controller.mof
new file mode 100644
index 0000000..0805aa9
--- /dev/null
+++ b/schema/Controller.mof
@@ -0,0 +1,7 @@
+// Copyright IBM Corp. 2014
+
+[ Provider("cmpi::Virt_Device")
+]
+class KVM_Controller : CIM_Controller
+{
+};
diff --git a/schema/Controller.registration b/schema/Controller.registration
new file mode 100644
index 0000000..5f59a20
--- /dev/null
+++ b/schema/Controller.registration
@@ -0,0 +1,4 @@
+# Copyright IBM Corp. 2014
+
+# Classname Namespace ProviderName ProviderModule ProviderTypes
+KVM_Controller root/virt Virt_Device Virt_Device instance
diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index 6b649de..9c387f0 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -1,4 +1,4 @@
-// Copyright IBM Corp. 2007, 2013
+// Copyright IBM Corp. 2007-2014

[Description ("Xen virtual disk configuration"),
Provider("cmpi::Virt_RASD")
@@ -328,6 +328,41 @@ class LXC_InputResourceAllocationSettingData : LXC_ResourceAllocationSettingData
string BusType;
};

+[Description ("KVM virtual controller device. It is identified by: "
+ "CIM_ResourceAllocationSettingData.ResourceType=1 ('Other'), "
+ "CIM_ResourceAllocationSettingData.OtherResourceType='controller'"
+ " and CIM_ResourceAllocationSettingData.ResourceSubType set to "
+ "one of 'ide', 'fdc', 'scsi', 'sata', 'ccid', 'virtio-serial', "
+ "or 'pci'."),
+ Provider("cmpi::Virt_RASD")
+]
+class KVM_ControllerResourceAllocationSettingData : KVM_ResourceAllocationSettingData
+{
+ [Description ("Order in which the bus controller is encountered. "
+ "The order is controller type scoped.")]
+ uint64 Index;
+
+ [Description ("Optional string providing a specific model "
+ "information based on the controller type.")]
+ string Model;
+
+ [Description ("The 'virtio-serial' controller uses the Ports and "
+ "Vectors to control how many devices can be connected "
+ "through the controller.")]
+ string Ports;
+ string Vectors;
+
+ [Description ("Number of queues for the controller.")]
+ string Queues;
+
+ [Description ("For controllers that are themselves devices on a "
+ "bus an optional element to specify the exact "
+ "relationship of the controller to its master bus. "
+ "Stored in the property and value arrays.")]
+ string AddressProperties[];
+ string AddressValues[];
+};
+
[Description ("Xen virtual network pool settings"),
Provider("cmpi::Virt_RASD")
]
diff --git a/schema/ResourceAllocationSettingData.registration b/schema/ResourceAllocationSettingData.registration
index b969bfe..74df857 100644
--- a/schema/ResourceAllocationSettingData.registration
+++ b/schema/ResourceAllocationSettingData.registration
@@ -1,4 +1,4 @@
-# Copyright IBM Corp. 2007, 2013
+# Copyright IBM Corp. 2007-2014
# Classname Namespace ProviderName ProviderModule ProviderTypes
Xen_DiskResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
Xen_NetResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
@@ -14,6 +14,7 @@ KVM_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_GraphicsResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_InputResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
KVM_ConsoleResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
+KVM_ControllerResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_DiskResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
LXC_ProcResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance
--
2.1.0

69
SOURCES/libvirt-cim-0.6.3-a3649c21.patch

@ -0,0 +1,69 @@ @@ -0,0 +1,69 @@
From a3649c210487b86a313bf84043cd1a923397c5d1 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:39 +0200
Subject: [PATCH 19/60] Device: CIM_LogicalDevice for consoles

Extended the Virt_Device provider to return DisplayController
devices for the consoles found. This mainly for the purpose of
consistency with the other RASD types.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_Device.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)

diff --git a/src/Virt_Device.c b/src/Virt_Device.c
index c3b515c..aa47276 100644
--- a/src/Virt_Device.c
+++ b/src/Virt_Device.c
@@ -251,6 +251,34 @@ static CMPIInstance *graphics_instance(const CMPIBroker *broker,
return inst;
}

+static CMPIInstance *console_instance(const CMPIBroker *broker,
+ struct console_device *dev,
+ const virDomainPtr dom,
+ const char *ns)
+{
+ CMPIInstance *inst;
+ virConnectPtr conn;
+ const char *ctype;
+
+ conn = virDomainGetConnect(dom);
+ inst = get_typed_instance(broker,
+ pfx_from_conn(conn),
+ "DisplayController",
+ ns,
+ true);
+
+ if (inst == NULL) {
+ CU_DEBUG("Failed to get instance for DisplayController");
+ return NULL;
+ }
+
+ ctype = chardev_source_type_IDToStr(dev->source_type);
+ CMSetProperty(inst, "VideoProcessor",
+ (CMPIValue *)ctype, CMPI_chars);
+
+ return inst;
+}
+
int get_input_dev_caption(const char *type,
const char *bus,
char **cap)
@@ -483,6 +511,11 @@ static bool device_instances(const CMPIBroker *broker,
&dev->dev.graphics,
dom,
ns);
+ else if (dev->type == CIM_RES_TYPE_CONSOLE)
+ instance = console_instance(broker,
+ &dev->dev.console,
+ dom,
+ ns);
else if (dev->type == CIM_RES_TYPE_INPUT)
instance = input_instance(broker,
&dev->dev.input,
--
2.1.0

29
SOURCES/libvirt-cim-0.6.3-a6cbafc6.patch

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
From a6cbafc6b4c6b4d1db13006008bda1c3152bbf58 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Wed, 22 Jan 2014 13:13:02 -0500
Subject: [PATCH 43/60] libxkutil/xml_parse_test: Coverity cleanup

A new version of Coverity found:

print_domxml(): RESOURCE_LEAK
- The 'xml' variable needs to be free()'d

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/xml_parse_test.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/libxkutil/xml_parse_test.c b/libxkutil/xml_parse_test.c
index 374bcf6..303880d 100644
--- a/libxkutil/xml_parse_test.c
+++ b/libxkutil/xml_parse_test.c
@@ -192,6 +192,7 @@ static void print_domxml(struct domain *dominfo,
printf("Failed to create system XML\n");
else
printf("%s\n", xml);
+ free(xml);
}

static char *read_from_file(FILE *file)
--
2.1.0

115
SOURCES/libvirt-cim-0.6.3-a72ab39b.patch

@ -0,0 +1,115 @@ @@ -0,0 +1,115 @@
From a72ab39ba75702676af64af30d9412f5d7730cd9 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 14 Oct 2013 17:29:42 +0200
Subject: [PATCH 27/60] RASD: Support for device address properties

This change allows to enumerate KVM disk and network RASDs containing
device addresses. A new function set_rasd_device_address fills the
CIM instance properties from a device_address structure.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_RASD.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)

diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index e28d4e6..df1e921 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -289,6 +289,67 @@ static bool get_vol_size(const CMPIBroker *broker,
}
#endif

+static CMPIStatus set_rasd_device_address(const CMPIBroker *broker,
+ const CMPIObjectPath *ref,
+ const struct device_address *addr,
+ CMPIInstance *inst)
+{
+ int i;
+ CMPIArray *arr_key;
+ CMPIArray *arr_value;
+ CMPIString *string;
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+
+ arr_key = CMNewArray(broker,
+ addr->ct,
+ CMPI_string,
+ &s);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ arr_value = CMNewArray(broker,
+ addr->ct,
+ CMPI_string,
+ &s);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ for (i = 0; i < addr->ct; i++) {
+ string = CMNewString(broker,
+ addr->key[i],
+ &s);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ CMSetArrayElementAt(arr_key,
+ i,
+ (CMPIValue *)&string,
+ CMPI_string);
+
+ string = CMNewString(broker,
+ addr->value[i],
+ &s);
+ if (s.rc != CMPI_RC_OK)
+ goto out;
+
+ CMSetArrayElementAt(arr_value,
+ i,
+ (CMPIValue *)&string,
+ CMPI_string);
+ }
+
+ CMSetProperty(inst, "AddressProperties",
+ (CMPIValue *)&arr_key,
+ CMPI_stringA);
+
+ CMSetProperty(inst, "AddressValues",
+ (CMPIValue *)&arr_value,
+ CMPI_stringA);
+
+ out:
+ return s;
+}
+
static CMPIStatus set_disk_rasd_params(const CMPIBroker *broker,
const CMPIObjectPath *ref,
const struct virt_device *dev,
@@ -427,6 +488,12 @@ static CMPIStatus set_disk_rasd_params(const CMPIBroker *broker,
(CMPIValue *)&(dev->dev.disk.shareable),
CMPI_boolean);

+ if (dev->dev.disk.address.ct > 0)
+ set_rasd_device_address(broker,
+ ref,
+ &dev->dev.disk.address,
+ inst);
+
virStoragePoolFree(pool);
virStorageVolFree(vol);
virConnectClose(conn);
@@ -590,6 +657,12 @@ static CMPIStatus set_net_rasd_params(const CMPIBroker *broker,
(CMPIValue *)dev->dev.net.poolid,
CMPI_chars);

+ if (dev->dev.net.address.ct > 0)
+ set_rasd_device_address(broker,
+ ref,
+ &dev->dev.net.address,
+ inst);
+
#if LIBVIR_VERSION_NUMBER < 9000
out:
#endif
--
2.1.0

197
SOURCES/libvirt-cim-0.6.3-a8cfd7dc.patch

@ -0,0 +1,197 @@ @@ -0,0 +1,197 @@
From a8cfd7dc6a4f173c764f02688ff0c8aec00ecec2 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Mon, 13 Jan 2014 14:11:21 -0500
Subject: [PATCH 48/48] Use of root/interop instead of root/PG_InterOp

As of tog-pegasus 2.12.1-5 we can no longer use "root/PG_InterOp" namespace
for the CIM provider instead the use of "root/interop" is the preferred
mechanism.

This patch will adjust where libvirt-cim installs its classes to use the
"root/interop" namespace.

For more context, see:

http://www.redhat.com/archives/libvirt-cim/2013-November/msg00083.html

and

http://www.redhat.com/archives/libvirt-cim/2013-November/msg00008.html

This patch does not include the schema changes to FilterList although I
have a suspicion that a bug fix between 2.12.1-8 and 2.12.1-11 has resolved
the issue seen. Cannot find a reference though.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
Makefile.am | 29 ++++++++++++++++++++++++-----
libvirt-cim.spec.in | 27 ++++++++++++++++++++++-----
provider-register.sh | 18 +++++++++++++++++-
3 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 9e8e96b..69b65cf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -78,6 +78,9 @@ INTEROP_MOFS = \
$(top_srcdir)/schema/ReferencedProfile.mof \
$(top_srcdir)/schema/AllocationCapabilities.mof

+# The PGINTEROP_MOFS are used by tog-pegasus up through version 2.12.1
+# If support for versions prior to 2.12.1 is removed, then these defs
+# can go away
PGINTEROP_MOFS = \
$(top_srcdir)/schema/RegisteredProfile.mof \
$(top_srcdir)/schema/ElementConformsToProfile.mof \
@@ -157,6 +160,9 @@ INTEROP_REGS = \
$(top_srcdir)/schema/ElementConformsToProfile.registration \
$(top_srcdir)/schema/ReferencedProfile.registration

+# The PGINTEROP_REGS are used by tog-pegasus up through version 2.12.1
+# If support for versions prior to 2.12.1 is removed, then these defs
+# can go away
PGINTEROP_REGS = \
$(top_srcdir)/schema/RegisteredProfile.registration \
$(top_srcdir)/schema/ElementConformsToProfile.registration \
@@ -181,7 +187,8 @@ EXTRA_DIST = schema $(MOFS) $(REGS) $(INTEROP_MOFS) $(INTEROP_REGS) \
.changeset .revision \
examples/diskpool.conf

-# If Pegasus isn't the CIMOM target, then remove the PG_InterOp namespace from the appropriate files
+# If Pegasus isn't the CIMOM target, then remove the PG_InterOp namespace
+# from the appropriate files
install-data-local:
$(mkinstalldirs) "$(DESTDIR)$(pkgdatadir)"
$(install_sh_DATA) -t "$(DESTDIR)$(pkgdatadir)" $(MOFS)
@@ -189,11 +196,12 @@ install-data-local:
$(install_sh_DATA) -t "$(DESTDIR)$(pkgdatadir)" $(INTEROP_MOFS)
$(install_sh_DATA) -t "$(DESTDIR)$(pkgdatadir)" $(INTEROP_REGS)
if [[ @CIMSERVER@ != pegasus ]]; then \
- sed -i '/^# --/,/^# --!/d' $(subst $(top_srcdir)/schema,$(DESTDIR)$(pkgdatadir), $(PGINTEROP_REGS)); \
+ sed -i '/^# --/,/^# --!/d' $(subst $(top_srcdir)/schema,$(DESTDIR)$(pkgdatadir), $(PGINTEROP_REGS)); \
+ sed -i '/^# --/,/^# --!/d' $(subst $(top_srcdir)/schema,$(DESTDIR)$(pkgdatadir), $(PGINTEROP_MOFS)); \
fi

uninstall-local:
- @list='$(MOFS) $(REGS) $(INTEROP_MOFS) $(INTEROP_REGS)'; \
+ @list='$(MOFS) $(REGS) $(INTEROP_MOFS) $(INTEROP_REGS) $(PGINTEROP_REGS) $(PGINTEROP_MOFS)'; \
for p in $$list; do \
f=`echo "$$p" | sed 's|^.*/||;'`; \
echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
@@ -209,8 +217,19 @@ postinstall:
$(SHELL) provider-register.sh -v -t @CIMSERVER@ -n @CIM_VIRT_NS@ -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(MOFS))
$(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/interop -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_MOFS))
$(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/cimv2 -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_MOFS))
+ #
+ # We need to check the version - if we're not yet at 2.12.1, then
+ # we'll register at root/PG_InterOp; otherwise, using just the above
+ # registration should be sufficient. The actual cutoff root/PG_InterOp
+ # not being valid was 2.12.1-5; however, --version doesn't give us that
+ # level of detail. The Pegasus docs imply that usage of root/interop was
+ # valid as of 2.12.0.
+ #
if [[ @CIMSERVER@ = pegasus ]]; then \
- $(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
+ CIMVER=`@CIMSERVER@ --version | awk -F. '{printf("%02d%02d%02d\n", $1,$2,$3); }'` \
+ if [[ $CIMVER -lt 021201 ]]; then \
+ $(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
+ fi \
fi
virsh -v | grep -q '^0.3' && cp examples/diskpool.conf $(DISK_POOL_CONFIG) || true
mkdir -p $(INFO_STORE)
@@ -220,7 +239,7 @@ preuninstall:
$(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/interop -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_MOFS))
$(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/cimv2 -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_MOFS))
if [[ @CIMSERVER@ = pegasus ]]; then \
- $(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
+ $(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
fi

rpm: clean
diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index 24ef280..01ee329 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -200,6 +200,10 @@ rm -fr $RPM_BUILD_ROOT
%{_datadir}/%{name}/ReferencedProfile.mof \\\
%{_datadir}/%{name}/AllocationCapabilities.mof

+# NOTE: As of Pegasus 2.12.1-5, using root/PG_InterOp will no longer be
+# valid. All mofs can just compile into root/interop. However, we
+# need to keep these here for 'historical purposes'.
+#
%define PGINTEROP_REG %{_datadir}/%{name}/RegisteredProfile.registration \\\
%{_datadir}/%{name}/ElementConformsToProfile.registration \\\
%{_datadir}/%{name}/ReferencedProfile.registration
@@ -268,12 +272,12 @@ fi
%if 0%{?fedora} >= 17 || 0%{?rhel} >= 7
if [ "`systemctl is-active tog-pegasus.service 2> /dev/null`" = "active" ]
then
- systemctl restart tog-pegasus.service
+ systemctl restart tog-pegasus.service > /dev/null 2>&1
fi

if [ "`systemctl is-active sblim-sfcb.service 2> /dev/null`" = "active" ]
then
- systemctl restart sblim-sfcb.service
+ systemctl restart sblim-sfcb.service > /dev/null 2>&1
fi
%else
/etc/init.d/tog-pegasus condrestart
@@ -287,9 +291,22 @@ then
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
- %{_datadir}/%{name}/provider-register.sh -t pegasus \
- -n root/PG_InterOp \
- -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
+ #
+ # We need to check the version - if we're not yet at 2.12.1, then
+ # we'll register at root/PG_InterOp; otherwise, using just the above
+ # registration should be sufficient. The actual cutoff root/PG_InterOp
+ # not being valid was 2.12.1-5; however, --version doesn't give us that
+ # level of detail. The Pegasus docs imply that usage of root/interop was
+ # valid as of 2.12.0.
+ #
+ CIMVER=`/usr/sbin/cimserver --version | \
+ awk -F. '{printf("%02d%02d%02d\n", $1,$2,$3); }'`
+ if [ $CIMVER -lt 021201 ]
+ then
+ %{_datadir}/%{name}/provider-register.sh -t pegasus \
+ -n root/PG_InterOp \
+ -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
+ fi
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/cimv2\
-r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
diff --git a/provider-register.sh b/provider-register.sh
index abe8e95..f66fe54 100755
--- a/provider-register.sh
+++ b/provider-register.sh
@@ -274,7 +274,23 @@ pegasus_install()
chatter Registering providers with $state cimserver '('$version')'
chatter Installing mofs into namespace $namespace from path $mofpath
$CIMMOF -uc -I $mofpath -n $namespace $mymofs &&
- $CIMMOF -uc -n root/PG_Interop $_REGFILENAME
+ #
+ # If compare_version returns false here (e.g. $version is less than
+ # "2.12.1", then we will compile into root/PG_InterOp; otherwise,
+ # compile into root/interop. As of 2.12.1-5 using the PG_InterOp
+ # will fail. Since we cannot get that level of detail out of the
+ # --version output, "assume" that 2.12.1 -> 2.12.1-4 will be able
+ # to use the new namespace. The Pegasus docs imply as of 2.12.0 using
+ # root/interop was preferred.
+ #
+ if compare_version "$version" "2.12.1"
+ then
+ chatter Installing $_REGFILENAME into root/PG_InterOp
+ $CIMMOF -uc -n root/PG_Interop $_REGFILENAME
+ else
+ chatter Installing $_REGFILENAME into root/interop
+ $CIMMOF -uc -n root/interop $_REGFILENAME
+ fi
else
echo "Failed to build pegasus registration MOF." >&2
return 1
--
1.8.5.3

214
SOURCES/libvirt-cim-0.6.3-ace5e8fd.patch

@ -0,0 +1,214 @@ @@ -0,0 +1,214 @@
From ace5e8fdbad269517b347cc496509ce5ff30f2fe Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 7 Oct 2013 16:02:36 +0200
Subject: [PATCH 23/60] Virt_Device: Add a device class for consoles

libvirt-cim has a very strict assumption about the presence
of a CIM_LogicalDevice class being associated to a RASD.
It is practically impossible to extend the cimtest framework
for the ConsoleRASD class without having a matching device class.
Adding a new ConsoleDisplayController class for this purpose.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Daniel Hansel <daniel.hansel@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
schema/DisplayController.mof | 14 ++++++++++++++
schema/DisplayController.registration | 3 +++
src/Virt_Device.c | 6 ++++--
src/Virt_ElementSettingData.c | 3 +++
src/Virt_SettingsDefineState.c | 6 ++++++
src/Virt_SystemDevice.c | 3 +++
src/Virt_VSSDComponent.c | 3 +++
7 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/schema/DisplayController.mof b/schema/DisplayController.mof
index b57c9cc..643b024 100644
--- a/schema/DisplayController.mof
+++ b/schema/DisplayController.mof
@@ -15,3 +15,17 @@ class LXC_DisplayController : CIM_DisplayController
{
};

+[ Provider("cmpi::Virt_Device") ]
+class Xen_ConsoleDisplayController : CIM_DisplayController
+{
+};
+
+[ Provider("cmpi::Virt_Device") ]
+class KVM_ConsoleDisplayController : CIM_DisplayController
+{
+};
+
+[ Provider("cmpi::Virt_Device") ]
+class LXC_ConsoleDisplayController : CIM_DisplayController
+{
+};
diff --git a/schema/DisplayController.registration b/schema/DisplayController.registration
index de8adc9..e7e9770 100644
--- a/schema/DisplayController.registration
+++ b/schema/DisplayController.registration
@@ -3,3 +3,6 @@
Xen_DisplayController root/virt Virt_Device Virt_Device instance
KVM_DisplayController root/virt Virt_Device Virt_Device instance
LXC_DisplayController root/virt Virt_Device Virt_Device instance
+Xen_ConsoleDisplayController root/virt Virt_Device Virt_Device instance
+KVM_ConsoleDisplayController root/virt Virt_Device Virt_Device instance
+LXC_ConsoleDisplayController root/virt Virt_Device Virt_Device instance
diff --git a/src/Virt_Device.c b/src/Virt_Device.c
index aa47276..b93e592 100644
--- a/src/Virt_Device.c
+++ b/src/Virt_Device.c
@@ -263,12 +263,12 @@ static CMPIInstance *console_instance(const CMPIBroker *broker,
conn = virDomainGetConnect(dom);
inst = get_typed_instance(broker,
pfx_from_conn(conn),
- "DisplayController",
+ "ConsoleDisplayController",
ns,
true);

if (inst == NULL) {
- CU_DEBUG("Failed to get instance for DisplayController");
+ CU_DEBUG("Failed to get instance for ConsoleDisplayController");
return NULL;
}

@@ -549,6 +549,8 @@ uint16_t res_type_from_device_classname(const char *classname)
return CIM_RES_TYPE_MEM;
else if (strstr(classname, "Processor"))
return CIM_RES_TYPE_PROC;
+ else if (strstr(classname, "ConsoleDisplayController"))
+ return CIM_RES_TYPE_CONSOLE;
else if (strstr(classname, "DisplayController"))
return CIM_RES_TYPE_GRAPHICS;
else if (strstr(classname, "PointingDevice"))
diff --git a/src/Virt_ElementSettingData.c b/src/Virt_ElementSettingData.c
index c257710..c088e49 100644
--- a/src/Virt_ElementSettingData.c
+++ b/src/Virt_ElementSettingData.c
@@ -128,18 +128,21 @@ static char* resource_allocation_setting_data[] = {
"Xen_NetResourceAllocationSettingData",
"Xen_ProcResourceAllocationSettingData",
"Xen_GraphicsResourceAllocationSettingData",
+ "Xen_ConsoleResourceAllocationSettingData",
"Xen_InputResourceAllocationSettingData",
"KVM_DiskResourceAllocationSettingData",
"KVM_MemResourceAllocationSettingData",
"KVM_NetResourceAllocationSettingData",
"KVM_ProcResourceAllocationSettingData",
"KVM_GraphicsResourceAllocationSettingData",
+ "KVM_ConsoleResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
"LXC_ProcResourceAllocationSettingData",
"LXC_GraphicsResourceAllocationSettingData",
+ "LXC_ConsoleResourceAllocationSettingData",
"LXC_InputResourceAllocationSettingData",
NULL
};
diff --git a/src/Virt_SettingsDefineState.c b/src/Virt_SettingsDefineState.c
index f30f45f..be2ded5 100644
--- a/src/Virt_SettingsDefineState.c
+++ b/src/Virt_SettingsDefineState.c
@@ -327,18 +327,21 @@ static char* logical_device[] = {
"Xen_NetworkPort",
"Xen_LogicalDisk",
"Xen_DisplayController",
+ "Xen_ConsoleDisplayController",
"Xen_PointingDevice",
"KVM_Processor",
"KVM_Memory",
"KVM_NetworkPort",
"KVM_LogicalDisk",
"KVM_DisplayController",
+ "KVM_ConsoleDisplayController",
"KVM_PointingDevice",
"LXC_Processor",
"LXC_Memory",
"LXC_NetworkPort",
"LXC_LogicalDisk",
"LXC_DisplayController",
+ "LXC_ConsoleDisplayController",
"LXC_PointingDevice",
NULL
};
@@ -350,18 +353,21 @@ static char* resource_allocation_setting_data[] = {
"Xen_ProcResourceAllocationSettingData",
"Xen_GraphicsResourceAllocationSettingData",
"Xen_InputResourceAllocationSettingData",
+ "Xen_ConsoleResourceAllocationSettingData",
"KVM_DiskResourceAllocationSettingData",
"KVM_MemResourceAllocationSettingData",
"KVM_NetResourceAllocationSettingData",
"KVM_ProcResourceAllocationSettingData",
"KVM_GraphicsResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
+ "KVM_ConsoleResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
"LXC_ProcResourceAllocationSettingData",
"LXC_GraphicsResourceAllocationSettingData",
"LXC_InputResourceAllocationSettingData",
+ "LXC_ConsoleResourceAllocationSettingData",
NULL
};

diff --git a/src/Virt_SystemDevice.c b/src/Virt_SystemDevice.c
index 3a2f7ce..d2e526d 100644
--- a/src/Virt_SystemDevice.c
+++ b/src/Virt_SystemDevice.c
@@ -135,18 +135,21 @@ static char* part_component[] = {
"Xen_NetworkPort",
"Xen_LogicalDisk",
"Xen_DisplayController",
+ "Xen_ConsoleDisplayController",
"Xen_PointingDevice",
"KVM_Processor",
"KVM_Memory",
"KVM_NetworkPort",
"KVM_LogicalDisk",
"KVM_DisplayController",
+ "KVM_ConsoleDisplayController",
"KVM_PointingDevice",
"LXC_Processor",
"LXC_Memory",
"LXC_NetworkPort",
"LXC_LogicalDisk",
"LXC_DisplayController",
+ "LXC_ConsoleDisplayController",
"LXC_PointingDevice",
NULL
};
diff --git a/src/Virt_VSSDComponent.c b/src/Virt_VSSDComponent.c
index 378de96..35bffde 100644
--- a/src/Virt_VSSDComponent.c
+++ b/src/Virt_VSSDComponent.c
@@ -132,6 +132,7 @@ static char* part_component[] = {
"Xen_NetResourceAllocationSettingData",
"Xen_ProcResourceAllocationSettingData",
"Xen_GraphicsResourceAllocationSettingData",
+ "Xen_ConsoleResourceAllocationSettingData",
"Xen_InputResourceAllocationSettingData",
"KVM_DiskResourceAllocationSettingData",
"KVM_MemResourceAllocationSettingData",
@@ -139,12 +140,14 @@ static char* part_component[] = {
"KVM_ProcResourceAllocationSettingData",
"KVM_GraphicsResourceAllocationSettingData",
"KVM_InputResourceAllocationSettingData",
+ "KVM_ConsoleResourceAllocationSettingData",
"LXC_DiskResourceAllocationSettingData",
"LXC_MemResourceAllocationSettingData",
"LXC_NetResourceAllocationSettingData",
"LXC_ProcResourceAllocationSettingData",
"LXC_GraphicsResourceAllocationSettingData",
"LXC_InputResourceAllocationSettingData",
+ "LXC_ConsoleResourceAllocationSettingData",
NULL
};

--
2.1.0

159
SOURCES/libvirt-cim-0.6.3-ca8e81b3.patch

@ -0,0 +1,159 @@ @@ -0,0 +1,159 @@
From ca8e81b3a3521c68512b7919d55f1e3b91e36a7e Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Tue, 25 Mar 2014 15:20:58 +0800
Subject: [PATCH 54/60] VSMS: Support for domains with controller devices

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 87 ++++++++++++++++++++++++++++++-
1 file changed, 86 insertions(+), 1 deletion(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index e146470..f673c38 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007, 2013
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -1848,6 +1848,56 @@ static const char *input_rasd_to_vdev(CMPIInstance *inst,
return NULL;
}

+static const char *controller_rasd_to_vdev(CMPIInstance *inst,
+ struct virt_device *dev)
+{
+ const char *type_str = NULL;
+ const char *val = NULL;
+ const char *msg = NULL;
+ int ret;
+
+ if (cu_get_str_prop(inst, "ResourceSubType", &type_str) != CMPI_RC_OK) {
+ msg = "ControllerRASD ResourceSubType field not valid";
+ CU_DEBUG("%s", msg);
+ goto out;
+ }
+ dev->dev.controller.type = controller_protocol_type_StrToID(type_str);
+
+ /* Required fields */
+ if (cu_get_u64_prop(inst, "Index",
+ &dev->dev.controller.index) != CMPI_RC_OK) {
+ CU_DEBUG("ControllerRASD Index field not set - DEFAULT");
+ dev->dev.controller.index = CONTROLLER_INDEX_NOT_SET;
+ ret = asprintf(&dev->id, "controller:%s:-1", type_str);
+ } else {
+ /* Formulate our instance id from controller, controller type,
+ * and index value. This should be unique enough.
+ */
+ ret = asprintf(&dev->id, "controller:%s:%" PRIu64,
+ type_str, dev->dev.controller.index);
+ }
+ if (ret == -1) {
+ msg = "Failed to create controller string";
+ CU_DEBUG("%s", msg);
+ goto out;
+ }
+
+ /* Optional fields */
+ if (cu_get_str_prop(inst, "Model", &val) == CMPI_RC_OK)
+ dev->dev.controller.model = strdup(val);
+ if (cu_get_str_prop(inst, "Ports", &val) == CMPI_RC_OK)
+ dev->dev.controller.ports = strdup(val);
+ if (cu_get_str_prop(inst, "Vectors", &val) == CMPI_RC_OK)
+ dev->dev.controller.vectors = strdup(val);
+ if (cu_get_str_prop(inst, "Queues", &val) == CMPI_RC_OK)
+ dev->dev.controller.queues = strdup(val);
+ msg = rasd_to_device_address(inst, &dev->dev.controller.address);
+
+ out:
+
+ return msg;
+}
+
static const char *_sysvirt_rasd_to_vdev(CMPIInstance *inst,
struct virt_device *dev,
uint16_t type,
@@ -1868,6 +1918,8 @@ static const char *_sysvirt_rasd_to_vdev(CMPIInstance *inst,
return console_rasd_to_vdev(inst, dev);
} else if (type == CIM_RES_TYPE_INPUT) {
return input_rasd_to_vdev(inst, dev);
+ } else if (type == CIM_RES_TYPE_CONTROLLER) {
+ return controller_rasd_to_vdev(inst, dev);
}

return "Resource type not supported on this platform";
@@ -1888,6 +1940,8 @@ static const char *_container_rasd_to_vdev(CMPIInstance *inst,
return lxc_proc_rasd_to_vdev(inst, dev);
} else if (type == CIM_RES_TYPE_INPUT) {
return input_rasd_to_vdev(inst, dev);
+ } else if (type == CIM_RES_TYPE_CONTROLLER) {
+ return controller_rasd_to_vdev(inst, dev);
}

return "Resource type not supported on this platform";
@@ -1997,6 +2051,10 @@ static const char *classify_resources(CMPIArray *resources,
if (!make_space(&domain->dev_input, domain->dev_input_ct, count))
return "Failed to alloc input list";

+ if (!make_space(&domain->dev_controller, domain->dev_controller_ct,
+ count))
+ return "Failed to alloc controller list";
+
for (i = 0; i < count; i++) {
CMPIObjectPath *op;
CMPIData item;
@@ -2111,7 +2169,23 @@ static const char *classify_resources(CMPIArray *resources,
&domain->dev_input[0],
ns,
p_error);
+ } else if (type == CIM_RES_TYPE_CONTROLLER) {
+ struct virt_device dev;
+ int ccount = count + domain->dev_controller_ct;
+
+ memset(&dev, 0, sizeof(dev));
+ msg = rasd_to_vdev(inst,
+ domain,
+ &dev,
+ ns,
+ p_error);
+ if (msg == NULL)
+ msg = add_device_nodup(&dev,
+ domain->dev_controller,
+ ccount,
+ &domain->dev_controller_ct);
}
+
if (msg != NULL)
return msg;

@@ -2918,6 +2992,9 @@ static struct virt_device **find_list(struct domain *dominfo,
} else if (type == CIM_RES_TYPE_INPUT) {
list = &dominfo->dev_input;
*count = &dominfo->dev_input_ct;
+ } else if (type == CIM_RES_TYPE_CONTROLLER) {
+ list = &dominfo->dev_controller;
+ *count = &dominfo->dev_controller_ct;
}

return list;
@@ -3119,6 +3196,14 @@ static CMPIStatus resource_add(struct domain *dominfo,
goto out;
}

+ if (type == CIM_RES_TYPE_CONTROLLER &&
+ dev != NULL && dev->id == NULL) {
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Add resource failed: Index property is required.");
+ goto out;
+ }
+
if ((type == CIM_RES_TYPE_GRAPHICS) ||
(type == CIM_RES_TYPE_INPUT) ||
(type == CIM_RES_TYPE_CONSOLE)) {
--
2.1.0

198
SOURCES/libvirt-cim-0.6.3-d75cae45.patch

@ -0,0 +1,198 @@ @@ -0,0 +1,198 @@
From d75cae45933638648d772a5e5f140017b83c019c Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 14 Oct 2013 17:29:44 +0200
Subject: [PATCH 29/60] VSMS: Improve device cleanup

Use cleanup_virt_device instead of single free's all over
the place in net_rasd_to_vdev and disk_rasd_to_vdev.
Further, make sure that the device type is always set
independent of the implementation of the xxx_rasd_to_vdev
functions.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 35 +++++++------------------------
1 file changed, 8 insertions(+), 27 deletions(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index b813be6..6548d08 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -964,17 +964,15 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
}
*/

- free(dev->dev.net.mac);
+ cleanup_virt_device(dev);
+
dev->dev.net.mac = strdup(val);

- free(dev->id);
dev->id = strdup(dev->dev.net.mac);

- free(dev->dev.net.type);
if (cu_get_str_prop(inst, "NetworkType", &val) != CMPI_RC_OK)
return "No Network Type specified";

- free(dev->dev.net.source);
if (STREQC(val, BRIDGE_TYPE)) {
dev->dev.net.type = strdup(BRIDGE_TYPE);
if (cu_get_str_prop(inst, "NetworkName", &val) == CMPI_RC_OK)
@@ -1011,44 +1009,37 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
else
return "No Source Device specified";

- free(dev->dev.net.vsi.vsi_type);
if (cu_get_str_prop(inst, "VSIType", &val) != CMPI_RC_OK)
dev->dev.net.vsi.vsi_type = NULL;
else
dev->dev.net.vsi.vsi_type = strdup(val);

- free(dev->dev.net.vsi.manager_id);
if (cu_get_str_prop(inst, "VSIManagerID", &val) != CMPI_RC_OK)
dev->dev.net.vsi.manager_id = NULL;
else
dev->dev.net.vsi.manager_id = strdup(val);

- free(dev->dev.net.vsi.type_id);
if (cu_get_str_prop(inst, "VSITypeID", &val) != CMPI_RC_OK)
dev->dev.net.vsi.type_id = NULL;
else
dev->dev.net.vsi.type_id = strdup(val);

- free(dev->dev.net.vsi.type_id_version);
if (cu_get_str_prop(inst, "VSITypeIDVersion", &val) !=
CMPI_RC_OK)
dev->dev.net.vsi.type_id_version = NULL;
else
dev->dev.net.vsi.type_id_version = strdup(val);

- free(dev->dev.net.vsi.instance_id);
if (cu_get_str_prop(inst, "VSIInstanceID", &val) != CMPI_RC_OK)
dev->dev.net.vsi.instance_id = NULL;
else
dev->dev.net.vsi.instance_id = strdup(val);

- free(dev->dev.net.vsi.filter_ref);
if (cu_get_str_prop(inst, "FilterRef", &val) != CMPI_RC_OK)
dev->dev.net.vsi.filter_ref = NULL;
else
dev->dev.net.vsi.filter_ref = strdup(val);

- free(dev->dev.net.vsi.profile_id);
if (cu_get_str_prop(inst, "ProfileID", &val) != CMPI_RC_OK)
dev->dev.net.vsi.profile_id = NULL;
else
@@ -1057,20 +1048,16 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
} else
return "Invalid Network Type specified";

- free(dev->dev.net.device);
if (cu_get_str_prop(inst, "VirtualDevice", &val) != CMPI_RC_OK)
dev->dev.net.device = NULL;
else
dev->dev.net.device = strdup(val);

- free(dev->dev.net.net_mode);
if (cu_get_str_prop(inst, "NetworkMode", &val) != CMPI_RC_OK)
dev->dev.net.net_mode = NULL;
else
dev->dev.net.net_mode = strdup(val);

- free(dev->dev.net.model);
-
if (cu_get_str_prop(inst, "ResourceSubType", &val) != CMPI_RC_OK)
dev->dev.net.model = NULL;
else
@@ -1106,13 +1093,13 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
if (cu_get_str_prop(inst, "VirtualDevice", &val) != CMPI_RC_OK)
return "Missing `VirtualDevice' property";

- free(dev->dev.disk.virtual_dev);
+ cleanup_virt_device(dev);
+
dev->dev.disk.virtual_dev = strdup(val);

if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK)
val = "/dev/null";

- free(dev->dev.disk.source);
dev->dev.disk.source = strdup(val);
if (dev->dev.disk.source == NULL) {
return "dev->dev.disk.source is null!";
@@ -1149,7 +1136,6 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
}
if (XSTREQ(dev->dev.disk.source, "/dev/null")) {
dev->dev.disk.disk_type = DISK_FILE;
- free(dev->dev.disk.source);
dev->dev.disk.source = strdup("");
}

@@ -1170,31 +1156,26 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
else
dev->dev.disk.readonly = read;

- free(dev->dev.disk.bus_type);
if (cu_get_str_prop(inst, "BusType", &val) != CMPI_RC_OK)
dev->dev.disk.bus_type = NULL;
else
dev->dev.disk.bus_type = strdup(val);

- free(dev->dev.disk.driver);
if (cu_get_str_prop(inst, "DriverName", &val) != CMPI_RC_OK)
dev->dev.disk.driver = NULL;
else
dev->dev.disk.driver = strdup(val);

- free(dev->dev.disk.driver_type);
if (cu_get_str_prop(inst, "DriverType", &val) != CMPI_RC_OK)
dev->dev.disk.driver_type = NULL;
else
dev->dev.disk.driver_type = strdup(val);

- free(dev->dev.disk.cache);
if (cu_get_str_prop(inst, "DriverCache", &val) != CMPI_RC_OK)
dev->dev.disk.cache = NULL;
else
dev->dev.disk.cache = strdup(val);

- free(dev->dev.disk.access_mode);
if (cu_get_str_prop(inst, "AccessMode", &val) != CMPI_RC_OK)
dev->dev.disk.access_mode = NULL;
else
@@ -1205,7 +1186,6 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
else
dev->dev.disk.shareable = shareable;

- free(dev->id);
dev->id = strdup(dev->dev.disk.virtual_dev);

msg = rasd_to_device_address(inst, &dev->dev.disk.address);
@@ -1921,12 +1901,14 @@ static const char *rasd_to_vdev(CMPIInstance *inst,
goto out;
}

- dev->type = (int)type;
-
if (domain->type == DOMAIN_LXC)
msg = _container_rasd_to_vdev(inst, dev, type, ns);
else
msg = _sysvirt_rasd_to_vdev(inst, dev, type, ns, p_error);
+
+ /* ensure device type is set */
+ if (msg == NULL)
+ dev->type = type;
out:
if (msg && op)
CU_DEBUG("rasd_to_vdev(%s): %s", CLASSNAME(op), msg);
@@ -3112,7 +3094,6 @@ static CMPIStatus resource_add(struct domain *dominfo,

dev = &list[*count];

- dev->type = type;
msg = rasd_to_vdev(rasd, dominfo, dev, ns, &error_msg);
if (msg != NULL) {
cu_statusf(_BROKER, &s,
--
2.1.0

129
SOURCES/libvirt-cim-0.6.3-d9414e36.patch

@ -0,0 +1,129 @@ @@ -0,0 +1,129 @@
From d9414e36cc8e23f938ce10260c6a2a7e68c72739 Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Mon, 3 Mar 2014 09:04:18 +0800
Subject: [PATCH 48/60] Add rawio property support

Add the 'rawio' property to the DiskRASD and parse/save it properly

Once installed on the target system, use:

wbemcli gcd http://root:password@localhost:5988/root/virt:KVM_DiskResourceAllocationSettingData | grep rawio

to determine if property exists in MOF. Using 'wbemcli ei' will determine
whether or not it shows up in the enumarated instance(s) - if there are
any on the system

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 4 ++++
libxkutil/device_parsing.h | 1 +
libxkutil/xmlgen.c | 2 ++
schema/ResourceAllocationSettingData.mof | 3 +++
src/Virt_RASD.c | 6 ++++++
src/Virt_VirtualSystemManagementService.c | 5 +++++
6 files changed, 21 insertions(+)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index c9ae886..6b29a2d 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -92,6 +92,7 @@ static void cleanup_disk_device(struct disk_device *dev)
free(dev->source);
free(dev->virtual_dev);
free(dev->bus_type);
+ free(dev->rawio);
free(dev->access_mode);
cleanup_device_address(&dev->address);
}
@@ -512,6 +513,8 @@ static int parse_block_device(xmlNode *dnode, struct virt_device **vdevs)
if (ddev->device == NULL)
goto err;

+ ddev->rawio = get_attr_value(dnode, "rawio");
+
for (child = dnode->children; child != NULL; child = child->next) {
if (XSTREQ(child->name, "driver")) {
ddev->driver = get_attr_value(child, "name");
@@ -1315,6 +1318,7 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
DUP_FIELD(dev, _dev, dev.disk.device);
DUP_FIELD(dev, _dev, dev.disk.driver);
DUP_FIELD(dev, _dev, dev.disk.driver_type);
+ DUP_FIELD(dev, _dev, dev.disk.rawio);
DUP_FIELD(dev, _dev, dev.disk.cache);
DUP_FIELD(dev, _dev, dev.disk.source);
DUP_FIELD(dev, _dev, dev.disk.virtual_dev);
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 92427c1..a8cf7aa 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -56,6 +56,7 @@ struct disk_device {
char *driver_type;
char *source;
char *virtual_dev;
+ char *rawio;
enum {DISK_UNKNOWN, DISK_PHY, DISK_FILE, DISK_FS} disk_type;
bool readonly;
bool shareable;
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 931f0c9..2f0f475 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -212,6 +212,8 @@ static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
xmlNewProp(disk, BAD_CAST "type", BAD_CAST "block");
if (dev->device)
xmlNewProp(disk, BAD_CAST "device", BAD_CAST dev->device);
+ if (dev->rawio)
+ xmlNewProp(disk, BAD_CAST "rawio", BAD_CAST dev->rawio);

if (dev->driver) {
tmp = xmlNewChild(disk, NULL, BAD_CAST "driver", NULL);
diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index bf1fbb6..5228f4b 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -65,6 +65,9 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData
[Description ("filesystem access mode")]
string AccessMode;

+ [Description ("rawio value of lun device")]
+ string rawio;
+
[Description ("if device is shareable")]
boolean shareable;

diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index df1e921..0800311 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -482,6 +482,12 @@ static CMPIStatus set_disk_rasd_params(const CMPIBroker *broker,
(CMPIValue *)dev->dev.disk.access_mode,
CMPI_chars);

+ if(dev->dev.disk.rawio)
+ CMSetProperty(inst,
+ "rawio",
+ (CMPIValue *)dev->dev.disk.rawio,
+ CMPI_chars);
+
if(dev->dev.disk.shareable)
CMSetProperty(inst,
"shareable",
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 3e7785e..a9f7ae0 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1184,6 +1184,11 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
else
dev->dev.disk.access_mode = strdup(val);

+ if (cu_get_str_prop(inst, "rawio", &val) != CMPI_RC_OK)
+ dev->dev.disk.rawio = NULL;
+ else
+ dev->dev.disk.rawio = strdup(val);
+
if (cu_get_bool_prop(inst, "shareable", &shareable) != CMPI_RC_OK)
dev->dev.disk.shareable = false;
else
--
2.1.0

111
SOURCES/libvirt-cim-0.6.3-de03c66f.patch

@ -0,0 +1,111 @@ @@ -0,0 +1,111 @@
From de03c66f06549081fef4d5600eb9a2136664a0fa Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Mon, 19 Aug 2013 17:11:10 +0800
Subject: [PATCH 05/48] Add dumpCore tag support to memory

dumpCore tag in the <memory> is not supported by libvirt-cim and
it will be dropped during updating any element in the xml definition
of a domain. This patch keep the tag all the time.

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 28 +++++++++++++++++++++++++++-
libxkutil/device_parsing.h | 3 +++
libxkutil/xmlgen.c | 9 +++++++++
3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index ffdf682..542e4e9 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -606,8 +606,17 @@ static int parse_mem_device(xmlNode *node, struct virt_device **vdevs)

if (XSTREQ(node->name, "currentMemory"))
sscanf(content, "%" PRIu64, &mdev->size);
- else if (XSTREQ(node->name, "memory"))
+ else if (XSTREQ(node->name, "memory")) {
sscanf(content, "%" PRIu64, &mdev->maxsize);
+ content = get_attr_value(node, "dumpCore");
+ if (content && XSTREQ(content, "on")) {
+ mdev->dumpCore = MEM_DUMP_CORE_ON;
+ } else if (content && XSTREQ(content, "off")) {
+ mdev->dumpCore = MEM_DUMP_CORE_OFF;
+ } else {
+ mdev->dumpCore = MEM_DUMP_CORE_NOT_SET;
+ }
+ }

free(content);

@@ -969,6 +978,7 @@ static int _get_mem_device(const char *xml, struct virt_device **list)
struct virt_device *mdevs = NULL;
struct virt_device *mdev = NULL;
int ret;
+ bool mem_dump_core_set = false;

ret = parse_devices(xml, &mdevs, CIM_RES_TYPE_MEM);
if (ret <= 0)
@@ -988,10 +998,26 @@ static int _get_mem_device(const char *xml, struct virt_device **list)
mdevs[1].dev.mem.size);
mdev->dev.mem.maxsize = MAX(mdevs[0].dev.mem.maxsize,
mdevs[1].dev.mem.maxsize);
+ /* libvirt dumpCore tag always belong to memory xml node, but
+ * here we may have two mdev for memory node and currentMemory
+ * node. So pick up one value.
+ */
+ if (mdevs[0].dev.mem.dumpCore != MEM_DUMP_CORE_NOT_SET) {
+ mdev->dev.mem.dumpCore = mdevs[0].dev.mem.dumpCore;
+ mem_dump_core_set = true;
+ } else if (mdevs[1].dev.mem.dumpCore !=
+ MEM_DUMP_CORE_NOT_SET) {
+ if (mem_dump_core_set) {
+ CU_DEBUG("WARN: libvirt set memory core dump in"
+ "two nodes!");
+ }
+ mdev->dev.mem.dumpCore = mdevs[1].dev.mem.dumpCore;
+ }
} else {
mdev->dev.mem.size = MAX(mdevs[0].dev.mem.size,
mdevs[0].dev.mem.maxsize);
mdev->dev.mem.maxsize = mdev->dev.mem.size;
+ mdev->dev.mem.dumpCore = mdevs[0].dev.mem.dumpCore;
}

mdev->type = CIM_RES_TYPE_MEM;
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 2b6d3d1..979b792 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -75,6 +75,9 @@ struct net_device {
struct mem_device {
uint64_t size;
uint64_t maxsize;
+ enum { MEM_DUMP_CORE_NOT_SET,
+ MEM_DUMP_CORE_ON,
+ MEM_DUMP_CORE_OFF } dumpCore;
};

struct vcpu_device {
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 4287d42..30e9a5e 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -498,6 +498,15 @@ static const char *mem_xml(xmlNodePtr root, struct domain *dominfo)
BAD_CAST string);

free(string);
+
+ if (tmp == NULL)
+ return XML_ERROR;
+ if (mem->dumpCore == MEM_DUMP_CORE_ON) {
+ xmlNewProp(tmp, BAD_CAST "dumpCore", BAD_CAST "on");
+ } else if (mem->dumpCore == MEM_DUMP_CORE_OFF) {
+ xmlNewProp(tmp, BAD_CAST "dumpCore", BAD_CAST "off");
+ }
+
out:
if (tmp == NULL)
return XML_ERROR;
--
1.8.5.3

251
SOURCES/libvirt-cim-0.6.3-de34dda2.patch

@ -0,0 +1,251 @@ @@ -0,0 +1,251 @@
From de34dda20f1e9d88075202ff3257a10cc87fbca6 Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Thu, 27 Mar 2014 11:10:35 -0400
Subject: [PATCH 53/60] Set fields in mofs for Controller Device/RASD

Set basic fields for the KVM_Controller instance based on the read XML
from the virtual controller device structure.

Set the various KVM_ControllerRASD fields based on the read XML from
the virtual controller device structure

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_Device.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
src/Virt_RASD.c | 57 +++++++++++++++++++++++++++++++++++++++++++++-
src/svpc_types.h | 3 ++-
3 files changed, 124 insertions(+), 4 deletions(-)

diff --git a/src/Virt_Device.c b/src/Virt_Device.c
index 12ae6bd..60465b7 100644
--- a/src/Virt_Device.c
+++ b/src/Virt_Device.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -366,6 +366,61 @@ static CMPIInstance *input_instance(const CMPIBroker *broker,
return inst;
}

+static int controller_set_attr(const CMPIBroker *broker,
+ CMPIInstance *instance,
+ struct controller_device *dev)
+{
+ const char *type_str;
+
+ type_str = controller_protocol_type_IDToStr(dev->type);
+ if (type_str == NULL) {
+ CU_DEBUG("controller type=%d fails to return string", dev->type);
+ return 0;
+ }
+
+ CMSetProperty(instance, "ProtocolSupported",
+ (CMPIValue *)&dev->type,
+ CMPI_uint16);
+
+ if (dev->model)
+ CMSetProperty(instance, "ProtocolDescription",
+ (CMPIValue *)dev->model,
+ CMPI_chars);
+
+ return 1;
+}
+
+static CMPIInstance *controller_instance(const CMPIBroker *broker,
+ struct controller_device *dev,
+ const virDomainPtr dom,
+ const char *ns)
+{
+ CMPIInstance *inst;
+ virConnectPtr conn;
+
+ CU_DEBUG("controller_instance");
+
+ conn = virDomainGetConnect(dom);
+ inst = get_typed_instance(broker,
+ pfx_from_conn(conn),
+ "Controller",
+ ns,
+ true);
+ if (inst == NULL) {
+ CU_DEBUG("Failed to get instance of %s_Controller",
+ pfx_from_conn(conn));
+ return NULL;
+ }
+
+
+ if (!controller_set_attr(broker, inst, dev)) {
+ CU_DEBUG("Failed to set contoller attributes of %s_Controller",
+ pfx_from_conn(conn));
+ return NULL;
+ }
+
+ return inst;
+}
static int device_set_devid(CMPIInstance *instance,
struct virt_device *dev,
const virDomainPtr dom)
@@ -488,6 +543,8 @@ static bool device_instances(const CMPIBroker *broker,
for (i = 0; i < count; i++) {
struct virt_device *dev = &devs[i];

+ CU_DEBUG("device_instance dev->type=%d", dev->type);
+
if (dev->type == CIM_RES_TYPE_NET)
instance = net_instance(broker,
&dev->dev.net,
@@ -516,11 +573,16 @@ static bool device_instances(const CMPIBroker *broker,
&dev->dev.console,
dom,
ns);
- else if (dev->type == CIM_RES_TYPE_INPUT)
+ else if (dev->type == CIM_RES_TYPE_INPUT)
instance = input_instance(broker,
&dev->dev.input,
dom,
ns);
+ else if (dev->type == CIM_RES_TYPE_CONTROLLER)
+ instance = controller_instance(broker,
+ &dev->dev.controller,
+ dom,
+ ns);
else
return false;

@@ -555,6 +617,8 @@ uint16_t res_type_from_device_classname(const char *classname)
return CIM_RES_TYPE_GRAPHICS;
else if (strstr(classname, "PointingDevice"))
return CIM_RES_TYPE_INPUT;
+ else if (strstr(classname, "Controller"))
+ return CIM_RES_TYPE_CONTROLLER;
else
return CIM_RES_TYPE_UNKNOWN;
}
diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index abfb09f..3c62c2d 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007, 2013
+ * Copyright IBM Corp. 2007-2014
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -915,6 +915,51 @@ static CMPIStatus set_input_rasd_params(const struct virt_device *dev,
return s;
}

+static CMPIStatus set_controller_rasd_params(const CMPIBroker *broker,
+ const CMPIObjectPath *ref,
+ const struct virt_device *dev,
+ CMPIInstance *inst)
+{
+ const char *type_str;
+ CMPIStatus s = {CMPI_RC_OK, NULL};
+
+ type_str = controller_protocol_type_IDToStr(dev->dev.controller.type);
+ if (type_str == NULL) {
+ CU_DEBUG("controller type=%d fails to return string",
+ dev->type);
+ return s;
+ }
+ CMSetProperty(inst, "OtherResourceType", "controller", CMPI_chars);
+ CMSetProperty(inst, "ResourceSubType",
+ (CMPIValue *)type_str, CMPI_chars);
+ CMSetProperty(inst, "Index",
+ (CMPIValue *)&(dev->dev.controller.index), CMPI_uint64);
+
+ if (dev->dev.controller.model)
+ CMSetProperty(inst, "Model",
+ (CMPIValue *)dev->dev.controller.model, CMPI_chars);
+
+ if (dev->dev.controller.ports)
+ CMSetProperty(inst, "Ports",
+ (CMPIValue *)dev->dev.controller.ports, CMPI_chars);
+
+ if (dev->dev.controller.vectors)
+ CMSetProperty(inst, "Vectors",
+ (CMPIValue *)dev->dev.controller.vectors, CMPI_chars);
+
+ if (dev->dev.controller.queues)
+ CMSetProperty(inst, "Queues",
+ (CMPIValue *)dev->dev.controller.queues, CMPI_chars);
+
+ if (dev->dev.controller.address.ct > 0)
+ set_rasd_device_address(broker,
+ ref,
+ &dev->dev.controller.address,
+ inst);
+
+ return s;
+}
+
CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
struct virt_device *dev,
const char *host,
@@ -949,6 +994,9 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
} else if (dev->type == CIM_RES_TYPE_INPUT) {
type = CIM_RES_TYPE_INPUT;
base = "InputResourceAllocationSettingData";
+ } else if (dev->type == CIM_RES_TYPE_CONTROLLER) {
+ type = CIM_RES_TYPE_OTHER;
+ base = "ControllerResourceAllocationSettingData";
} else {
return NULL;
}
@@ -1004,6 +1052,8 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
s = set_input_rasd_params(dev, inst);
} else if (dev->type == CIM_RES_TYPE_CONSOLE) {
s = set_console_rasd_params(dev, inst);
+ } else if (dev->type == CIM_RES_TYPE_CONTROLLER) {
+ s = set_controller_rasd_params(broker, ref, dev, inst);
}

/* FIXME: Put the HostResource in place */
@@ -1138,6 +1188,8 @@ CMPIrc res_type_from_rasd_classname(const char *cn, uint16_t *type)
*type = CIM_RES_TYPE_IMAGE;
else if (STREQ(base, "ConsoleResourceAllocationSettingData"))
*type = CIM_RES_TYPE_CONSOLE;
+ else if (STREQ(base, "ControllerResourceAllocationSettingData"))
+ *type = CIM_RES_TYPE_CONTROLLER;
else
goto out;

@@ -1175,6 +1227,9 @@ CMPIrc rasd_classname_from_type(uint16_t type, const char **classname)
case CIM_RES_TYPE_INPUT:
*classname = "InputResourceAllocationSettingData";
break;
+ case CIM_RES_TYPE_CONTROLLER:
+ *classname = "ControllerResourceAllocationSettingData";
+ break;
default:
rc = CMPI_RC_ERR_FAILED;
}
diff --git a/src/svpc_types.h b/src/svpc_types.h
index d9f8032..6270233 100644
--- a/src/svpc_types.h
+++ b/src/svpc_types.h
@@ -42,7 +42,7 @@
#define CIM_RES_TYPE_EMU 32770
#define CIM_RES_TYPE_CONTROLLER 32771

-#define CIM_RES_TYPE_COUNT 7
+#define CIM_RES_TYPE_COUNT 8
const static int cim_res_types[CIM_RES_TYPE_COUNT] =
{CIM_RES_TYPE_NET,
CIM_RES_TYPE_DISK,
@@ -51,6 +51,7 @@ const static int cim_res_types[CIM_RES_TYPE_COUNT] =
CIM_RES_TYPE_GRAPHICS,
CIM_RES_TYPE_INPUT,
CIM_RES_TYPE_CONSOLE,
+ CIM_RES_TYPE_CONTROLLER,
};

#define CIM_VSSD_RECOVERY_NONE 2
--
2.1.0

38
SOURCES/libvirt-cim-0.6.3-ee74ebc1.patch

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
From ee74ebc122c60e86dd02442589b880c367a4eb9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
Date: Wed, 21 Aug 2013 15:35:28 +0200
Subject: [PATCH 04/48] libvirt-cim.spec.in: Uninstall open-pegasus-specific
providers from sfcb
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Older libvirt-cim might've installed these in the sblim-sfcb
repository, causing errors when calling sfcbrepos on libvirt-cim update.

Signed-off-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libvirt-cim.spec.in | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index a027246..cd399b1 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -84,6 +84,13 @@ rm -fr $RPM_BUILD_ROOT
-n @CIM_VIRT_NS@ \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true

+# Remove open-pegasus-specific providers installed in sfcb repository
+# by older libvirt-cim packages
+%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+ -n root/PG_InterOp \
+ -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
+
+
%post
/sbin/ldconfig

--
1.8.5.3

39
SOURCES/libvirt-cim-0.6.3-ee84e10f.patch

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
From ee84e10f3daba3050b17904c34b05db0765736d4 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:35 +0200
Subject: [PATCH 15/60] VSMS: Set resource types for default devices

The default graphics and input devices were built without their
resource types being set correctly. This has not hurted yet.
Future changes will however require that the device resource
type is matching the actual device type.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 79dec73..6629b35 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -581,6 +581,7 @@ static bool default_graphics_device(struct domain *domain)
return false;
}

+ domain->dev_graphics->type = CIM_RES_TYPE_GRAPHICS;
domain->dev_graphics->dev.graphics.type = strdup("vnc");
domain->dev_graphics->dev.graphics.dev.vnc.port = strdup("-1");
domain->dev_graphics->dev.graphics.dev.vnc.host = strdup("127.0.0.1");
@@ -609,6 +610,7 @@ static bool default_input_device(struct domain *domain)
return false;
}

+ domain->dev_input->type = CIM_RES_TYPE_INPUT;
domain->dev_input->dev.input.type = strdup("mouse");

if (domain->type == DOMAIN_XENPV) {
--
2.1.0

71
SOURCES/libvirt-cim-0.6.3-f18ba715.patch

@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
From f18ba71595815c820742e2f12cc30481fc510642 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Fri, 30 Aug 2013 14:12:20 +0200
Subject: [PATCH 13/48] build: Don't use /bin/sh unconditionally

provider-register.sh implicitly assumes that the shell has bash-like
capabilities. On systems like Ubuntu this is not the case leading
to a make postinstall failure when used with Pegasus.
Changing the script shebang to /bin/bash to make this explicit.
Further replace occurrences of sh to $(SHELL) in the Makefile
invocations of provider-register.sh.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
Makefile.am | 18 +++++++++---------
provider-register.sh | 2 +-
2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 63ed3c7..9e8e96b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -201,26 +201,26 @@ uninstall-local:
done

preinstall:
- sh -x base_schema/install_base_schema.sh `pwd`/base_schema
+ $(SHELL) -x base_schema/install_base_schema.sh `pwd`/base_schema

# Un/Register the providers and class definitions from/to the current CIMOM.
# @CIMSERVER@ is set by the configure script
postinstall:
- sh provider-register.sh -v -t @CIMSERVER@ -n @CIM_VIRT_NS@ -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(MOFS))
- sh provider-register.sh -v -t @CIMSERVER@ -n root/interop -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_MOFS))
- sh provider-register.sh -v -t @CIMSERVER@ -n root/cimv2 -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_MOFS))
+ $(SHELL) provider-register.sh -v -t @CIMSERVER@ -n @CIM_VIRT_NS@ -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(MOFS))
+ $(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/interop -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_MOFS))
+ $(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/cimv2 -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_MOFS))
if [[ @CIMSERVER@ = pegasus ]]; then \
- sh provider-register.sh -v -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
+ $(SHELL) provider-register.sh -v -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
fi
virsh -v | grep -q '^0.3' && cp examples/diskpool.conf $(DISK_POOL_CONFIG) || true
mkdir -p $(INFO_STORE)

preuninstall:
- sh provider-register.sh -v -d -t @CIMSERVER@ -n @CIM_VIRT_NS@ -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(MOFS))
- sh provider-register.sh -v -d -t @CIMSERVER@ -n root/interop -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_MOFS))
- sh provider-register.sh -v -d -t @CIMSERVER@ -n root/cimv2 -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_MOFS))
+ $(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n @CIM_VIRT_NS@ -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(MOFS))
+ $(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/interop -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(INTEROP_MOFS))
+ $(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/cimv2 -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(CIMV2_MOFS))
if [[ @CIMSERVER@ = pegasus ]]; then \
- sh provider-register.sh -v -d -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
+ $(SHELL) provider-register.sh -v -d -t @CIMSERVER@ -n root/PG_InterOp -r $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_REGS)) -m $(subst $(top_srcdir)/schema,$(pkgdatadir), $(PGINTEROP_MOFS)); \
fi

rpm: clean
diff --git a/provider-register.sh b/provider-register.sh
index b907df1..b730ef3 100755
--- a/provider-register.sh
+++ b/provider-register.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
# $Id$
# ==================================================================
# Copyright IBM Corp. 2005
--
1.8.5.3

124
SOURCES/libvirt-cim-0.6.3-f6b7eeaf.patch

@ -0,0 +1,124 @@ @@ -0,0 +1,124 @@
From f6b7eeaf097b6441ed7928c7130582a83bba5f7d Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Fri, 6 Sep 2013 14:09:55 +0200
Subject: [PATCH 13/60] libxkutil: Plug memory leaks in device parsing

Fixed a number of memory leaks detected while running xml_parse_test
under valgrind.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 31 +++++++++++++++++++++----------
1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index fa9f998..f55061e 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -95,6 +95,8 @@ static void cleanup_net_device(struct net_device *dev)
free(dev->device);
free(dev->net_mode);
free(dev->filter_ref);
+ free(dev->poolid);
+ cleanup_vsi_device(&dev->vsi);
}

static void cleanup_emu_device(struct emu_device *dev)
@@ -566,6 +568,8 @@ static int parse_mem_device(xmlNode *node, struct virt_device **vdevs)
struct virt_device *vdev = NULL;
struct mem_device *mdev = NULL;
char *content = NULL;
+ char *tmpval = NULL;
+ int ret = 0;

vdev = calloc(1, sizeof(*vdev));
if (vdev == NULL)
@@ -579,27 +583,26 @@ static int parse_mem_device(xmlNode *node, struct virt_device **vdevs)
sscanf(content, "%" PRIu64, &mdev->size);
else if (XSTREQ(node->name, "memory")) {
sscanf(content, "%" PRIu64, &mdev->maxsize);
- content = get_attr_value(node, "dumpCore");
- if (content && XSTREQ(content, "on")) {
+ tmpval = get_attr_value(node, "dumpCore");
+ if (tmpval && XSTREQ(tmpval, "on")) {
mdev->dumpCore = MEM_DUMP_CORE_ON;
- } else if (content && XSTREQ(content, "off")) {
+ } else if (tmpval && XSTREQ(content, "off")) {
mdev->dumpCore = MEM_DUMP_CORE_OFF;
} else {
mdev->dumpCore = MEM_DUMP_CORE_NOT_SET;
}
}

- free(content);
-
*vdevs = vdev;
-
- return 1;
+ vdev = NULL;
+ ret = 1;

err:
free(content);
+ free(tmpval);
free(vdev);

- return 0;
+ return ret;
}

static char *get_attr_value_default(xmlNode *node, char *attrname,
@@ -787,7 +790,10 @@ static int do_parse(xmlNodeSet *nsv, dev_parse_func_t do_real_parse,
}

out:
- *l = list;
+ if (list) {
+ free(*l);
+ *l = list;
+ }
return lstidx;
}

@@ -1203,7 +1209,7 @@ static int parse_features(struct domain *dominfo, xmlNode *features)

static void set_action(int *val, xmlNode *child)
{
- const char *action = (char *)xmlNodeGetContent(child);
+ char *action = (char *)xmlNodeGetContent(child);

if (action == NULL)
*val = CIM_VSSD_RECOVERY_NONE;
@@ -1215,6 +1221,8 @@ static void set_action(int *val, xmlNode *child)
*val = CIM_VSSD_RECOVERY_RESTART;
else
*val = CIM_VSSD_RECOVERY_NONE;
+
+ xmlFree(action);
}

static int parse_domain(xmlNodeSet *nsv, struct domain *dominfo)
@@ -1366,9 +1374,11 @@ void cleanup_dominfo(struct domain **dominfo)

dom = *dominfo;
free(dom->name);
+ free(dom->typestr);
free(dom->uuid);
free(dom->bootloader);
free(dom->bootloader_args);
+ free(dom->clock);

if (dom->type == DOMAIN_XENPV) {
free(dom->os_info.pv.type);
@@ -1390,6 +1400,7 @@ void cleanup_dominfo(struct domain **dominfo)
CU_DEBUG("Unknown domain type %i", dom->type);
}

+ cleanup_virt_devices(&dom->dev_emu, 1);
cleanup_virt_devices(&dom->dev_mem, dom->dev_mem_ct);
cleanup_virt_devices(&dom->dev_net, dom->dev_net_ct);
cleanup_virt_devices(&dom->dev_disk, dom->dev_disk_ct);
--
2.1.0

171
SOURCES/libvirt-cim-0.6.3-f70a8ea0.patch

@ -0,0 +1,171 @@ @@ -0,0 +1,171 @@
From f70a8ea0305c82d14e47d08f2e130f8e11b0e9b3 Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 7 Oct 2013 16:02:35 +0200
Subject: [PATCH 22/60] libxkutil: Simplify XML handling of consoles

The attempt to avoid duplication of console definitions was a bit
too complicated and error prone. We move the generation of console
XML entirely to the new console code.
Further, it's incorrect to restrict PTY consoles being represented
as GraphicsRASDs to virtio only. At least serial must be allowed,
but it doesn't really hurt to map all PTYs to GraphicsRASD consoles.

Further, the parsing code returned two instances for serial consoles,
one from the /domain/devices/console and /domain/devices/serial
both representing the same device. This confuses cimtest and,
more problematic, will prevent DefineSystem to work, if a reference
VSSD with a serial console is passed in.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Daniel Hansel <daniel.hansel@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 12 +-------
libxkutil/xmlgen.c | 76 ----------------------------------------------
2 files changed, 1 insertion(+), 87 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 55c8d57..aecca4c 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -47,7 +47,7 @@
* still part of the graphics.
*/
#define GRAPHICS_XPATH (xmlChar *)"/domain/devices/graphics | "\
- "/domain/devices/console | /domain/devices/serial"
+ "/domain/devices/console"
#define INPUT_XPATH (xmlChar *)"/domain/devices/input"

#define DEFAULT_BRIDGE "xenbr0"
@@ -948,16 +948,6 @@ static int parse_graphics_device(xmlNode *node, struct virt_device **vdevs)
else if (XSTREQ(child->name, "target")) {
gdev->dev.vnc.port =
get_attr_value(child, "port");
- /* The graphics pty console can only be a
- virtio console. If 'type' is not set in the
- xml, the default of libvirt is virtio.*/
- char *t_type = get_attr_value(child, "type");
- if (t_type != NULL && !STREQC(t_type, "virtio")) {
- CU_DEBUG("Not a pty-virtio graphics console");
- free(t_type);
- goto err;
- }
- free(t_type);
}
}
}
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 45bfb04..7e8801d 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -42,36 +42,11 @@ typedef const char *(*devfn_t)(xmlNodePtr node, struct domain *dominfo);
typedef const char *(*poolfn_t)(xmlNodePtr node, struct virt_pool *pool);
typedef const char *(*resfn_t)(xmlNodePtr node, struct virt_pool_res *res);

-static int _count_graphics_console_definitions(struct domain *dominfo)
-{
- int i;
- int num = 0;
-
- for (i = 0; i < dominfo->dev_graphics_ct; i++) {
- struct virt_device *_dev = &dominfo->dev_graphics[i];
- if (_dev->type == CIM_RES_TYPE_UNKNOWN)
- continue;
-
- struct graphics_device *dev = &_dev->dev.graphics;
-
- if (STREQC(dev->type, "console")) {
- num++;
- }
- }
- CU_DEBUG("Found %d console defintions in graphics devices.",num);
- return num;
-
-}
-
static const char *console_xml(xmlNodePtr root, struct domain *dominfo)
{
int i;
xmlNodePtr console;
xmlNodePtr tmp;
- int num_graphics_consol_def = 0;
- int num_suppressed_console_def = 0;
-
- num_graphics_consol_def = _count_graphics_console_definitions(dominfo);

for (i = 0; i < dominfo->dev_console_ct; i++) {
struct virt_device *_dev = &dominfo->dev_console[i];
@@ -80,25 +55,6 @@ static const char *console_xml(xmlNodePtr root, struct domain *dominfo)

struct console_device *cdev = &_dev->dev.console;

- /* Due to backward compatibility, the graphics device handling
- is still parsing consoles:
- source = pty, target = virtio (which is the default target)
- But the console device handling processes these kind of
- consoles too. This would lead to a duplication of these
- default consoles in the domain xml definition.
- This code prevents the console handling of writing xml for
- duplicate pty/virtio consoles which are written by the
- graphics device handling. */
- if (cdev->source_type == CIM_CHARDEV_SOURCE_TYPE_PTY &&
- (cdev->target_type == NULL ||
- STREQC(cdev->target_type, "virtio"))) {
- if (num_suppressed_console_def <
- num_graphics_consol_def) {
- num_suppressed_console_def++;
- continue;
- }
- }
-
console = xmlNewChild(root, NULL, BAD_CAST "console", NULL);
if (console == NULL)
return XML_ERROR;
@@ -760,35 +716,6 @@ static const char *graphics_vnc_xml(xmlNodePtr root,
return NULL;
}

-static const char *graphics_pty_xml(xmlNodePtr root,
- struct graphics_device *dev)
-{
- xmlNodePtr pty = NULL;
- xmlNodePtr tmp = NULL;
-
- pty = xmlNewChild(root, NULL, BAD_CAST dev->type, NULL);
- if (pty == NULL)
- return XML_ERROR;
-
- xmlNewProp(pty, BAD_CAST "type", BAD_CAST "pty");
-
- tmp = xmlNewChild(pty, NULL, BAD_CAST "source", NULL);
- if (tmp == NULL)
- return XML_ERROR;
-
- if(dev->dev.vnc.host)
- xmlNewProp(tmp, BAD_CAST "path", BAD_CAST dev->dev.vnc.host);
-
- tmp = xmlNewChild(pty, NULL, BAD_CAST "target", NULL);
- if (tmp == NULL)
- return XML_ERROR;
-
- if(dev->dev.vnc.port)
- xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->dev.vnc.port);
-
- return NULL;
-}
-
static const char *graphics_xml(xmlNodePtr root, struct domain *dominfo)
{
const char *msg = NULL;
@@ -803,9 +730,6 @@ static const char *graphics_xml(xmlNodePtr root, struct domain *dominfo)

if (STREQC(dev->type, "vnc") || STREQC(dev->type, "sdl"))
msg = graphics_vnc_xml(root, dev);
- else if (STREQC(dev->type, "console") ||
- STREQC(dev->type, "serial"))
- msg = graphics_pty_xml(root, dev);
else
continue;

--
2.1.0

104
SOURCES/libvirt-cim-0.6.3-f9fc5821.patch

@ -0,0 +1,104 @@ @@ -0,0 +1,104 @@
From f9fc5821db08f04ecc92aabb3c87ce2869e78fb2 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Tue, 21 Jan 2014 14:42:24 -0500
Subject: [PATCH 40/60] VSMS: Coverity cleanups

A new version of Coverity found a number of issues:

parse_ip_address(): FORWARD_NULL
- Benign issue regarding how 'tmp_ip' was compared against NULL for
the IPv6 processing and then used blindly later when strdup()'ing
into *ip. Rather than use NULL check, compare against return of 1
or more which indicates that something is there

update_system_settings(): RESOURCE_LEAK
- The 'uuid' value was being leaked if strdup()'d. Also rather than
strdup()'g and strdup()'d value and risking failure, just assign the
initially strdup()'d value and reinitialize uuid to NULL

fv_vssd_to_domain(): USE_AFTER_FREE
- The domain->os_info.fv.arch is free()'d only to be potentially
strdup()'d after processing the 'cu_get_str_prop()' for "Arch".
The complaint was that it was possible to not strdup() a new value
and thus possible to pass a free()'d value to get_default_machine().
Passing a NULL is not an issue as that is checked.

Additionally found by inspection, 'val' was not initialized to NULL,
so the setting of os_info.fv.arch may not be what was expected. Also,
after processing "Arch" it was not reinitialized to NULL so its
contents could potentially have been saved in os_info.fv.machine.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
src/Virt_VirtualSystemManagementService.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 5c7238f..83e5c53 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -464,7 +464,7 @@ static int fv_vssd_to_domain(CMPIInstance *inst,
{
int ret = 1;
int retr;
- const char *val;
+ const char *val = NULL;
const char *domtype = NULL;
const char *ostype = "hvm";
struct capabilities *capsinfo = NULL;
@@ -494,6 +494,7 @@ static int fv_vssd_to_domain(CMPIInstance *inst,
}

free(domain->os_info.fv.arch);
+ domain->os_info.fv.arch = NULL;
retr = cu_get_str_prop(inst, "Arch", &val);
if (retr != CMPI_RC_OK) {
if (capsinfo != NULL) { /* set default */
@@ -506,6 +507,8 @@ static int fv_vssd_to_domain(CMPIInstance *inst,
domain->os_info.fv.arch = strdup(val);

free(domain->os_info.fv.machine);
+ domain->os_info.fv.machine = NULL;
+ val = NULL;
retr = cu_get_str_prop(inst, "Machine", &val);
if (retr != CMPI_RC_OK) {
if (capsinfo != NULL && domtype != NULL) { /* set default */
@@ -1415,7 +1418,7 @@ static int parse_ip_address(const char *id,
if (strstr(id, "[") != NULL) {
/* its an ipv6 address */
ret = sscanf(id, "%a[^]]]:%as", &tmp_ip, &tmp_port);
- if (tmp_ip != NULL) {
+ if (ret >= 1) {
tmp_ip = realloc(tmp_ip, strlen(tmp_ip) + 2);
if (tmp_ip == NULL) {
ret = 0;
@@ -2755,7 +2758,7 @@ static CMPIStatus update_system_settings(const CMPIContext *context,
virDomainPtr dom = NULL;
struct domain *dominfo = NULL;
char *xml = NULL;
- const char *uuid = NULL;
+ char *uuid = NULL;

CU_DEBUG("Enter update_system_settings");
ret = cu_get_str_prop(vssd, "VirtualSystemIdentifier", &name);
@@ -2798,7 +2801,9 @@ static CMPIStatus update_system_settings(const CMPIContext *context,
}

if ((dominfo->uuid == NULL) || (STREQ(dominfo->uuid, ""))) {
- dominfo->uuid = strdup(uuid);
+ free(dominfo->uuid);
+ dominfo->uuid = uuid;
+ uuid = NULL;
} else if (!STREQ(uuid, dominfo->uuid)) {
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
@@ -2829,6 +2834,7 @@ static CMPIStatus update_system_settings(const CMPIContext *context,
}

out:
+ free(uuid);
free(xml);
virDomainFree(dom);
virConnectClose(conn);
--
2.1.0

208
SOURCES/libvirt-cim-0.6.3-fb5d2fcf.patch

@ -0,0 +1,208 @@ @@ -0,0 +1,208 @@
From fb5d2fcfe770d5446a6d8fcdcd405c6645c4dfb0 Mon Sep 17 00:00:00 2001
From: John Ferlan <jferlan@redhat.com>
Date: Wed, 22 Jan 2014 16:09:04 -0500
Subject: [PATCH 46/60] Adjust sscanf format string

Currently the sscanf() calls use "%as" or "%a[" in order to allocate and
return strings for read fields. It was pointed out to me that this is an
older and non-portable method. Instead the "%ms" or "%m[" should be used.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/acl_parsing.c | 2 +-
libxkutil/device_parsing.c | 2 +-
libxkutil/misc_util.c | 2 +-
src/Virt_ComputerSystemIndication.c | 2 +-
src/Virt_Device.c | 6 +++---
src/Virt_DevicePool.c | 8 ++++----
src/Virt_SettingsDefineState.c | 2 +-
src/Virt_VirtualSystemManagementService.c | 12 ++++++------
8 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/libxkutil/acl_parsing.c b/libxkutil/acl_parsing.c
index 3de6a65..c368b99 100644
--- a/libxkutil/acl_parsing.c
+++ b/libxkutil/acl_parsing.c
@@ -666,7 +666,7 @@ int parse_rule_id(const char *rule_id, char **filter, int *index)

if ((filter == NULL) || (index == NULL))
return 0;
- ret = sscanf(rule_id, "%as[^:]:%u", filter, index);
+ ret = sscanf(rule_id, "%ms[^:]:%u", filter, index);
if (ret != 2) {
free(*filter);
*filter = NULL;
diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 4dd9e58..c9ae886 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -1463,7 +1463,7 @@ int parse_fq_devid(const char *devid, char **host, char **device)
{
int ret;

- ret = sscanf(devid, "%a[^/]/%a[^\n]", host, device);
+ ret = sscanf(devid, "%m[^/]/%m[^\n]", host, device);
if (ret != 2) {
free(*host);
free(*device);
diff --git a/libxkutil/misc_util.c b/libxkutil/misc_util.c
index 2164dd0..6a54815 100644
--- a/libxkutil/misc_util.c
+++ b/libxkutil/misc_util.c
@@ -671,7 +671,7 @@ int parse_id(const char *id,
char *tmp_pfx = NULL;
char *tmp_name = NULL;

- ret = sscanf(id, "%a[^:]:%a[^\n]", &tmp_pfx, &tmp_name);
+ ret = sscanf(id, "%m[^:]:%m[^\n]", &tmp_pfx, &tmp_name);
if (ret != 2) {
ret = 0;
goto out;
diff --git a/src/Virt_ComputerSystemIndication.c b/src/Virt_ComputerSystemIndication.c
index 20c60bc..32bee97 100644
--- a/src/Virt_ComputerSystemIndication.c
+++ b/src/Virt_ComputerSystemIndication.c
@@ -382,7 +382,7 @@ static char *sys_name_from_xml(char *xml)
goto out;
}

- rc = sscanf(tmp, "<name>%a[^<]s</name>", &name);
+ rc = sscanf(tmp, "<name>%m[^<]s</name>", &name);
if (rc != 1) {
name = NULL;
}
diff --git a/src/Virt_Device.c b/src/Virt_Device.c
index b93e592..12ae6bd 100644
--- a/src/Virt_Device.c
+++ b/src/Virt_Device.c
@@ -675,7 +675,7 @@ static CMPIStatus return_enum_devices(const CMPIObjectPath *reference,

s = enum_devices(_BROKER,
reference,
- NULL,
+ NULL,
res_type_from_device_classname(CLASSNAME(reference)),
&list);
if (s.rc != CMPI_RC_OK)
@@ -696,7 +696,7 @@ static int parse_devid(const char *devid, char **dom, char **dev)
{
int ret;

- ret = sscanf(devid, "%a[^/]/%as", dom, dev);
+ ret = sscanf(devid, "%m[^/]/%ms", dom, dev);
if (ret != 2) {
free(*dom);
free(*dev);
@@ -711,7 +711,7 @@ static int proc_dev_list(uint64_t quantity,
{
int i;

- *list = (struct virt_device *)calloc(quantity,
+ *list = (struct virt_device *)calloc(quantity,
sizeof(struct virt_device));

for (i = 0; i < quantity; i++) {
diff --git a/src/Virt_DevicePool.c b/src/Virt_DevicePool.c
index d6e51ba..aae7ed4 100644
--- a/src/Virt_DevicePool.c
+++ b/src/Virt_DevicePool.c
@@ -383,11 +383,11 @@ static bool _diskpool_is_member(virConnectPtr conn,

pool_vol = virStoragePoolLookupByVolume(vol);
if (vol != NULL) {
- pool_name = virStoragePoolGetName(pool_vol);
+ pool_name = virStoragePoolGetName(pool_vol);
if ((pool_name != NULL) && (STREQC(pool_name, pool->tag)))
result = true;
}
-
+
out:
CU_DEBUG("Image %s in pool %s: %s",
file,
@@ -405,7 +405,7 @@ static bool parse_diskpool_line(struct tmp_disk_pool *pool,
{
int ret;

- ret = sscanf(line, "%as %as", &pool->tag, &pool->path);
+ ret = sscanf(line, "%ms %ms", &pool->tag, &pool->path);
if (ret != 2) {
free(pool->tag);
free(pool->path);
@@ -1610,7 +1610,7 @@ CMPIStatus get_pool_by_name(const CMPIBroker *broker,
goto out;
}

- ret = sscanf(id, "%*[^/]/%a[^\n]", &poolid);
+ ret = sscanf(id, "%*[^/]/%m[^\n]", &poolid);
if (ret != 1) {
cu_statusf(broker, &s,
CMPI_RC_ERR_NOT_FOUND,
diff --git a/src/Virt_SettingsDefineState.c b/src/Virt_SettingsDefineState.c
index be2ded5..c8cda97 100644
--- a/src/Virt_SettingsDefineState.c
+++ b/src/Virt_SettingsDefineState.c
@@ -298,7 +298,7 @@ static CMPIStatus vssd_to_vs(const CMPIObjectPath *ref,
goto out;
}

- ret = sscanf(id, "%a[^:]:%as", &pfx, &name);
+ ret = sscanf(id, "%m[^:]:%ms", &pfx, &name);
if (ret != 2) {
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 83e5c53..3e7785e 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1330,7 +1330,7 @@ static int parse_console_address(const char *id,

CU_DEBUG("Entering parse_console_address, address is %s", id);

- ret = sscanf(id, "%a[^:]:%as", &tmp_path, &tmp_port);
+ ret = sscanf(id, "%m[^:]:%ms", &tmp_path, &tmp_port);

if (ret != 2) {
ret = 0;
@@ -1366,10 +1366,10 @@ static int parse_sdl_address(const char *id,

CU_DEBUG("Entering parse_sdl_address, address is %s", id);

- ret = sscanf(id, "%a[^:]:%as", &tmp_xauth, &tmp_display);
+ ret = sscanf(id, "%m[^:]:%ms", &tmp_xauth, &tmp_display);

if (ret <= 0) {
- ret = sscanf(id, ":%as", &tmp_display);
+ ret = sscanf(id, ":%ms", &tmp_display);
if (ret <= 0) {
if (STREQC(id, ":")) {
/* do nothing, it is empty */
@@ -1417,7 +1417,7 @@ static int parse_ip_address(const char *id,
CU_DEBUG("Entering parse_ip_address, address is %s", id);
if (strstr(id, "[") != NULL) {
/* its an ipv6 address */
- ret = sscanf(id, "%a[^]]]:%as", &tmp_ip, &tmp_port);
+ ret = sscanf(id, "%m[^]]]:%ms", &tmp_ip, &tmp_port);
if (ret >= 1) {
tmp_ip = realloc(tmp_ip, strlen(tmp_ip) + 2);
if (tmp_ip == NULL) {
@@ -1427,7 +1427,7 @@ static int parse_ip_address(const char *id,
strcat(tmp_ip, "]");
}
} else {
- ret = sscanf(id, "%a[^:]:%as", &tmp_ip, &tmp_port);
+ ret = sscanf(id, "%m[^:]:%ms", &tmp_ip, &tmp_port);
}

/* ret == 2: address and port, ret == 1: address only */
@@ -1464,7 +1464,7 @@ static bool parse_console_url(const char *url,

CU_DEBUG("Entering parse_console_url:'%s'", url);

- if (sscanf(url,"%a[^:]://%as", &tmp_protocol, &tmp_address) != 2)
+ if (sscanf(url,"%m[^:]://%ms", &tmp_protocol, &tmp_address) != 2)
goto out;

if (parse_ip_address(tmp_address, host, port) < 1)
--
2.1.0

749
SOURCES/libvirt-cim-0.6.3-fffbde4e.patch

@ -0,0 +1,749 @@ @@ -0,0 +1,749 @@
From fffbde4e7b49d4c49f9f2d739572e51833c39d90 Mon Sep 17 00:00:00 2001
From: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Date: Wed, 11 Sep 2013 16:45:37 +0200
Subject: [PATCH 17/60] libxkutil: Console Support

Added data types for the representation of console devices and their
source type specific properties.
Further, implemented libvirt XML parsing and generation of console
device XML.

Signed-off-by: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
libxkutil/device_parsing.c | 314 +++++++++++++++++++++++++++++++++++++++++++--
libxkutil/device_parsing.h | 43 ++++++-
libxkutil/xmlgen.c | 191 ++++++++++++++++++++++++++-
src/svpc_types.h | 5 +-
4 files changed, 541 insertions(+), 12 deletions(-)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index f55061e..55c8d57 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -41,6 +41,11 @@
#define NET_XPATH (xmlChar *)"/domain/devices/interface"
#define EMU_XPATH (xmlChar *)"/domain/devices/emulator"
#define MEM_XPATH (xmlChar *)"/domain/memory | /domain/currentMemory"
+#define CONSOLE_XPATH (xmlChar *)"/domain/devices/console"
+/*
+ * To be backward compatible, serial and console is
+ * still part of the graphics.
+ */
#define GRAPHICS_XPATH (xmlChar *)"/domain/devices/graphics | "\
"/domain/devices/console | /domain/devices/serial"
#define INPUT_XPATH (xmlChar *)"/domain/devices/input"
@@ -50,6 +55,11 @@

#define MAX(a,b) (((a)>(b))?(a):(b))

+#define DUP_FIELD(d, s, f) do { \
+ if ((s)->f != NULL) \
+ (d)->f = strdup((s)->f); \
+ } while (0);
+
/* Device parse function */
typedef int (*dev_parse_func_t)(xmlNode *, struct virt_device **);

@@ -135,6 +145,140 @@ static void cleanup_graphics_device(struct graphics_device *dev)
free(dev->type);
}

+static void cleanup_path_device(struct path_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ free(dev->path);
+
+}
+
+static void cleanup_unixsock_device(struct unixsock_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ free(dev->path);
+ free(dev->mode);
+
+}
+
+static void cleanup_tcp_device(struct tcp_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ free(dev->mode);
+ free(dev->protocol);
+ free(dev->host);
+ free(dev->service);
+
+}
+
+static void cleanup_udp_device(struct udp_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ free(dev->bind_host);
+ free(dev->bind_service);
+ free(dev->connect_host);
+ free(dev->connect_service);
+};
+
+static void cleanup_console_device(struct console_device *dev)
+{
+ if (dev == NULL)
+ return;
+
+ switch (dev->source_type)
+ {
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ cleanup_path_device(&dev->source_dev.pty);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ cleanup_path_device(&dev->source_dev.dev);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ cleanup_path_device(&dev->source_dev.file);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ cleanup_path_device(&dev->source_dev.pipe);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ cleanup_unixsock_device(&dev->source_dev.unixsock);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ cleanup_udp_device(&dev->source_dev.udp);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ cleanup_tcp_device(&dev->source_dev.tcp);
+ break;
+ default:
+ /* Nothing to do for :
+ CIM_CHARDEV_SOURCE_TYPE_STDIO
+ CIM_CHARDEV_SOURCE_TYPE_NULL
+ CIM_CHARDEV_SOURCE_TYPE_VC
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+ */
+ break;
+ }
+
+ dev->source_type = 0;
+ free(dev->target_type);
+ memset(&dev->source_dev, 0, sizeof(dev->source_dev));
+};
+
+static void console_device_dup(struct console_device *t,
+ struct console_device *s)
+{
+ cleanup_console_device(t);
+
+ t->source_type = s->source_type;
+ DUP_FIELD(t, s, target_type);
+
+ switch (s->source_type)
+ {
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ DUP_FIELD(t, s, source_dev.pty.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ DUP_FIELD(t, s, source_dev.dev.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ DUP_FIELD(t, s, source_dev.file.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ DUP_FIELD(t, s, source_dev.pipe.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ DUP_FIELD(t, s, source_dev.unixsock.path);
+ DUP_FIELD(t, s, source_dev.unixsock.mode);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ DUP_FIELD(t, s, source_dev.udp.bind_host);
+ DUP_FIELD(t, s, source_dev.udp.bind_service);
+ DUP_FIELD(t, s, source_dev.udp.connect_host);
+ DUP_FIELD(t, s, source_dev.udp.connect_service);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ DUP_FIELD(t, s, source_dev.tcp.mode);
+ DUP_FIELD(t, s, source_dev.tcp.protocol);
+ DUP_FIELD(t, s, source_dev.tcp.host);
+ DUP_FIELD(t, s, source_dev.tcp.service);
+ break;
+ default:
+ /* Nothing to do for :
+ CIM_CHARDEV_SOURCE_TYPE_STDIO
+ CIM_CHARDEV_SOURCE_TYPE_NULL
+ CIM_CHARDEV_SOURCE_TYPE_VC
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+ */
+ break;
+ }
+}
+
static void cleanup_input_device(struct input_device *dev)
{
if (dev == NULL)
@@ -159,6 +303,8 @@ void cleanup_virt_device(struct virt_device *dev)
cleanup_graphics_device(&dev->dev.graphics);
else if (dev->type == CIM_RES_TYPE_INPUT)
cleanup_input_device(&dev->dev.input);
+ else if (dev->type == CIM_RES_TYPE_CONSOLE)
+ cleanup_console_device(&dev->dev.console);

free(dev->id);

@@ -616,6 +762,138 @@ static char *get_attr_value_default(xmlNode *node, char *attrname,
return ret;
}

+static int parse_console_device(xmlNode *node, struct virt_device **vdevs)
+{
+ struct virt_device *vdev = NULL;
+ struct console_device *cdev = NULL;
+ char *source_type_str = NULL;
+ char *target_port_ID = NULL;
+ char *udp_source_mode = NULL;
+
+ xmlNode *child = NULL;
+
+ vdev = calloc(1, sizeof(*vdev));
+ if (vdev == NULL)
+ goto err;
+
+ cdev = &(vdev->dev.console);
+
+ source_type_str = get_attr_value(node, "type");
+ if (source_type_str == NULL)
+ goto err;
+ CU_DEBUG("console device type = %s", source_type_str ? : "NULL");
+
+ cdev->source_type = chardev_source_type_StrToID(source_type_str);
+ if (cdev->source_type == CIM_CHARDEV_SOURCE_TYPE_UNKNOWN)
+ goto err;
+
+ CU_DEBUG("console device type ID = %d", cdev->source_type);
+
+ for (child = node->children; child != NULL; child = child->next) {
+ if (XSTREQ(child->name, "target")) {
+ cdev->target_type = get_attr_value(child, "type");
+ CU_DEBUG("Console device target type = '%s'",
+ cdev->target_type ? : "NULL");
+ target_port_ID = get_attr_value(child, "port");
+ if (target_port_ID == NULL)
+ goto err;
+ }
+
+ if (XSTREQ(child->name, "source")) {
+ switch (cdev->source_type)
+ {
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ cdev->source_dev.pty.path =
+ get_attr_value(child, "path");
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ cdev->source_dev.dev.path =
+ get_attr_value(child, "path");
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ cdev->source_dev.file.path =
+ get_attr_value(child, "path");
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ cdev->source_dev.pipe.path =
+ get_attr_value(child, "path");
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ cdev->source_dev.unixsock.mode =
+ get_attr_value(child, "mode");
+ cdev->source_dev.unixsock.path =
+ get_attr_value(child, "path");
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ udp_source_mode = get_attr_value(child, "mode");
+ if (udp_source_mode == NULL)
+ goto err;
+ if (STREQC(udp_source_mode, "bind")) {
+ cdev->source_dev.udp.bind_host =
+ get_attr_value(child, "host");
+ cdev->source_dev.udp.bind_service =
+ get_attr_value(child, "service");
+ } else if (STREQC(udp_source_mode, "connect")) {
+ cdev->source_dev.udp.connect_host =
+ get_attr_value(child, "host");
+ cdev->source_dev.udp.connect_service =
+ get_attr_value(child, "service");
+ } else {
+ CU_DEBUG("unknown udp mode: %s",
+ udp_source_mode ? : "NULL");
+ goto err;
+ }
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ cdev->source_dev.tcp.mode =
+ get_attr_value(child, "mode");
+ cdev->source_dev.tcp.host =
+ get_attr_value(child, "host");
+ cdev->source_dev.tcp.service =
+ get_attr_value(child, "service");
+ break;
+
+ default:
+ /* Nothing to do for :
+ CIM_CHARDEV_SOURCE_TYPE_STDIO
+ CIM_CHARDEV_SOURCE_TYPE_NULL
+ CIM_CHARDEV_SOURCE_TYPE_VC
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+ */
+ break;
+ }
+ }
+ if ((cdev->source_type == CIM_CHARDEV_SOURCE_TYPE_TCP)
+ && XSTREQ(child->name, "protocol")) {
+ cdev->source_dev.tcp.protocol =
+ get_attr_value(child, "type");
+ }
+ }
+
+ vdev->type = CIM_RES_TYPE_CONSOLE;
+
+ if (asprintf(&vdev->id, "charconsole:%s", target_port_ID) == -1) {
+ CU_DEBUG("Failed to create charconsole id string");
+ goto err;
+ }
+
+ *vdevs = vdev;
+ free(source_type_str);
+ free(target_port_ID);
+ free(udp_source_mode);
+
+ return 1;
+
+ err:
+ free(source_type_str);
+ free(target_port_ID);
+ free(udp_source_mode);
+ cleanup_console_device(cdev);
+ free(vdev);
+
+ return 0;
+}
+
static int parse_graphics_device(xmlNode *node, struct virt_device **vdevs)
{
struct virt_device *vdev = NULL;
@@ -667,8 +945,20 @@ static int parse_graphics_device(xmlNode *node, struct virt_device **vdevs)
child = child->next) {
if (XSTREQ(child->name, "source"))
gdev->dev.vnc.host = get_attr_value(child, "path");
- else if (XSTREQ(child->name, "target"))
- gdev->dev.vnc.port = get_attr_value(child, "port");
+ else if (XSTREQ(child->name, "target")) {
+ gdev->dev.vnc.port =
+ get_attr_value(child, "port");
+ /* The graphics pty console can only be a
+ virtio console. If 'type' is not set in the
+ xml, the default of libvirt is virtio.*/
+ char *t_type = get_attr_value(child, "type");
+ if (t_type != NULL && !STREQC(t_type, "virtio")) {
+ CU_DEBUG("Not a pty-virtio graphics console");
+ free(t_type);
+ goto err;
+ }
+ free(t_type);
+ }
}
}
else {
@@ -847,6 +1137,11 @@ static int parse_devices(const char *xml, struct virt_device **_list, int type)
func = &parse_graphics_device;
break;

+ case CIM_RES_TYPE_CONSOLE:
+ xpathstr = CONSOLE_XPATH;
+ func = &parse_console_device;
+ break;
+
case CIM_RES_TYPE_INPUT:
xpathstr = INPUT_XPATH;
func = &parse_input_device;
@@ -882,11 +1177,6 @@ static int parse_devices(const char *xml, struct virt_device **_list, int type)
return count;
}

-#define DUP_FIELD(d, s, f) do { \
- if ((s)->f != NULL) \
- (d)->f = strdup((s)->f); \
- } while (0);
-
struct virt_device *virt_device_dup(struct virt_device *_dev)
{
struct virt_device *dev;
@@ -945,8 +1235,10 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
} else if (dev->type == CIM_RES_TYPE_INPUT) {
DUP_FIELD(dev, _dev, dev.input.type);
DUP_FIELD(dev, _dev, dev.input.bus);
+ } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
+ console_device_dup(&dev->dev.console,
+ &_dev->dev.console);
}
-
return dev;
}

@@ -1307,6 +1599,9 @@ int get_dominfo_from_xml(const char *xml, struct domain **dominfo)
(*dominfo)->dev_graphics_ct = parse_devices(xml,
&(*dominfo)->dev_graphics,
CIM_RES_TYPE_GRAPHICS);
+ (*dominfo)->dev_console_ct = parse_devices(xml,
+ &(*dominfo)->dev_console,
+ CIM_RES_TYPE_CONSOLE);
(*dominfo)->dev_input_ct = parse_devices(xml,
&(*dominfo)->dev_input,
CIM_RES_TYPE_INPUT);
@@ -1407,6 +1702,7 @@ void cleanup_dominfo(struct domain **dominfo)
cleanup_virt_devices(&dom->dev_vcpu, dom->dev_vcpu_ct);
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);

free(dom);

diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 14e49b8..2803d6a 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -111,6 +111,43 @@ struct graphics_device {
} dev;
};

+struct path_device {
+ char *path;
+};
+
+struct unixsock_device {
+ char *path;
+ char *mode;
+};
+
+struct tcp_device {
+ char *mode;
+ char *protocol;
+ char *host;
+ char *service;
+};
+
+struct udp_device {
+ char *bind_host;
+ char *bind_service;
+ char *connect_host;
+ char *connect_service;
+};
+
+struct console_device {
+ uint16_t source_type;
+ union {
+ struct path_device file;
+ struct path_device pty;
+ struct path_device dev;
+ struct path_device pipe;
+ struct unixsock_device unixsock;
+ struct tcp_device tcp;
+ struct udp_device udp;
+ } source_dev;
+ char *target_type;
+};
+
struct input_device {
char *type;
char *bus;
@@ -125,6 +162,7 @@ struct virt_device {
struct vcpu_device vcpu;
struct emu_device emu;
struct graphics_device graphics;
+ struct console_device console;
struct input_device input;
} dev;
char *id;
@@ -182,6 +220,9 @@ struct domain {
struct virt_device *dev_graphics;
int dev_graphics_ct;

+ struct virt_device *dev_console;
+ int dev_console_ct;
+
struct virt_device *dev_emu;

struct virt_device *dev_input;
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 2ca2341..45bfb04 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -1,5 +1,5 @@
/*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2007, 2013
*
* Authors:
* Dan Smith <danms@us.ibm.com>
@@ -42,6 +42,189 @@ typedef const char *(*devfn_t)(xmlNodePtr node, struct domain *dominfo);
typedef const char *(*poolfn_t)(xmlNodePtr node, struct virt_pool *pool);
typedef const char *(*resfn_t)(xmlNodePtr node, struct virt_pool_res *res);

+static int _count_graphics_console_definitions(struct domain *dominfo)
+{
+ int i;
+ int num = 0;
+
+ for (i = 0; i < dominfo->dev_graphics_ct; i++) {
+ struct virt_device *_dev = &dominfo->dev_graphics[i];
+ if (_dev->type == CIM_RES_TYPE_UNKNOWN)
+ continue;
+
+ struct graphics_device *dev = &_dev->dev.graphics;
+
+ if (STREQC(dev->type, "console")) {
+ num++;
+ }
+ }
+ CU_DEBUG("Found %d console defintions in graphics devices.",num);
+ return num;
+
+}
+
+static const char *console_xml(xmlNodePtr root, struct domain *dominfo)
+{
+ int i;
+ xmlNodePtr console;
+ xmlNodePtr tmp;
+ int num_graphics_consol_def = 0;
+ int num_suppressed_console_def = 0;
+
+ num_graphics_consol_def = _count_graphics_console_definitions(dominfo);
+
+ for (i = 0; i < dominfo->dev_console_ct; i++) {
+ struct virt_device *_dev = &dominfo->dev_console[i];
+ if (_dev->type == CIM_RES_TYPE_UNKNOWN)
+ continue;
+
+ struct console_device *cdev = &_dev->dev.console;
+
+ /* Due to backward compatibility, the graphics device handling
+ is still parsing consoles:
+ source = pty, target = virtio (which is the default target)
+ But the console device handling processes these kind of
+ consoles too. This would lead to a duplication of these
+ default consoles in the domain xml definition.
+ This code prevents the console handling of writing xml for
+ duplicate pty/virtio consoles which are written by the
+ graphics device handling. */
+ if (cdev->source_type == CIM_CHARDEV_SOURCE_TYPE_PTY &&
+ (cdev->target_type == NULL ||
+ STREQC(cdev->target_type, "virtio"))) {
+ if (num_suppressed_console_def <
+ num_graphics_consol_def) {
+ num_suppressed_console_def++;
+ continue;
+ }
+ }
+
+ console = xmlNewChild(root, NULL, BAD_CAST "console", NULL);
+ if (console == NULL)
+ return XML_ERROR;
+
+ xmlNewProp(console, BAD_CAST "type",
+ BAD_CAST
+ chardev_source_type_IDToStr(cdev->source_type));
+
+ switch (cdev->source_type) {
+ case CIM_CHARDEV_SOURCE_TYPE_PTY:
+ /* The path property is not mandatory */
+ if (cdev->source_dev.pty.path) {
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "path",
+ BAD_CAST cdev->source_dev.pty.path);
+ }
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_DEV:
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "path",
+ BAD_CAST cdev->source_dev.dev.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_FILE:
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "path",
+ BAD_CAST cdev->source_dev.file.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_PIPE:
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "path",
+ BAD_CAST cdev->source_dev.pipe.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UNIXSOCK:
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "mode",
+ BAD_CAST cdev->source_dev.unixsock.mode);
+ xmlNewProp(tmp, BAD_CAST "path",
+ BAD_CAST cdev->source_dev.unixsock.path);
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_UDP:
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "mode", BAD_CAST "bind");
+ xmlNewProp(tmp, BAD_CAST "host",
+ BAD_CAST cdev->source_dev.udp.bind_host);
+ /* The service property is not mandatory */
+ if (cdev->source_dev.udp.bind_service)
+ xmlNewProp(tmp, BAD_CAST "service",
+ BAD_CAST
+ cdev->source_dev.udp.bind_service);
+
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "mode", BAD_CAST "connect");
+ xmlNewProp(tmp, BAD_CAST "host",
+ BAD_CAST cdev->source_dev.udp.connect_host);
+ /* The service property is not mandatory */
+ if (cdev->source_dev.udp.connect_service)
+ xmlNewProp(tmp, BAD_CAST "service",
+ BAD_CAST
+ cdev->source_dev.udp.connect_service);
+
+ break;
+ case CIM_CHARDEV_SOURCE_TYPE_TCP:
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "source", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "mode",
+ BAD_CAST cdev->source_dev.tcp.mode);
+ xmlNewProp(tmp, BAD_CAST "host",
+ BAD_CAST cdev->source_dev.tcp.host);
+ if (cdev->source_dev.tcp.service)
+ xmlNewProp(tmp, BAD_CAST "service",
+ BAD_CAST
+ cdev->source_dev.tcp.service);
+ if (cdev->source_dev.tcp.protocol) {
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "protocol", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "type",
+ BAD_CAST cdev->source_dev.tcp.protocol);
+ }
+ break;
+ default:
+ /* Nothing to do for :
+ CIM_CHARDEV_SOURCE_TYPE_STDIO
+ CIM_CHARDEV_SOURCE_TYPE_NULL
+ CIM_CHARDEV_SOURCE_TYPE_VC
+ CIM_CHARDEV_SOURCE_TYPE_SPICEVMC
+ */
+ break;
+ }
+
+ if (cdev->target_type) {
+ tmp = xmlNewChild(console, NULL,
+ BAD_CAST "target", NULL);
+ if (tmp == NULL)
+ return XML_ERROR;
+ xmlNewProp(tmp, BAD_CAST "type",
+ BAD_CAST cdev->target_type);
+ }
+ }
+ return NULL;
+}
+
static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
{
xmlNodePtr disk;
@@ -977,6 +1160,11 @@ char *device_to_xml(struct virt_device *_dev)
dominfo->dev_graphics_ct = 1;
dominfo->dev_graphics = dev;
break;
+ case CIM_RES_TYPE_CONSOLE:
+ func = console_xml;
+ dominfo->dev_console_ct = 1;
+ dominfo->dev_console = dev;
+ break;
case CIM_RES_TYPE_INPUT:
func = input_xml;
dominfo->dev_input_ct = 1;
@@ -1017,6 +1205,7 @@ char *system_to_xml(struct domain *dominfo)
&disk_xml,
&net_xml,
&input_xml,
+ &console_xml,
&graphics_xml,
&emu_xml,
NULL
diff --git a/src/svpc_types.h b/src/svpc_types.h
index 2e4d73f..0f46a86 100644
--- a/src/svpc_types.h
+++ b/src/svpc_types.h
@@ -25,6 +25,7 @@
#define CIM_OPERATIONAL_STATUS 2

#define CIM_RES_TYPE_ALL 0
+#define CIM_RES_TYPE_OTHER 1
#define CIM_RES_TYPE_PROC 3
#define CIM_RES_TYPE_MEM 4
#define CIM_RES_TYPE_NET 10
@@ -34,8 +35,9 @@
#define CIM_RES_TYPE_INPUT 13
#define CIM_RES_TYPE_UNKNOWN 1000
#define CIM_RES_TYPE_IMAGE 32768
+#define CIM_RES_TYPE_CONSOLE 32769

-#define CIM_RES_TYPE_COUNT 6
+#define CIM_RES_TYPE_COUNT 7
const static int cim_res_types[CIM_RES_TYPE_COUNT] =
{CIM_RES_TYPE_NET,
CIM_RES_TYPE_DISK,
@@ -43,6 +45,7 @@ const static int cim_res_types[CIM_RES_TYPE_COUNT] =
CIM_RES_TYPE_PROC,
CIM_RES_TYPE_GRAPHICS,
CIM_RES_TYPE_INPUT,
+ CIM_RES_TYPE_CONSOLE,
};

#define CIM_VSSD_RECOVERY_NONE 2
--
2.1.0

1144
SOURCES/libvirt-cim-aarch64.patch

File diff suppressed because it is too large Load Diff

800
SPECS/libvirt-cim.spec

@ -0,0 +1,800 @@ @@ -0,0 +1,800 @@
# -*- rpm-spec -*-

Summary: A CIM provider for libvirt
Name: libvirt-cim
Version: 0.6.3
Release: 19%{?dist}%{?extra_release}
License: LGPLv2+
Group: Development/Libraries
Source: ftp://libvirt.org/libvirt-cim/libvirt-cim-%{version}.tar.gz

# Update configure for aarch64 (bz #925923)
Patch1: libvirt-cim-aarch64.patch

# Patches 2 -> 10 were added as one submit for libvirt-cim.0.6.3-5.
# They are listed in the order they were added to the upstream
# libvirt-cim.git repository. Although Patch10 is the ultimate fix
# for BZ#1070346, the other patches were cumulative issues seen in
# since 0.6.3 was generated upstream and pulled into RHEL7. The only
# change not pulled in was commit id 'f18ba715' as it failed for the
# s390/s390x brew builds, perhaps due to $(SHELL) not being defined
# in whatever build environment is installed.

# libvirt-cim.spec.in: Don't install open-pegasus' specific providers
# Author: Michal Privoznik <mprivozn@redhat.com>
Patch2: libvirt-cim-0.6.3-19ffef8e.patch

# libvirt-cim.spec.in: Uninstall open-pegasus-specific providers from sfcb
# Author: Ján Tomko <jtomko@redhat.com>
Patch3: libvirt-cim-0.6.3-ee74ebc1.patch

# spec: Replace the path to the tar.gz file
# Author: John Ferlan <jferlan@redhat.com>
Patch4: libvirt-cim-0.6.3-3c3a541d.patch

# spec: Fix capitalization for version check
# Author: John Ferlan <jferlan@redhat.com>
Patch5: libvirt-cim-0.6.3-5d2626f6.patch

# build: Don't use /bin/sh unconditionally
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch6: libvirt-cim-0.6.3-f18ba715.patch

# build: Fix incorrect provider registration in upgrade path
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch7: libvirt-cim-0.6.3-1c7dfda2.patch

# build: Fix provider registration issues
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch8: libvirt-cim-0.6.3-9c1d321b.patch

# schema: Fix class removal with Pegasus
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch9: libvirt-cim-0.6.3-95f0d418.patch

# spec: Fix docs/*.html packaging issue
# Author: John Ferlan <jferlan@redhat.com>
Patch10: libvirt-cim-0.6.3-54778c78.patch

# Use of root/interop instead of root/PG_InterOp
# Author: John Ferlan <jferlan@redhat.com>
Patch11: libvirt-cim-0.6.3-a8cfd7dc.patch

# Patches 12 -> 15 were added as one submit for libvirt-cim.0.6.3-6.
# They are listed in order as there were added upstream. Since applying
# the changes without merge conflicts relies on previous changes being
# included, it was easier to make one submit for all 4 changes. Of the
# changes only Patch12 doesn't have an existing RHEL6* based bug, but
# it's an important enough change to be included.

# get_dominfo: Use VIR_DOMAIN_XML_SECURE more wisely
# Author: Michal Privoznik <mprivozn@redhat.com>
Patch12: libvirt-cim-0.6.3-7e164fbd.patch

# Add dumpCore tag support to memory
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
# Added to libvirt-cim.0.6.1-9 in RHEL 6.5 as part of BZ#1000937
Patch13: libvirt-cim-0.6.3-de03c66f.patch

# libxkutil: Improve domain.os_info cleanup
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
# Added to libvirt-cim.0.6.1-10 in RHEL 6.6 as BZ#1046280
# Added to libvirt-cim.0.6.1-9.el6_5.1 in RHEL 6.5.z as BZ#1055626
Patch14: libvirt-cim-0.6.3-0a742856.patch

# VSSD: Add properties for arch and machine
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
# Added to libvirt-cim.0.6.1-10 in RHEL 6.6 as BZ#1046280
# Added to libvirt-cim.0.6.1-9.el6_5.1 in RHEL 6.5.z as BZ#1055626
Patch15: libvirt-cim-0.6.3-6024403e.patch

# Patch 16 -> 18 follow-on patches 14 & 15 from upstream, while perhaps
# not specifically RHEL releated, they'll make it far easier to apply future
# patches that will be necessary.

# S390: Avoid the generation of default input and graphics
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch16: libvirt-cim-0.6.3-1fae439d.patch

# libxkutil: Provide easy access to the libvirt capabilities
# uthor: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Patch17: libvirt-cim-0.6.3-3e6f1489.patch

# VSSM: Set default values based on libvirt capabilities on DefineSystem calls
# Author: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Patch18: libvirt-cim-0.6.3-117dabb9.patch

# Patches 19 & 20 fix a couple of memory leaks

# libxkutil: Plug memory leaks in device parsing
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch19: libvirt-cim-0.6.3-f6b7eeaf.patch

# xml_parse_test: Call cleanup_dominfo before exiting
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch20: libvirt-cim-0.6.3-605090b6.patch

# Patch 21 -> 27 add support for full function console. Again, although
# more s390 work, applying these make future patches easier to add

# VSMS: Set resource types for default devices
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch21: libvirt-cim-0.6.3-ee84e10f.patch

# schema: New SVPC types for chardev/consoles
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch22: libvirt-cim-0.6.3-93ea8130.patch

# libxkutil: Console Support
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch23: libvirt-cim-0.6.3-fffbde4e.patch

# RASD: Schema and Provider Support for Console RASDs
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch24: libvirt-cim-0.6.3-8a060e0d.patch

# Device: CIM_LogicalDevice for consoles
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch25: libvirt-cim-0.6.3-a3649c21.patch

# VSMS: Support for domains with console devices
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch26: libvirt-cim-0.6.3-21dea212.patch

# VSMS: add default console
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch27: libvirt-cim-0.6.3-583ea685.patch

# Patch 28 -> 30 - add the patches for console fixes and enhancements

# libxkutil: Simplify XML handling of consoles
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch28: libvirt-cim-0.6.3-f70a8ea0.patch

# Virt_Device: Add a device class for consoles
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch29: libvirt-cim-0.6.3-ace5e8fd.patch

# KVMRedirectionSAP: Only return redirection SAPs for VNC graphics
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch30: libvirt-cim-0.6.3-242ddaa6.patch

# Patch 31 -> 35 - Persistent Device Address Support

# RASD/schema: Add properties for device address representation
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com
Patch31: libvirt-cim-0.6.3-5940d2c8.patch

# libxkutil: Support for device addresses
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch32: libvirt-cim-0.6.3-4f74864c.patch

# RASD: Support for device address properties
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch33: libvirt-cim-0.6.3-a72ab39b.patch

# VSMS: Support for device addresses
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch34: libvirt-cim-0.6.3-6bc7bfdf.patch

# VSMS: Improve device cleanup
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch35: libvirt-cim-0.6.3-d75cae45.patch

# Patch 36 - Bugfix: Changed resource type value EMU

# libvirt-cim: Changed resource type value EMU
# Author: Daniel Hansel <daniel.hansel@linux.vnet.ibm.com>
Patch36: libvirt-cim-0.6.3-6f050582.patch

# Patch 37 -> 40 Resolve endianness issues

# VSDC: Fix endianess issues
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch37: libvirt-cim-0.6.3-7e5f561c.patch

# VSSM: Fix endianness issue in domain properties
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch38: libvirt-cim-0.6.3-9a4f2a32.patch

# libxkutil: clean entire device structure to avoid memory corruption
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch39: libvirt-cim-0.6.3-14883f33.patch

# FilterEntry: Fix endianness issues
# Author: Thilo Boehm <tboehm@linux.vnet.ibm.com>
Patch40: libvirt-cim-0.6.3-2e9c18d6.patch

# Patch 41 - Bugfix: Added missing address element for filesystem 'disk'

# libxkutil: Added missing address element for filesystem 'disk'
# Author: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Patch41: libvirt-cim-0.6.3-6a13c463.patch

# Patch 42 - 48 Coverity cleanups

# VSMS: Coverity cleanups
# Author: John Ferlan <jferlan@redhat.com>
Patch42: libvirt-cim-0.6.3-f9fc5821.patch

# libxkutil:pool_parsing: Coverity cleanups
# Author: John Ferlan <jferlan@redhat.com>
Patch43: libvirt-cim-0.6.3-7f3288be.patch

# libxkutil:device_parsing: Coverity cleanups
# Author: John Ferlan <jferlan@redhat.com>
Patch44: libvirt-cim-0.6.3-4013f9a0.patch

# libxkutil/xml_parse_test: Coverity cleanup
# Author: John Ferlan <jferlan@redhat.com>
Patch45: libvirt-cim-0.6.3-a6cbafc6.patch

# RAFP: Coverity cleanup
# Author: John Ferlan <jferlan@redhat.com>
Patch46: libvirt-cim-0.6.3-55d3f9fc.patch

# EAFP: Coverity cleanup
# Author: John Ferlan <jferlan@redhat.com>
Patch47: libvirt-cim-0.6.3-8eb5c1e7.patch

# Adjust sscanf format string
# Author: John Ferlan <jferlan@redhat.com>
Patch48: libvirt-cim-0.6.3-fb5d2fcf.patch

# Patch 49 - 50 rawio and sgio support

# Add rawio property support
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch49: libvirt-cim-0.6.3-d9414e36.patch

# Add sgio property support
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch50: libvirt-cim-0.6.3-1a91ecd3.patch

# Patch 51 - 59 Controller and Controller Pools support

# Add virtual controller device types
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch51: libvirt-cim-0.6.3-4954aa8c.patch

# Parse/Store controller XML tags
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch52: libvirt-cim-0.6.3-48b28b6a.patch

# Add virtual controller object definitions to mofs
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch53: libvirt-cim-0.6.3-a16ca9d0.patch

# Set fields in mofs for Controller Device/RASD
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch54: libvirt-cim-0.6.3-de34dda2.patch

# VSMS: Support for domains with controller devices
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch55: libvirt-cim-0.6.3-ca8e81b3.patch

# Controller: Add associations for KVM_Controller
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
Patch56: libvirt-cim-0.6.3-53a4dff9.patch

# Add MOFS and change install for ControllerPools
# Author: John Ferlan <jferlan@redhat.com>
Patch57: libvirt-cim-0.6.3-222a3219.patch

# Add code and associations for ControllerPool
# Author: John Ferlan <jferlan@redhat.com>
Patch58: libvirt-cim-0.6.3-58d6e308.patch

# xmlgen: fix build issue
# Author: Pavel Hrdina <phrdina@redhat.com>
Patch59: libvirt-cim-0.6.3-2cbbac52.patch

# Patch 59 - 61 - Bug fixes for missing portions of previous patches
# and fix for build breaker with newer gcc

# Add disk device='lun' support
# Author: Xu Wang <gesaint@linux.vnet.ibm.com>
# Note: Avoids merge conflicts for Patch61
Patch60: libvirt-cim-0.6.3-5787acc15.patch

# Complete the support for dumpCore
# Author: Xu Wang <gesaint@linux.vnet.ibm.com
# Note: From Patch13
Patch61: libvirt-cim-0.6.3-43ea7135.patch

# list_util.h: Drop inline modifiers
# Author: Michal Privoznik <mprivozn@redhat.com>
# Fixes build issue with gcc 5.0
Patch62: libvirt-cim-0.6.3-63acad05.patch

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
URL: http://libvirt.org/CIM/
Requires: libxml2 >= 2.6.0
Requires: libvirt >= 0.9.0
Requires: unzip
# either tog-pegasus or sblim-sfcb should provide cim-server
Requires: cim-server
BuildRequires: libtool
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: libcmpiutil >= 0.5.4
BuildRequires: tog-pegasus-devel
BuildRequires: libvirt-devel >= 0.9.0

# In RHEL5 uuid-devel is provided by e2fsprogs
%if 0%{?el5}
BuildRequires: e2fsprogs-devel
%else
BuildRequires: libuuid-devel
BuildRequires: libconfig-devel
%endif

BuildRequires: libxml2-devel
BuildRequires: libcmpiutil-devel
%if 0%{?fedora} >= 17 || 0%{?rhel} >= 7
BuildRequires: systemd-units
%endif
BuildConflicts: sblim-cmpi-devel

%description
Libvirt-cim is a CMPI CIM provider that implements the DMTF SVPC
virtualization model. The goal is to support most of the features
exported by libvirt itself, enabling management of multiple
platforms with a single provider.

%prep
%setup -q

# Update configure for aarch64 (bz #925923)
%patch1 -p1
# Patches for installation issues (bz #1070346)
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
# Patches for adding properties for arch and machine
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
# Patches for 3390 Enablement
%patch16 -p1
%patch17 -p1
%patch18 -p1
# Patches for fixing memory leaks
%patch19 -p1
%patch20 -p1
# Patches for full function consoles
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
# Patches for Console Fixes and Enhancements
%patch28 -p1
%patch29 -p1
%patch30 -p1
# Patches for Persistent Device Address Support
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
# Bugfix: Changed resource type value EMU
%patch36 -p1
# Patches for Endianness issues
%patch37 -p1
%patch38 -p1
%patch39 -p1
%patch40 -p1
# Bugfix: Added missing address element for filesystem 'disk'
%patch41 -p1
# Patches for Coverity cleanups
%patch42 -p1
%patch43 -p1
%patch44 -p1
%patch45 -p1
%patch46 -p1
%patch47 -p1
%patch48 -p1
# Patches for sgio and rawio suport
%patch49 -p1
%patch50 -p1
# Patches for Controller and ControllerPool
%patch51 -p1
%patch52 -p1
%patch53 -p1
%patch54 -p1
%patch55 -p1
%patch56 -p1
%patch57 -p1
%patch58 -p1
%patch59 -p1
# Patches for bug fixes, potential build breakers
%patch60 -p1
%patch61 -p1
%patch62 -p1

%build
# Run the upstream commands from autoconfiscate.sh
libtoolize --copy --force --automake
aclocal --force
autoheader --force
automake -i --add-missing --copy --foreign
autoconf --force

# Need to update .revision in order to allow cimtest to recognize the
# controller and controller pools which were added as of upstream revision
# number 1312

echo "1316" > .revision
echo "63acad0" > .changeset

%configure --disable-werror
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
make %{?_smp_mflags}

%install
rm -fr $RPM_BUILD_ROOT

make DESTDIR=$RPM_BUILD_ROOT install
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
rm -f $RPM_BUILD_ROOT%{_libdir}/cmpi/*.la
rm -f $RPM_BUILD_ROOT%{_libdir}/cmpi/*.a
rm -f $RPM_BUILD_ROOT%{_libdir}/libxkutil.so
rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-cim-%{version}
mkdir -p $RPM_BUILD_ROOT/etc/ld.so.conf.d
echo %{_libdir}/cmpi > $RPM_BUILD_ROOT/etc/ld.so.conf.d/libvirt-cim.%{_arch}.conf
mkdir -p $RPM_BUILD_ROOT/etc/libvirt/cim

%clean
rm -fr $RPM_BUILD_ROOT

%pre
%define REGISTRATION %{_datadir}/%{name}/*.registration
%define SCHEMA %{_datadir}/%{name}/*.mof

%define INTEROP_REG %{_datadir}/%{name}/{RegisteredProfile,ElementConformsToProfile,ReferencedProfile}.registration
%define INTEROP_MOF %{_datadir}/%{name}/{ComputerSystem,HostSystem,RegisteredProfile,DiskPool,MemoryPool,NetPool,ProcessorPool,VSMigrationService,ElementConformsToProfile,ReferencedProfile,AllocationCapabilities}.mof

%define PGINTEROP_REG %{_datadir}/%{name}/{RegisteredProfile,ElementConformsToProfile,ReferencedProfile}.registration
%define PGINTEROP_MOF %{_datadir}/%{name}/{RegisteredProfile,ElementConformsToProfile,ReferencedProfile}.mof

%define CIMV2_REG %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,ElementConformsToProfile,HostedAccessPoint}.registration
%define CIMV2_MOF %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,RegisteredProfile,ComputerSystem,ElementConformsToProfile,HostedAccessPoint}.mof

# _If_ there is already a version of this installed, we must deregister
# the classes we plan to install in post, otherwise we may corrupt
# the pegasus repository. This is convention in other provider packages
%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true

%post
/sbin/ldconfig

%{_datadir}/%{name}/install_base_schema.sh %{_datadir}/%{name}

%if 0%{?Fedora} >= 17 || 0%{?rhel} >= 7
if [ "`systemctl is-active tog-pegasus.service`" = "active" ]
then
systemctl restart tog-pegasus.service
fi

if [ "`systemctl is-active sblim-sfcb.service`" = "active" ]
then
systemctl restart sblim-sfcb.service
fi
%else
/etc/init.d/tog-pegasus condrestart
%endif

if [ -x /usr/sbin/cimserver ]
then
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/PG_InterOp \
-r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t pegasus \
-n root/cimv2\
-r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
fi
if [ -x /usr/sbin/sfcbd ]
then
%{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/PG_InterOp \
-r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -t sfcb \
-n root/cimv2\
-r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
fi

%preun
if [ -x /usr/sbin/cimserver ]
then
%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-n root/PG_InterOp \
-r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-n root/cimv2 \
-r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
fi
if [ -x /usr/sbin/sfcbd ]
then
%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-n root/virt \
-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-n root/interop \
-r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-n root/PG_InterOp \
-r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-n root/cimv2 \
-r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
fi

%postun -p /sbin/ldconfig

%files
%defattr(-, root, root)
%{_sysconfdir}/libvirt/cim

%doc README COPYING doc/CodingStyle doc/SubmittingPatches
%doc base_schema/README.DMTF
%doc doc/*.html
%{_libdir}/lib*.so*
%{_libdir}/cmpi/lib*.so*
%{_datadir}/libvirt-cim
%{_datadir}/libvirt-cim/*.sh
%{_datadir}/libvirt-cim/*.mof
%{_datadir}/libvirt-cim/cimv*-interop_mof
%{_datadir}/libvirt-cim/cimv*-cimv2_mof
%{_datadir}/libvirt-cim/*.registration
%{_datadir}/libvirt-cim/cim_schema_*-MOFs.zip
%{_sysconfdir}/ld.so.conf.d/libvirt-cim.%{_arch}.conf
%config(noreplace) %{_sysconfdir}/libvirt-cim.conf

%changelog
* Mon May 4 2015 John Ferlan <jferlan@redhat.com> 0.6.3-19
- Add in upstream changes post bz#1075874 to fix a couple of issues
with supporting patch and to avoid future potential build issue

* Mon May 4 2015 John Ferlan <jferlan@redhat.com> 0.6.3-18
- Changes to resolve bz#1075874
- Add code to support controller and controller pools

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-17
- Add in upstream submit to support bz#1075874
- rawio and sgio support

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-16
- Add in upstream submit to support bz#1075874
- Coverity cleanups

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-15
- Add in upstream submit to support bz#1075874
- Added missing address element for filesystem 'disk'

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-14
- Add in upstream submit to support bz#1075874
- Resolve endianness issues

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-13
- Add in upstream submit to support bz#1075874
- Changed resource type value EMU

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-12
- Add in upstream submit to support bz#1075874
- Persistent Device Address Support

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-11
- Add in upstream submit to support bz#1075874
- Console Fixes and Enhancements

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-10
- Add in upstream submit to support bz#1075874
- Support for full function consoles

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-9
- Add in upstream submit to support bz#1075874
- Remove memory leaks in XML device parsing

* Fri May 1 2015 John Ferlan <jferlan@redhat.com> 0.6.3-8
- Add in upstream submit to support bz#1075874
- Support for s390

* Tue Apr 28 2015 John Ferlan <jferlan@redhat.com> 0.6.3-7
- Build in RHEL 7.2 branch was failing, add upstream autoconfiscate.sh
contents to the %build section, plus the prerequisite BuildRequires for
libtool. Also generates the .revision and .changeset for each build.

* Thu Feb 27 2014 John Ferlan <jferlan@redhat.com> 0.6.3-6
- Add properties for arch and machine bz#1070337

* Thu Feb 27 2014 John Ferlan <jferlan@redhat.com> 0.6.3-5
- Use root/interop instead of root/PG_InterOp for tog-pegasus bz#1070346

* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 0.6.3-4
- Mass rebuild 2014-01-24

* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 0.6.3-3
- Mass rebuild 2013-12-27

* Tue Aug 6 2013 John Ferlan <jferlan@redhat.com> 0.6.3-2
- Replace the path to the source tar.gz file

* Thu Jul 25 2013 Daniel Veillard <veillard@redhat.com> 0.6.3-1
- update to 0.6.3 release

* Fri Jun 28 2013 Cole Robinson <crobinso@redhat.com> - 0.6.2-2
- Update configure for aarch64 (bz #925923)

* Mon Apr 15 2013 Daniel Veillard <veillard@redhat.com> 0.6.2-1
- update to 0.6.2 release

* Thu Feb 14 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.6.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild

* Thu Jul 19 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.6.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild

* Mon Mar 12 2012 Daniel Veillard <veillard@redhat.com> - 0.6.1-2
- fix build in the presence of sblim-sfcb
- add schemas (de)registration with sfcb if found

* Mon Mar 5 2012 Daniel Veillard <veillard@redhat.com> - 0.6.1-1
- update to upstream release 0.6.1
- allow to use tog-pegasus or sblimfscb
- switch for systemctl for conditional restart of the server

* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.5.14-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild

* Mon Jul 25 2011 Daniel Veillard <veillard@redhat.com> - 0.5.14-1
- update to upstream release 0.5.14

* Wed Jul 6 2011 Daniel Veillard <veillard@redhat.com> - 0.5.13-1
- update to upstream release 0.5.13

* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.5.8-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild

* Mon Dec 07 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.8-2
- Add missing namespace unreg bits for root/interop, root/cimv2
- Remove additional reg call of root/virt from postinstall
- Do not use /etc directly. Use sysconfigdir instead
- Remove additional DESTDIR definition
- Fix Xen migration URI to not include 'system'
- Change net->name to net->source

* Wed Dec 02 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.8-1
- Updated to latest upstream source

* Mon Oct 05 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.7-1
- Updated to latest upstream source

* Sat Jul 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.5.6-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild

* Tue Jul 14 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.6-1
- Updated to latest upstream source

* Tue Apr 21 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.5-1
- Updated to latest upstream source

* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.5.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild

* Tue Feb 17 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.4-1
- Updated to latest upstream source

* Thu Jan 15 2009 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.3-1
- Updated to latest upstream source

* Mon Oct 06 2008 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.2-1
- Updated to latest upstream source

* Tue Sep 23 2008 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.1-5
- Added vsmigser_schema patch to remove dup method name from VSMigrationService
- Added mem_parse patch to set proper mem max_size and mem values
- Added mig_prof_ver patch to report the proper Migration Profile version
- Added hyp_conn_fail patch to fix when not connecting to hyp returns a failure
- Added rm_def_virtdev patch to remove default DiskRADSD virtual device
- Added rm_eafp_err patch to remove error status when EAFP no pool link exists
- Added sdc_unsup patch to make SDC not return unsup for RASD to AC case

* Wed Aug 27 2008 Kaitlin Rupert <kaitlin@us.ibm.com> - 0.5.1-4
- Added nostate patch to consider XenFV no state guests as running guests
- Added createsnap_override patch to add vendor defined values to CreateSnapshot
- Added add_shutdown_rsc patch to add support for shutdown operation
- Added vsmc_add_remove patch to expose Add/Remove resources via VSMC
- Added override_refconf patch to fix dup devs where ID matches refconf dev ID

* Thu Aug 07 2008 Dan Smith <danms@us.ibm.com> - 0.5.1-3
- Added infostore_trunc patch to fix infostore corruption
- Added vsss_paramname patch to fix VSSS parameter name
- Added vsss_logic patch to fix terminal memory snapshot logic
- Added /etc/libvirt/cim directory for infostore

* Thu Jul 31 2008 Dan Smith <danms@us.ibm.com> - 0.5.1-1
- Updated to latest upstream source

* Tue Jun 03 2008 Dan Smith <danms@us.ibm.com> - 0.5-1
- Updated to latest upstream source

* Fri May 30 2008 Dan Smith <danms@us.ibm.com> - 0.4-2
- Fixed schema registration to pick up ECTP in root/virt properly
- Fixed schema registration to include ReferencedProfile in interop
- Added RASD namespace fix

* Wed May 21 2008 Dan Smith <danms@us.ibm.com> - 0.4-1
- Updated to latest upstream source
- Added default disk pool configuration patch

* Fri Mar 14 2008 Dan Smith <danms@us.ibm.com> - 0.3-4
- Fixed loader config for 64-bit systems
- Added missing root/interop schema install
- Added RegisteredProfile.registration to install

* Fri Mar 07 2008 Dan Smith <danms@us.ibm.com> - 0.3-2
- Added KVM method enablement patch

* Mon Mar 03 2008 Dan Smith <danms@us.ibm.com> - 0.3-1
- Updated to latest upstream source

* Wed Feb 13 2008 Dan Smith <danms@us.ibm.com> - 0.2-1
- Updated to latest upstream source

* Thu Jan 17 2008 Dan Smith <danms@us.ibm.com> - 0.1-8
- Add ld.so.conf.d configuration

* Mon Jan 14 2008 Dan Smith <danms@us.ibm.com> - 0.1-7
- Update to offical upstream release
- Patch source to fix parallel make issue until fixed upstream

* Mon Jan 07 2008 Dan Smith <danms@us.ibm.com> - 0.1-3
- Remove RPATH on provider modules

* Mon Jan 07 2008 Dan Smith <danms@us.ibm.com> - 0.1-2
- Cleaned up Release
- Removed unnecessary Requires
- After install, condrestart pegasus
- Updated to latest source snapshot

* Fri Oct 26 2007 Daniel Veillard <veillard@redhat.com> - 0.1-1
- created
Loading…
Cancel
Save