Codebase list libvirt / 0905f82
Fix QEMU driver custom domain status XML extensions. Thanks: Daniel P. Berrange Laurent LĂ©onard 14 years ago
2 changed file(s) with 184 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 From 8baa88ec8d89140126aaa168287a17b5cf918fb3 Mon Sep 17 00:00:00 2001
1 From: Daniel P. Berrange <berrange@redhat.com>
2 Date: Mon, 18 Jan 2010 16:24:25 +0000
3 Subject: [PATCH] Fix QEMU driver custom domain status XML extensions
4
5 Invoking the virConnectGetCapabilities() method causes the QEMU
6 driver to rebuild its internal capabilities object. Unfortunately
7 it was forgetting to register the custom domain status XML hooks
8 again.
9
10 To avoid this kind of error in the future, the code which builds
11 capabilities is refactored into one single method, which can be
12 called from all locations, ensuring reliable rebuilds.
13
14 * src/qemu/qemu_driver.c: Fix rebuilding of capabilities XML and
15 guarentee it is always consistent
16 ---
17 src/qemu/qemu_driver.c | 110 +++++++++++++++++++++++-------------------------
18 1 files changed, 53 insertions(+), 57 deletions(-)
19
20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
21 index 2d80774..9a3ddfb 100644
22 --- a/src/qemu/qemu_driver.c
23 +++ b/src/qemu/qemu_driver.c
24 @@ -892,34 +892,6 @@ qemuReconnectDomains(struct qemud_driver *driver)
25
26
27 static int
28 -qemudSecurityCapsInit(virSecurityDriverPtr secdrv,
29 - virCapsPtr caps)
30 -{
31 - const char *doi, *model;
32 -
33 - doi = virSecurityDriverGetDOI(secdrv);
34 - model = virSecurityDriverGetModel(secdrv);
35 -
36 - caps->host.secModel.model = strdup(model);
37 - if (!caps->host.secModel.model) {
38 - virReportOOMError(NULL);
39 - return -1;
40 - }
41 -
42 - caps->host.secModel.doi = strdup(doi);
43 - if (!caps->host.secModel.doi) {
44 - virReportOOMError(NULL);
45 - return -1;
46 - }
47 -
48 - VIR_DEBUG("Initialized caps for security driver \"%s\" with "
49 - "DOI \"%s\"", model, doi);
50 -
51 - return 0;
52 -}
53 -
54 -
55 -static int
56 qemudSecurityInit(struct qemud_driver *qemud_drv)
57 {
58 int ret;
59 @@ -940,15 +912,52 @@ qemudSecurityInit(struct qemud_driver *qemud_drv)
60 qemud_drv->securityDriver = security_drv;
61
62 VIR_INFO("Initialized security driver %s", security_drv->name);
63 -
64 - /*
65 - * Add security policy host caps now that the security driver is
66 - * initialized.
67 - */
68 - return qemudSecurityCapsInit(security_drv, qemud_drv->caps);
69 + return 0;
70 }
71
72
73 +static virCapsPtr
74 +qemuCreateCapabilities(virCapsPtr oldcaps,
75 + virSecurityDriverPtr secDriver)
76 +{
77 + virCapsPtr caps;
78 +
79 + /* Basic host arch / guest machine capabilities */
80 + if (!(caps = qemudCapsInit(oldcaps))) {
81 + virReportOOMError(NULL);
82 + return NULL;
83 + }
84 +
85 + /* Domain XML parser hooks */
86 + caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
87 + caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
88 + caps->privateDataXMLFormat = qemuDomainObjPrivateXMLFormat;
89 + caps->privateDataXMLParse = qemuDomainObjPrivateXMLParse;
90 +
91 +
92 + /* Security driver data */
93 + if (secDriver) {
94 + const char *doi, *model;
95 +
96 + doi = virSecurityDriverGetDOI(secDriver);
97 + model = virSecurityDriverGetModel(secDriver);
98 +
99 + if (!(caps->host.secModel.model = strdup(model)))
100 + goto no_memory;
101 + if (!(caps->host.secModel.doi = strdup(doi)))
102 + goto no_memory;
103 +
104 + VIR_DEBUG("Initialized caps for security driver \"%s\" with "
105 + "DOI \"%s\"", model, doi);
106 + }
107 +
108 + return caps;
109 +
110 +no_memory:
111 + virReportOOMError(NULL);
112 + virCapabilitiesFree(caps);
113 + return NULL;
114 +}
115
116 /**
117 * qemudStartup:
118 @@ -1074,13 +1083,12 @@ qemudStartup(int privileged) {
119 virStrerror(-rc, buf, sizeof(buf)));
120 }
121
122 - if ((qemu_driver->caps = qemudCapsInit(NULL)) == NULL)
123 - goto out_of_memory;
124 + if (qemudSecurityInit(qemu_driver) < 0)
125 + goto error;
126
127 - qemu_driver->caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
128 - qemu_driver->caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
129 - qemu_driver->caps->privateDataXMLFormat = qemuDomainObjPrivateXMLFormat;
130 - qemu_driver->caps->privateDataXMLParse = qemuDomainObjPrivateXMLParse;
131 + if ((qemu_driver->caps = qemuCreateCapabilities(NULL,
132 + qemu_driver->securityDriver)) == NULL)
133 + goto error;
134
135 if ((qemu_driver->activePciHostdevs = pciDeviceListNew(NULL)) == NULL)
136 goto error;
137 @@ -1104,10 +1112,6 @@ qemudStartup(int privileged) {
138 }
139 }
140
141 - if (qemudSecurityInit(qemu_driver) < 0) {
142 - goto error;
143 - }
144 -
145 /* If hugetlbfs is present, then we need to create a sub-directory within
146 * it, since we can't assume the root mount point has permissions that
147 * will let our spawned QEMU instances use it.
148 @@ -3255,15 +3259,12 @@ static char *qemudGetCapabilities(virConnectPtr conn) {
149 char *xml = NULL;
150
151 qemuDriverLock(driver);
152 - if ((caps = qemudCapsInit(qemu_driver->caps)) == NULL)
153 - goto no_memory;
154
155 - caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
156 - caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
157 -
158 - if (qemu_driver->securityDriver &&
159 - qemudSecurityCapsInit(qemu_driver->securityDriver, caps) < 0)
160 - goto no_memory;
161 + if ((caps = qemuCreateCapabilities(qemu_driver->caps,
162 + qemu_driver->securityDriver)) == NULL) {
163 + virCapabilitiesFree(caps);
164 + goto cleanup;
165 + }
166
167 virCapabilitiesFree(qemu_driver->caps);
168 qemu_driver->caps = caps;
169 @@ -3275,11 +3276,6 @@ cleanup:
170 qemuDriverUnlock(driver);
171
172 return xml;
173 -
174 -no_memory:
175 - virCapabilitiesFree(caps);
176 - virReportOOMError(conn);
177 - goto cleanup;
178 }
179
180
181 --
182 1.6.5.2
55 0006-Terminate-nc-on-EOF.patch
66 0007-Implement-path-lookup-for-USB-by-vendor-product.patch
77 0008-qemu-Use-log-output-for-pty-assignment-if-info-chard.patch
8 0009-Fix-QEMU-driver-custom-domain-status-XML-extensions.patch