[libvirt] [PATCH 09/11] Convert Xen domain scheduler driver methods to use virDomainDefPtr
Jim Fehlig
jfehlig at suse.com
Mon May 20 22:09:38 UTC 2013
Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Introduce use of a virDomainDefPtr in the domain scheduler
> 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/xen_driver.c | 45 ++++++++++++++++++++++++++++++++++++---------
> src/xen/xen_hypervisor.c | 19 +++++++++++--------
> src/xen/xen_hypervisor.h | 16 +++++++++-------
> src/xen/xend_internal.c | 27 +++++++++++++++------------
> src/xen/xend_internal.h | 9 ++++++---
> 5 files changed, 77 insertions(+), 39 deletions(-)
>
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 43b3020..5ab1a52 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1851,17 +1851,26 @@ static char *
> xenUnifiedDomainGetSchedulerType(virDomainPtr dom, int *nparams)
> {
> xenUnifiedPrivatePtr priv = dom->conn->privateData;
> + virDomainDefPtr def = NULL;
> + char *ret = NULL;
> +
> + if (!(def = xenGetDomainDefForDom(dom)))
> + goto cleanup;
>
> if (dom->id < 0) {
> if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> _("Cannot change scheduler parameters"));
> - return NULL;
> + goto cleanup;
> }
> - return xenDaemonGetSchedulerType(dom, nparams);
> + ret = xenDaemonGetSchedulerType(dom->conn, nparams);
> } else {
> - return xenHypervisorGetSchedulerType(dom, nparams);
> + ret = xenHypervisorGetSchedulerType(dom->conn, nparams);
> }
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> @@ -1871,19 +1880,28 @@ xenUnifiedDomainGetSchedulerParametersFlags(virDomainPtr dom,
> 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) {
> if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> _("Cannot change scheduler parameters"));
> - return -1;
> + goto cleanup;
> }
> - return xenDaemonGetSchedulerParameters(dom, params, nparams);
> + ret = xenDaemonGetSchedulerParameters(dom->conn, def, params, nparams);
> } else {
> - return xenHypervisorGetSchedulerParameters(dom, params, nparams);
> + ret = xenHypervisorGetSchedulerParameters(dom->conn, def, params, nparams);
> }
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> @@ -1902,19 +1920,28 @@ xenUnifiedDomainSetSchedulerParametersFlags(virDomainPtr dom,
> 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) {
> if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> _("Cannot change scheduler parameters"));
> - return -1;
> + goto cleanup;
> }
> - return xenDaemonSetSchedulerParameters(dom, params, nparams);
> + ret = xenDaemonSetSchedulerParameters(dom->conn, def, params, nparams);
> } else {
> - return xenHypervisorSetSchedulerParameters(dom, params, nparams);
> + ret = xenHypervisorSetSchedulerParameters(dom->conn, def, params, nparams);
> }
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
> index b97b329..2525566 100644
> --- a/src/xen/xen_hypervisor.c
> +++ b/src/xen/xen_hypervisor.c
> @@ -1113,10 +1113,11 @@ virXen_getdomaininfo(int handle, int first_domain, xen_getdomaininfo *dominfo)
> * Returns scheduler name or NULL in case of failure
> */
> char *
> -xenHypervisorGetSchedulerType(virDomainPtr domain, int *nparams)
> +xenHypervisorGetSchedulerType(virConnectPtr conn,
> + int *nparams)
>
Still fits on one line. And function comments need updated here and
where similar changes are made below.
> {
> char *schedulertype = NULL;
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
>
> /*
> * Support only hv_versions.dom_interface >=5
> @@ -1176,11 +1177,12 @@ xenHypervisorGetSchedulerType(virDomainPtr domain, int *nparams)
> * Returns 0 or -1 in case of failure
> */
> int
> -xenHypervisorGetSchedulerParameters(virDomainPtr domain,
> +xenHypervisorGetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> virTypedParameterPtr params,
> int *nparams)
> {
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
>
> /*
> * Support only hv_versions.dom_interface >=5
> @@ -1218,7 +1220,7 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain,
> case XEN_SCHEDULER_CREDIT:
> memset(&op_dom, 0, sizeof(op_dom));
> op_dom.cmd = XEN_V2_OP_SCHEDULER;
> - op_dom.domain = (domid_t) domain->id;
> + op_dom.domain = (domid_t) def->id;
> op_dom.u.getschedinfo.sched_id = XEN_SCHEDULER_CREDIT;
> op_dom.u.getschedinfo.cmd = XEN_DOMCTL_SCHEDOP_getinfo;
> ret = xenHypervisorDoV2Dom(priv->handle, &op_dom);
> @@ -1262,13 +1264,14 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain,
> * Returns 0 or -1 in case of failure
> */
> int
> -xenHypervisorSetSchedulerParameters(virDomainPtr domain,
> +xenHypervisorSetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> virTypedParameterPtr params,
> int nparams)
> {
> int i;
> unsigned int val;
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
> char buf[256];
>
> if (nparams == 0) {
> @@ -1313,7 +1316,7 @@ xenHypervisorSetSchedulerParameters(virDomainPtr domain,
> case XEN_SCHEDULER_CREDIT: {
> memset(&op_dom, 0, sizeof(op_dom));
> op_dom.cmd = XEN_V2_OP_SCHEDULER;
> - op_dom.domain = (domid_t) domain->id;
> + op_dom.domain = (domid_t) def->id;
> op_dom.u.getschedinfo.sched_id = XEN_SCHEDULER_CREDIT;
> op_dom.u.getschedinfo.cmd = XEN_DOMCTL_SCHEDOP_putinfo;
>
> diff --git a/src/xen/xen_hypervisor.h b/src/xen/xen_hypervisor.h
> index 1cf1e14..1e5bb67 100644
> --- a/src/xen/xen_hypervisor.h
> +++ b/src/xen/xen_hypervisor.h
> @@ -106,18 +106,20 @@ int xenHypervisorGetVcpuMax (virConnectPtr conn,
> virDomainDefPtr def)
> ATTRIBUTE_NONNULL (1);
>
> -char * xenHypervisorGetSchedulerType (virDomainPtr domain,
> +char * xenHypervisorGetSchedulerType (virConnectPtr conn,
> int *nparams)
>
Is it better to fix this non-standard whitespace as the code is touched,
or with one cleanup patch? This code rarely gets touched, so maybe the
latter.
> ATTRIBUTE_NONNULL (1);
>
> -int xenHypervisorGetSchedulerParameters(virDomainPtr domain,
> - virTypedParameterPtr params,
> - int *nparams)
> +int xenHypervisorGetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> + virTypedParameterPtr params,
> + int *nparams)
> ATTRIBUTE_NONNULL (1);
>
> -int xenHypervisorSetSchedulerParameters(virDomainPtr domain,
> - virTypedParameterPtr params,
> - int nparams)
> +int xenHypervisorSetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> + virTypedParameterPtr params,
> + int nparams)
> ATTRIBUTE_NONNULL (1);
>
> int xenHypervisorDomainBlockStats (virDomainPtr domain,
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 3d852d2..3bcd19b 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -2972,9 +2972,10 @@ error:
> * caller or NULL in case of failure
> */
> char *
> -xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams)
> +xenDaemonGetSchedulerType(virConnectPtr conn,
> + int *nparams)
>
Fits on one line, and comment update here and below.
ACK.
Regards,
Jim
> {
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
> struct sexpr *root;
> const char *ret = NULL;
> char *schedulertype = NULL;
> @@ -2986,7 +2987,7 @@ xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams)
> return NULL;
> }
>
> - root = sexpr_get(domain->conn, "/xend/node/");
> + root = sexpr_get(conn, "/xend/node/");
> if (root == NULL)
> return NULL;
>
> @@ -3037,11 +3038,12 @@ error:
> * Returns 0 or -1 in case of failure
> */
> int
> -xenDaemonGetSchedulerParameters(virDomainPtr domain,
> +xenDaemonGetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> virTypedParameterPtr params,
> int *nparams)
> {
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
> struct sexpr *root;
> char *sched_type = NULL;
> int sched_nparam = 0;
> @@ -3055,12 +3057,12 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain,
> }
>
> /* look up the information by domain name */
> - root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
> + root = sexpr_get(conn, "/xend/domain/%s?detail=1", def->name);
> if (root == NULL)
> return -1;
>
> /* get the scheduler type */
> - sched_type = xenDaemonGetSchedulerType(domain, &sched_nparam);
> + sched_type = xenDaemonGetSchedulerType(conn, &sched_nparam);
> if (sched_type == NULL) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> "%s", _("Failed to get a scheduler name"));
> @@ -3139,11 +3141,12 @@ error:
> * Returns 0 or -1 in case of failure
> */
> int
> -xenDaemonSetSchedulerParameters(virDomainPtr domain,
> +xenDaemonSetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> virTypedParameterPtr params,
> int nparams)
> {
> - xenUnifiedPrivatePtr priv = domain->conn->privateData;
> + xenUnifiedPrivatePtr priv = conn->privateData;
> struct sexpr *root;
> char *sched_type = NULL;
> int i;
> @@ -3158,12 +3161,12 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
> }
>
> /* look up the information by domain name */
> - root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name);
> + root = sexpr_get(conn, "/xend/domain/%s?detail=1", def->name);
> if (root == NULL)
> return -1;
>
> /* get the scheduler type */
> - sched_type = xenDaemonGetSchedulerType(domain, &sched_nparam);
> + sched_type = xenDaemonGetSchedulerType(conn, &sched_nparam);
> if (sched_type == NULL) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> "%s", _("Failed to get a scheduler name"));
> @@ -3217,7 +3220,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
> snprintf(buf_cap, sizeof(buf_cap), "%s", cap);
> }
>
> - ret = xend_op(domain->conn, domain->name, "op",
> + ret = xend_op(conn, def->name, "op",
> "domain_sched_credit_set", "weight", buf_weight,
> "cap", buf_cap, NULL);
> break;
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index 3a7c0ac..cef7da4 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -189,11 +189,14 @@ int xenDaemonDomainMigratePerform (virConnectPtr conn,
>
> int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
>
> -char * xenDaemonGetSchedulerType(virDomainPtr domain, int *nparams);
> -int xenDaemonGetSchedulerParameters(virDomainPtr domain,
> +char * xenDaemonGetSchedulerType(virConnectPtr conn,
> + int *nparams);
> +int xenDaemonGetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> virTypedParameterPtr params,
> int *nparams);
> -int xenDaemonSetSchedulerParameters(virDomainPtr domain,
> +int xenDaemonSetSchedulerParameters(virConnectPtr conn,
> + virDomainDefPtr def,
> virTypedParameterPtr params,
> int nparams);
>
>
More information about the libvir-list
mailing list