Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
Since the Xen driver was changed to only execute inside libvirtd,
there is no scenario in which it will be opened from a non-privileged
context. This all the code dealing with opening the sub-drivers can
s/This/Thus/ ?
be simplified to assume that they are always privileged.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/xen/xen_driver.c | 148 +++++++++++++++++++++--------------------------
src/xen/xen_driver.h | 1 -
src/xen/xen_hypervisor.c | 9 ++-
src/xen/xen_hypervisor.h | 2 +-
src/xen/xen_inotify.c | 8 +--
src/xen/xen_inotify.h | 11 ++--
src/xen/xend_internal.c | 9 ++-
src/xen/xend_internal.h | 4 +-
src/xen/xm_internal.c | 5 +-
src/xen/xm_internal.h | 4 +-
src/xen/xs_internal.c | 5 +-
src/xen/xs_internal.h | 2 +-
12 files changed, 91 insertions(+), 117 deletions(-)
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index 2ecb86f..b7f1ad4 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -86,14 +86,9 @@ static struct xenUnifiedDriver const * const
drivers[XEN_UNIFIED_NR_DRIVERS] = {
[XEN_UNIFIED_XEND_OFFSET] = &xenDaemonDriver,
[XEN_UNIFIED_XS_OFFSET] = &xenStoreDriver,
[XEN_UNIFIED_XM_OFFSET] = &xenXMDriver,
-#if WITH_XEN_INOTIFY
- [XEN_UNIFIED_INOTIFY_OFFSET] = &xenInotifyDriver,
-#endif
Looks like this was never used, so just removing it right? But there are
a lot of loops in this file with 'drivers[i]->', where it might be
possible that i == XEN_UNIFIED_INOTIFY_OFFSET?
};
-#if defined WITH_LIBVIRTD || defined __sun
static bool inside_daemon = false;
-#endif
/**
* xenNumaInit:
@@ -200,14 +195,14 @@ done:
return res;
}
-#ifdef WITH_LIBVIRTD
-
static int
-xenUnifiedStateInitialize(bool privileged ATTRIBUTE_UNUSED,
+xenUnifiedStateInitialize(bool privileged,
virStateInhibitCallback callback ATTRIBUTE_UNUSED,
void *opaque ATTRIBUTE_UNUSED)
{
- inside_daemon = true;
+ /* Don't allow driver to work in non-root libvirtd */
+ if (privileged)
+ inside_daemon = true;
Seems the name 'inside_daemon' is no longer appropriate. Should it be
something like 'is_privileged'?
return 0;
}
@@ -216,8 +211,6 @@ static virStateDriver state_driver = {
.stateInitialize = xenUnifiedStateInitialize,
};
-#endif
-
/*----- Dispatch functions. -----*/
/* These dispatch functions follow the model used historically
@@ -298,18 +291,15 @@ xenDomainXMLConfInit(void)
static virDrvOpenStatus
xenUnifiedConnectOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags)
{
- int i, ret = VIR_DRV_OPEN_DECLINED;
xenUnifiedPrivatePtr priv;
char ebuf[1024];
-#ifdef __sun
/*
* Only the libvirtd instance can open this driver.
* Everything else falls back to the remote driver.
*/
if (!inside_daemon)
return VIR_DRV_OPEN_DECLINED;
-#endif
if (conn->uri == NULL) {
if (!xenUnifiedProbe())
@@ -379,110 +369,108 @@ xenUnifiedConnectOpen(virConnectPtr conn, virConnectAuthPtr auth,
unsigned int f
priv->xshandle = NULL;
- /* Hypervisor is only run with privilege & required to succeed */
- if (xenHavePrivilege()) {
- VIR_DEBUG("Trying hypervisor sub-driver");
- if (xenHypervisorOpen(conn, auth, flags) == VIR_DRV_OPEN_SUCCESS) {
- VIR_DEBUG("Activated hypervisor sub-driver");
- priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] = 1;
- } else {
- goto fail;
- }
- }
+ /* Hypervisor required to succeed */
+ VIR_DEBUG("Trying hypervisor sub-driver");
+ if (xenHypervisorOpen(conn, auth, flags) < 0)
+ goto error;
+ VIR_DEBUG("Activated hypervisor sub-driver");
+ priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] = 1;
- /* XenD is required to succeed if privileged */
+ /* XenD is required to succeed */
VIR_DEBUG("Trying XenD sub-driver");
- if (xenDaemonOpen(conn, auth, flags) == VIR_DRV_OPEN_SUCCESS) {
- VIR_DEBUG("Activated XenD sub-driver");
- priv->opened[XEN_UNIFIED_XEND_OFFSET] = 1;
-
- /* XenD is active, so try the xm & xs drivers too, both requird to
- * succeed if root, optional otherwise */
- if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3) {
- VIR_DEBUG("Trying XM sub-driver");
- if (xenXMOpen(conn, auth, flags) == VIR_DRV_OPEN_SUCCESS) {
- VIR_DEBUG("Activated XM sub-driver");
- priv->opened[XEN_UNIFIED_XM_OFFSET] = 1;
- }
- }
- VIR_DEBUG("Trying XS sub-driver");
- if (xenStoreOpen(conn, auth, flags) == VIR_DRV_OPEN_SUCCESS) {
- VIR_DEBUG("Activated XS sub-driver");
- priv->opened[XEN_UNIFIED_XS_OFFSET] = 1;
- } else {
- if (xenHavePrivilege())
- goto fail; /* XS is mandatory when privileged */
- }
- } else {
- if (xenHavePrivilege()) {
- goto fail; /* XenD is mandatory when privileged */
- } else {
- VIR_DEBUG("Handing off for remote driver");
- ret = VIR_DRV_OPEN_DECLINED; /* Let remote_driver try instead */
- goto clean;
- }
- }
+ if (xenDaemonOpen(conn, auth, flags) < 0)
+ goto error;
+ VIR_DEBUG("Activated XenD sub-driver");
+ priv->opened[XEN_UNIFIED_XEND_OFFSET] = 1;
+
+ /* For old XenD, the XM driver is required to succeed */
+ if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3) {
+ VIR_DEBUG("Trying XM sub-driver");
+ if (xenXMOpen(conn, auth, flags) < 0)
+ goto error;
+ VIR_DEBUG("Activated XM sub-driver");
+ priv->opened[XEN_UNIFIED_XM_OFFSET] = 1;
+ }
+
+ VIR_DEBUG("Trying XS sub-driver");
+ if (xenStoreOpen(conn, auth, flags) < 0)
+ goto error;
+ VIR_DEBUG("Activated XS sub-driver");
+ priv->opened[XEN_UNIFIED_XS_OFFSET] = 1;
xenNumaInit(conn);
if (!(priv->caps = xenHypervisorMakeCapabilities(conn))) {
- VIR_DEBUG("Failed to make capabilities");
- goto fail;
+ VIR_DEBUG("Errored to make capabilities");
Maybe one too many instances of 'fail' replaced with 'error'? I think
"Failed to make capabilities" is better than "Errored to make
capabilities" :).
+ goto error;
}
if (!(priv->xmlopt = xenDomainXMLConfInit()))
- goto fail;
+ goto error;
#if WITH_XEN_INOTIFY
- if (xenHavePrivilege()) {
- VIR_DEBUG("Trying Xen inotify sub-driver");
- if (xenInotifyOpen(conn, auth, flags) == VIR_DRV_OPEN_SUCCESS) {
- VIR_DEBUG("Activated Xen inotify sub-driver");
- priv->opened[XEN_UNIFIED_INOTIFY_OFFSET] = 1;
- }
- }
+ VIR_DEBUG("Trying Xen inotify sub-driver");
+ if (xenInotifyOpen(conn, auth, flags) < 0)
+ goto error;
The old code silently continued on if xenInotifyOpen() didn't return
success.
+ VIR_DEBUG("Activated Xen inotify sub-driver");
+ priv->opened[XEN_UNIFIED_INOTIFY_OFFSET] = 1;
#endif
if (virAsprintf(&priv->saveDir, "%s", XEN_SAVE_DIR) == -1) {
virReportOOMError();
- goto fail;
+ goto error;
}
if (virFileMakePath(priv->saveDir) < 0) {
- VIR_ERROR(_("Failed to create save dir '%s': %s"),
priv->saveDir,
+ VIR_ERROR(_("Errored to create save dir '%s': %s"),
priv->saveDir,
virStrerror(errno, ebuf, sizeof(ebuf)));
- goto fail;
+ goto error;
}
return VIR_DRV_OPEN_SUCCESS;
-fail:
- ret = VIR_DRV_OPEN_ERROR;
-clean:
+error:
VIR_DEBUG("Failed to activate a mandatory sub-driver");
- for (i = 0 ; i < XEN_UNIFIED_NR_DRIVERS ; i++)
- if (priv->opened[i])
- drivers[i]->xenClose(conn);
+#if WITH_XEN_INOTIFY
+ if (priv->opened[XEN_UNIFIED_INOTIFY_OFFSET])
+ xenInotifyClose(conn);
+#endif
+ if (priv->opened[XEN_UNIFIED_XM_OFFSET])
+ xenXMClose(conn);
+ if (priv->opened[XEN_UNIFIED_XS_OFFSET])
+ xenStoreClose(conn);
+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
+ xenDaemonClose(conn);
+ if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
+ xenHypervisorClose(conn);
virMutexDestroy(&priv->lock);
VIR_FREE(priv->saveDir);
VIR_FREE(priv);
conn->privateData = NULL;
- return ret;
+ return VIR_DRV_OPEN_ERROR;
}
static int
xenUnifiedConnectClose(virConnectPtr conn)
{
xenUnifiedPrivatePtr priv = conn->privateData;
- int i;
virObjectUnref(priv->caps);
virObjectUnref(priv->xmlopt);
virDomainEventStateFree(priv->domainEvents);
- for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
- if (priv->opened[i])
- drivers[i]->xenClose(conn);
+#if WITH_XEN_INOTIFY
+ if (priv->opened[XEN_UNIFIED_INOTIFY_OFFSET])
+ xenInotifyClose(conn);
+#endif
+ if (priv->opened[XEN_UNIFIED_XM_OFFSET])
+ xenXMClose(conn);
+ if (priv->opened[XEN_UNIFIED_XS_OFFSET])
+ xenStoreClose(conn);
+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
+ xenDaemonClose(conn);
+ if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
+ xenHypervisorClose(conn);
VIR_FREE(priv->saveDir);
virMutexDestroy(&priv->lock);
@@ -2485,9 +2473,7 @@ static virDriver xenUnifiedDriver = {
int
xenRegister(void)
{
-#ifdef WITH_LIBVIRTD
if (virRegisterStateDriver(&state_driver) == -1) return -1;
-#endif
return virRegisterDriver(&xenUnifiedDriver);
}
diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
index c39e9be..70c1226 100644
--- a/src/xen/xen_driver.h
+++ b/src/xen/xen_driver.h
@@ -93,7 +93,6 @@ extern int xenRegister (void);
* structure with direct calls in xen_unified.c.
*/
struct xenUnifiedDriver {
- virDrvConnectClose xenClose; /* Only mandatory callback; all others may be NULL */
virDrvConnectGetVersion xenVersion;
virDrvConnectGetHostname xenGetHostname;
virDrvDomainSuspend xenDomainSuspend;
diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
index d9941ec..6b41898 100644
--- a/src/xen/xen_hypervisor.c
+++ b/src/xen/xen_hypervisor.c
@@ -880,7 +880,6 @@ typedef struct xen_op_v2_dom xen_op_v2_dom;
static unsigned long long xenHypervisorGetMaxMemory(virDomainPtr domain);
struct xenUnifiedDriver xenHypervisorDriver = {
- .xenClose = xenHypervisorClose,
.xenVersion = xenHypervisorGetVersion,
.xenDomainSuspend = xenHypervisorPauseDomain,
.xenDomainResume = xenHypervisorResumeDomain,
@@ -2184,7 +2183,7 @@ VIR_ONCE_GLOBAL_INIT(xenHypervisor)
*
* Returns 0 or -1 in case of error.
*/
-virDrvOpenStatus
+int
xenHypervisorOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
unsigned int flags)
@@ -2192,10 +2191,10 @@ xenHypervisorOpen(virConnectPtr conn,
int ret;
xenUnifiedPrivatePtr priv = conn->privateData;
- virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
+ virCheckFlags(VIR_CONNECT_RO, -1);
if (xenHypervisorInitialize() < 0)
- return VIR_DRV_OPEN_ERROR;
+ return -1;
priv->handle = -1;
@@ -2207,7 +2206,7 @@ xenHypervisorOpen(virConnectPtr conn,
priv->handle = ret;
- return VIR_DRV_OPEN_SUCCESS;
+ return 0;
}
/**
diff --git a/src/xen/xen_hypervisor.h b/src/xen/xen_hypervisor.h
index 786e301..86dca88 100644
--- a/src/xen/xen_hypervisor.h
+++ b/src/xen/xen_hypervisor.h
@@ -53,7 +53,7 @@ virDomainPtr
char *
xenHypervisorDomainGetOSType (virDomainPtr dom);
-virDrvOpenStatus
+int
xenHypervisorOpen (virConnectPtr conn,
virConnectAuthPtr auth,
unsigned int flags);
diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c
index d83708c..b032bba 100644
--- a/src/xen/xen_inotify.c
+++ b/src/xen/xen_inotify.c
@@ -44,10 +44,6 @@
#define VIR_FROM_THIS VIR_FROM_XEN_INOTIFY
-struct xenUnifiedDriver xenInotifyDriver = {
- .xenClose = xenInotifyClose,
-};
-
static int
xenInotifyXenCacheLookup(virConnectPtr conn,
const char *filename,
@@ -349,7 +345,7 @@ cleanup:
*
* Returns 0 or -1 in case of error.
*/
-virDrvOpenStatus
+int
xenInotifyOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
unsigned int flags)
@@ -359,7 +355,7 @@ xenInotifyOpen(virConnectPtr conn,
char *path;
xenUnifiedPrivatePtr priv = conn->privateData;
- virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
+ virCheckFlags(VIR_CONNECT_RO, -1);
if (priv->configDir) {
priv->useXenConfigCache = 1;
diff --git a/src/xen/xen_inotify.h b/src/xen/xen_inotify.h
index 8b31b50..6055c88 100644
--- a/src/xen/xen_inotify.h
+++ b/src/xen/xen_inotify.h
@@ -24,13 +24,10 @@
# define __VIR_XEN_INOTIFY_H__
# include "internal.h"
-# include "driver.h"
-extern struct xenUnifiedDriver xenInotifyDriver;
-
-virDrvOpenStatus xenInotifyOpen (virConnectPtr conn,
- virConnectAuthPtr auth,
- unsigned int flags);
-int xenInotifyClose (virConnectPtr conn);
+int xenInotifyOpen(virConnectPtr conn,
+ virConnectAuthPtr auth,
+ unsigned int flags);
+int xenInotifyClose(virConnectPtr conn);
#endif
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index e1f0708..eb3e63e 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -1231,15 +1231,15 @@ error:
*
* Returns 0 in case of success, -1 in case of error.
*/
-virDrvOpenStatus
+int
xenDaemonOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
unsigned int flags)
{
char *port = NULL;
- int ret = VIR_DRV_OPEN_ERROR;
+ int ret = -1;
- virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
+ virCheckFlags(VIR_CONNECT_RO, -1);
/* Switch on the scheme, which we expect to be NULL (file),
* "http" or "xen".
@@ -1286,7 +1286,7 @@ xenDaemonOpen(virConnectPtr conn,
}
done:
- ret = VIR_DRV_OPEN_SUCCESS;
+ ret = 0;
failed:
VIR_FREE(port);
@@ -3652,7 +3652,6 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
}
struct xenUnifiedDriver xenDaemonDriver = {
- .xenClose = xenDaemonClose,
.xenVersion = xenDaemonGetVersion,
.xenDomainSuspend = xenDaemonDomainSuspend,
.xenDomainResume = xenDaemonDomainResume,
diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
index 06c75e1..e5c0896 100644
--- a/src/xen/xend_internal.h
+++ b/src/xen/xend_internal.h
@@ -95,8 +95,8 @@ xenDaemonDomainFetch(virConnectPtr xend,
/* refactored ones */
-virDrvOpenStatus xenDaemonOpen(virConnectPtr conn, virConnectAuthPtr auth,
- unsigned int flags);
+int xenDaemonOpen(virConnectPtr conn, virConnectAuthPtr auth,
+ unsigned int flags);
int xenDaemonClose(virConnectPtr conn);
int xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer);
int xenDaemonNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
index 8580793..1b4d1cf 100644
--- a/src/xen/xm_internal.c
+++ b/src/xen/xm_internal.c
@@ -81,7 +81,6 @@ static int xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char
*xml,
#define XM_XML_ERROR "Invalid xml"
struct xenUnifiedDriver xenXMDriver = {
- .xenClose = xenXMClose,
.xenDomainGetMaxMemory = xenXMDomainGetMaxMemory,
.xenDomainSetMaxMemory = xenXMDomainSetMaxMemory,
.xenDomainSetMemory = xenXMDomainSetMemory,
@@ -419,14 +418,14 @@ xenXMConfigCacheRefresh(virConnectPtr conn)
* us watch for changes (see separate driver), otherwise we poll
* every few seconds
*/
-virDrvOpenStatus
+int
xenXMOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
unsigned int flags)
{
xenUnifiedPrivatePtr priv = conn->privateData;
- virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
+ virCheckFlags(VIR_CONNECT_RO, -1);
priv->configDir = XM_CONFIG_DIR;
diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
index df77ac8..6424c41 100644
--- a/src/xen/xm_internal.h
+++ b/src/xen/xm_internal.h
@@ -36,8 +36,8 @@ int xenXMConfigCacheRefresh (virConnectPtr conn);
int xenXMConfigCacheAddFile(virConnectPtr conn, const char *filename);
int xenXMConfigCacheRemoveFile(virConnectPtr conn, const char *filename);
-virDrvOpenStatus xenXMOpen(virConnectPtr conn, virConnectAuthPtr auth,
- unsigned int flags);
+int xenXMOpen(virConnectPtr conn, virConnectAuthPtr auth,
+ unsigned int flags);
Can be condensed to one line now.
int xenXMClose(virConnectPtr conn);
const char *xenXMGetType(virConnectPtr conn);
int xenXMDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
index 393e5f9..eecdcae 100644
--- a/src/xen/xs_internal.c
+++ b/src/xen/xs_internal.c
@@ -58,7 +58,6 @@ static void xenStoreWatchEvent(int watch, int fd, int events, void
*data);
static void xenStoreWatchListFree(xenStoreWatchListPtr list);
struct xenUnifiedDriver xenStoreDriver = {
- .xenClose = xenStoreClose,
.xenDomainShutdown = xenStoreDomainShutdown,
.xenDomainReboot = xenStoreDomainReboot,
.xenDomainGetOSType = xenStoreDomainGetOSType,
@@ -218,14 +217,14 @@ virDomainGetVMInfo(virDomainPtr domain, const char *vm, const char
*name)
*
* Returns 0 or -1 in case of error.
*/
-virDrvOpenStatus
+int
xenStoreOpen(virConnectPtr conn,
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
unsigned int flags)
{
xenUnifiedPrivatePtr priv = conn->privateData;
- virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
+ virCheckFlags(VIR_CONNECT_RO, -1);
if (flags & VIR_CONNECT_RO)
priv->xshandle = xs_daemon_open_readonly();
diff --git a/src/xen/xs_internal.h b/src/xen/xs_internal.h
index 84d0d29..29f0165 100644
--- a/src/xen/xs_internal.h
+++ b/src/xen/xs_internal.h
@@ -29,7 +29,7 @@
extern struct xenUnifiedDriver xenStoreDriver;
int xenStoreInit (void);
-virDrvOpenStatus xenStoreOpen (virConnectPtr conn,
+int xenStoreOpen (virConnectPtr conn,
virConnectAuthPtr auth,
unsigned int flags);
Heh, different styles used throughout these files. This code has been
around for a looong time...
I'm out of time now and will have to continue with reviews next week.
Regards,
Jim
int xenStoreClose (virConnectPtr conn);