[libvirt] [PATCH 10/11] Convert Xen domain stats/peek driver methods to use virDomainDefPtr
Jim Fehlig
jfehlig at suse.com
Mon May 20 22:17:45 UTC 2013
Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Introduce use of a virDomainDefPtr in the domain stats &
> peek APIs to simplify introduction of ACL security checks.
> The virDomainPtr cannot be safely used, since the app
> may have supplied mis-matching name/uuid/id fields. eg
> the name points to domain X, while the uuid points to
> domain Y. Resolving the virDomainPtr to a virDomainDefPtr
> ensures a consistent name/uuid/id set.
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/xen/block_stats.c | 6 +++---
> src/xen/block_stats.h | 2 +-
> src/xen/xen_driver.c | 37 +++++++++++++++++++++++++++++++++----
> src/xen/xen_hypervisor.c | 11 ++++++-----
> src/xen/xen_hypervisor.h | 9 +++++----
> src/xen/xend_internal.c | 21 +++++++++++----------
> src/xen/xend_internal.h | 7 ++++++-
> src/xen/xm_internal.c | 3 ++-
> src/xen/xm_internal.h | 7 ++++++-
> 9 files changed, 73 insertions(+), 30 deletions(-)
>
> diff --git a/src/xen/block_stats.c b/src/xen/block_stats.c
> index ded8d7f..56a3901 100644
> --- a/src/xen/block_stats.c
> +++ b/src/xen/block_stats.c
> @@ -359,16 +359,16 @@ xenLinuxDomainDeviceID(int domid, const char *path)
>
> int
> xenLinuxDomainBlockStats(xenUnifiedPrivatePtr priv,
> - virDomainPtr dom,
> + virDomainDefPtr def,
> const char *path,
> struct _virDomainBlockStats *stats)
> {
> - int device = xenLinuxDomainDeviceID(dom->id, path);
> + int device = xenLinuxDomainDeviceID(def->id, path);
>
> if (device < 0)
> return -1;
>
> - return read_bd_stats(priv, device, dom->id, stats);
> + return read_bd_stats(priv, device, def->id, stats);
> }
>
> #endif /* __linux__ */
> diff --git a/src/xen/block_stats.h b/src/xen/block_stats.h
> index 0a3c40a..6633d97 100644
> --- a/src/xen/block_stats.h
> +++ b/src/xen/block_stats.h
> @@ -28,7 +28,7 @@
> # include "xen_driver.h"
>
> extern int xenLinuxDomainBlockStats (xenUnifiedPrivatePtr priv,
> - virDomainPtr dom, const char *path,
> + virDomainDefPtr def, const char *path,
> struct _virDomainBlockStats *stats);
>
> extern int xenLinuxDomainDeviceID(int domid, const char *dev);
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 5ab1a52..7c00b70 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1957,14 +1957,34 @@ static int
> xenUnifiedDomainBlockStats(virDomainPtr dom, const char *path,
> struct _virDomainBlockStats *stats)
> {
> - return xenHypervisorDomainBlockStats(dom, path, stats);
> + virDomainDefPtr def = NULL;
> + int ret = -1;
> +
> + if (!(def = xenGetDomainDefForDom(dom)))
> + goto cleanup;
> +
> + ret = xenHypervisorDomainBlockStats(dom->conn, def, path, stats);
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path,
> struct _virDomainInterfaceStats *stats)
> {
> - return xenHypervisorDomainInterfaceStats(dom, path, stats);
> + virDomainDefPtr def = NULL;
> + int ret = -1;
> +
> + if (!(def = xenGetDomainDefForDom(dom)))
> + goto cleanup;
> +
> + ret = xenHypervisorDomainInterfaceStats(def, path, stats);
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> @@ -1973,13 +1993,22 @@ xenUnifiedDomainBlockPeek(virDomainPtr dom, const char *path,
> void *buffer, unsigned int flags)
> {
> xenUnifiedPrivatePtr priv = dom->conn->privateData;
> + virDomainDefPtr def = NULL;
> + int ret = -1;
>
> virCheckFlags(0, -1);
>
> + if (!(def = xenGetDomainDefForDom(dom)))
> + goto cleanup;
> +
> if (dom->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> - return xenXMDomainBlockPeek(dom, path, offset, size, buffer);
> + ret = xenXMDomainBlockPeek(dom->conn, def, path, offset, size, buffer);
> else
> - return xenDaemonDomainBlockPeek(dom, path, offset, size, buffer);
> + ret = xenDaemonDomainBlockPeek(dom->conn, def, path, offset, size, buffer);
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
> index 2525566..612ac77 100644
> --- a/src/xen/xen_hypervisor.c
> +++ b/src/xen/xen_hypervisor.c
> @@ -1368,17 +1368,18 @@ xenHypervisorSetSchedulerParameters(virConnectPtr conn,
>
>
> int
> -xenHypervisorDomainBlockStats(virDomainPtr dom,
> +xenHypervisorDomainBlockStats(virConnectPtr conn,
> + virDomainDefPtr def,
> const char *path,
> struct _virDomainBlockStats *stats)
> {
> #ifdef __linux__
> - xenUnifiedPrivatePtr priv = dom->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
> int ret;
>
> xenUnifiedLock(priv);
> /* Need to lock because it hits the xenstore handle :-( */
> - ret = xenLinuxDomainBlockStats(priv, dom, path, stats);
> + ret = xenLinuxDomainBlockStats(priv, def, path, stats);
> xenUnifiedUnlock(priv);
> return ret;
> #else
> @@ -1396,7 +1397,7 @@ xenHypervisorDomainBlockStats(virDomainPtr dom,
> * virNetwork interface, as yet not decided.
> */
> int
> -xenHypervisorDomainInterfaceStats(virDomainPtr dom,
> +xenHypervisorDomainInterfaceStats(virDomainDefPtr def,
> const char *path,
> struct _virDomainInterfaceStats *stats)
> {
> @@ -1411,7 +1412,7 @@ xenHypervisorDomainInterfaceStats(virDomainPtr dom,
> _("invalid path, should be vif<domid>.<n>."));
> return -1;
> }
> - if (rqdomid != dom->id) {
> + if (rqdomid != def->id) {
> virReportError(VIR_ERR_INVALID_ARG, "%s",
> _("invalid path, vif<domid> should match this domain ID"));
> return -1;
> diff --git a/src/xen/xen_hypervisor.h b/src/xen/xen_hypervisor.h
> index 1e5bb67..6aeab79 100644
> --- a/src/xen/xen_hypervisor.h
> +++ b/src/xen/xen_hypervisor.h
> @@ -122,13 +122,14 @@ int xenHypervisorSetSchedulerParameters(virConnectPtr conn,
> int nparams)
> ATTRIBUTE_NONNULL (1);
>
> -int xenHypervisorDomainBlockStats (virDomainPtr domain,
> +int xenHypervisorDomainBlockStats (virConnectPtr conn,
> + virDomainDefPtr def,
> const char *path,
> struct _virDomainBlockStats *stats)
> ATTRIBUTE_NONNULL (1);
> -int xenHypervisorDomainInterfaceStats (virDomainPtr domain,
> - const char *path,
> - struct _virDomainInterfaceStats *stats)
> +int xenHypervisorDomainInterfaceStats (virDomainDefPtr def,
> + const char *path,
> + struct _virDomainInterfaceStats *stats)
> ATTRIBUTE_NONNULL (1);
>
> int xenHypervisorNodeGetCellsFreeMemory(virConnectPtr conn,
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 3bcd19b..273408d 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -3247,13 +3247,14 @@ error:
> * Returns 0 if successful, -1 if error
> */
> int
> -xenDaemonDomainBlockPeek(virDomainPtr domain,
> +xenDaemonDomainBlockPeek(virConnectPtr conn,
> + virDomainDefPtr minidef,
>
Function comments need updated.
ACK.
Regards,
Jim
> const char *path,
> unsigned long long offset,
> size_t size,
> void *buffer)
> {
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
> struct sexpr *root = NULL;
> int fd = -1, ret = -1;
> virDomainDefPtr def;
> @@ -3263,12 +3264,12 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
> const char *actual;
>
> /* Security check: The path must correspond to a block device. */
> - if (domain->id > 0)
> - root = sexpr_get(domain->conn, "/xend/domain/%d?detail=1",
> - domain->id);
> - else if (domain->id < 0)
> - root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1",
> - domain->name);
> + if (minidef->id > 0)
> + root = sexpr_get(conn, "/xend/domain/%d?detail=1",
> + minidef->id);
> + else if (minidef->id < 0)
> + root = sexpr_get(conn, "/xend/domain/%s?detail=1",
> + minidef->name);
> else {
> /* This call always fails for dom0. */
> virReportError(VIR_ERR_OPERATION_INVALID,
> @@ -3283,8 +3284,8 @@ xenDaemonDomainBlockPeek(virDomainPtr domain,
>
> id = xenGetDomIdFromSxpr(root, priv->xendConfigVersion);
> xenUnifiedLock(priv);
> - tty = xenStoreDomainGetConsolePath(domain->conn, id);
> - vncport = xenStoreDomainGetVNCPort(domain->conn, id);
> + tty = xenStoreDomainGetConsolePath(conn, id);
> + vncport = xenStoreDomainGetVNCPort(conn, id);
> xenUnifiedUnlock(priv);
>
> if (!(def = xenParseSxpr(root, priv->xendConfigVersion, NULL, tty,
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index cef7da4..aa05130 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -187,7 +187,12 @@ int xenDaemonDomainMigratePerform (virConnectPtr conn,
> const char *uri, unsigned long flags,
> const char *dname, unsigned long resource);
>
> -int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
> +int xenDaemonDomainBlockPeek(virConnectPtr conn,
> + virDomainDefPtr def,
> + const char *path,
> + unsigned long long offset,
> + size_t size,
> + void *buffer);
>
> char * xenDaemonGetSchedulerType(virConnectPtr conn,
> int *nparams);
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index bc98cf1..740c4df 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -1404,7 +1404,8 @@ xenXMDomainDetachDeviceFlags(virConnectPtr conn,
> }
>
> int
> -xenXMDomainBlockPeek(virDomainPtr dom ATTRIBUTE_UNUSED,
> +xenXMDomainBlockPeek(virConnectPtr conn ATTRIBUTE_UNUSED,
> + virDomainDefPtr def ATTRIBUTE_UNUSED,
> const char *path ATTRIBUTE_UNUSED,
> unsigned long long offset ATTRIBUTE_UNUSED,
> size_t size ATTRIBUTE_UNUSED,
> diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
> index 78cd15c..25b4fd5 100644
> --- a/src/xen/xm_internal.h
> +++ b/src/xen/xm_internal.h
> @@ -80,7 +80,12 @@ int xenXMDomainCreate(virConnectPtr conn,
> int xenXMDomainDefineXML(virConnectPtr con, virDomainDefPtr def);
> int xenXMDomainUndefine(virConnectPtr conn, virDomainDefPtr def);
>
> -int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer);
> +int xenXMDomainBlockPeek(virConnectPtr conn,
> + virDomainDefPtr def,
> + const char *path,
> + unsigned long long offset,
> + size_t size,
> + void *buffer);
>
> int xenXMDomainGetAutostart(virDomainDefPtr def,
> int *autostart);
>
More information about the libvir-list
mailing list