Clarify that virDomainSetSchedulerParameters(Flags) can take subsets

Add invalid argument checks for params and nparams to the public API
and remove them from the drivers (e.g. xend).

Add subset handling to libxl and test drivers.
This commit is contained in:
Matthias Bolte 2011-05-18 11:04:12 +02:00
parent e430c0d0c6
commit d870ec367d
5 changed files with 39 additions and 28 deletions

View File

@ -5069,11 +5069,11 @@ error:
* virDomainSetSchedulerParameters:
* @domain: pointer to domain object
* @params: pointer to scheduler parameter objects
* @nparams: number of scheduler parameter
* (this value should be same or less than the returned value
* @nparams: number of scheduler parameter objects
* (this value can be the same or less than the returned value
* nparams of virDomainGetSchedulerType)
*
* Change the scheduler parameters
* Change all or a subset or the scheduler parameters.
*
* Returns -1 in case of error, 0 in case of success.
*/
@ -5092,6 +5092,12 @@ virDomainSetSchedulerParameters(virDomainPtr domain,
virDispatchError(NULL);
return -1;
}
if (params == NULL || nparams < 0) {
virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
if (domain->conn->flags & VIR_CONNECT_RO) {
virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
goto error;
@ -5118,12 +5124,12 @@ error:
* virDomainSetSchedulerParametersFlags:
* @domain: pointer to domain object
* @params: pointer to scheduler parameter objects
* @nparams: number of scheduler parameter
* (this value should be same or less than the returned value
* @nparams: number of scheduler parameter objects
* (this value can be the same or less than the returned value
* nparams of virDomainGetSchedulerType)
* @flags: virDomainSchedParameterFlags
*
* Change the scheduler parameters
* Change a subset or all scheduler parameters.
*
* Returns -1 in case of error, 0 in case of success.
*/
@ -5153,6 +5159,12 @@ virDomainSetSchedulerParametersFlags(virDomainPtr domain,
virDispatchError(NULL);
return -1;
}
if (params == NULL || nparams < 0) {
virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error;
}
if (domain->conn->flags & VIR_CONNECT_RO) {
virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
goto error;

View File

@ -2544,8 +2544,10 @@ libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params,
goto cleanup;
}
if (nparams != XEN_SCHED_CREDIT_NPARAM) {
libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count"));
if (libxl_sched_credit_domain_get(&priv->ctx, dom->id, &sc_info) != 0) {
libxlError(VIR_ERR_INTERNAL_ERROR,
_("Failed to get scheduler parameters for domain '%d'"
" with libxenlight"), dom->id);
goto cleanup;
}

View File

@ -2678,7 +2678,7 @@ static int testDomainSetSchedulerParams(virDomainPtr domain,
{
testConnPtr privconn = domain->conn->privateData;
virDomainObjPtr privdom;
int ret = -1;
int ret = -1, i;
testDriverLock(privconn);
privdom = virDomainFindByName(&privconn->domains,
@ -2690,20 +2690,19 @@ static int testDomainSetSchedulerParams(virDomainPtr domain,
goto cleanup;
}
if (nparams != 1) {
testError(VIR_ERR_INVALID_ARG, "nparams");
goto cleanup;
for (i = 0; i < nparams; i++) {
if (STRNEQ(params[i].field, "weight")) {
testError(VIR_ERR_INVALID_ARG, "field");
goto cleanup;
}
if (params[i].type != VIR_DOMAIN_SCHED_FIELD_UINT) {
testError(VIR_ERR_INVALID_ARG, "type");
goto cleanup;
}
/* XXX */
/*privdom->weight = params[i].value.ui;*/
}
if (STRNEQ(params[0].field, "weight")) {
testError(VIR_ERR_INVALID_ARG, "field");
goto cleanup;
}
if (params[0].type != VIR_DOMAIN_SCHED_FIELD_UINT) {
testError(VIR_ERR_INVALID_ARG, "type");
goto cleanup;
}
/* XXX */
/*privdom->weight = params[0].value.ui;*/
ret = 0;
cleanup:

View File

@ -1364,10 +1364,9 @@ xenHypervisorSetSchedulerParameters(virDomainPtr domain,
return -1;
}
if ((nparams == 0) || (params == NULL)) {
virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__,
"Noparameters given", 0);
return(-1);
if (nparams == 0) {
/* nothing to do, exit early */
return 0;
}
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;

View File

@ -3712,8 +3712,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
int sched_nparam = 0;
int ret = -1;
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
|| (params == NULL)) {
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
}