mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 14:45:24 +00:00
qemu: Refactor qemuDomainGetBlkioParameters
Get rid of lots of duplicated code.
This commit is contained in:
parent
31b4d75877
commit
9f50f6e288
@ -9080,6 +9080,58 @@ qemuDomainSetBlkioParameters(virDomainPtr dom,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainGetBlkioParametersAssignFromDef(virDomainDefPtr def,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int *nparams,
|
||||||
|
int maxparams)
|
||||||
|
{
|
||||||
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
char *data = NULL;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
#define QEMU_BLKIO_ASSIGN(param, format, name) \
|
||||||
|
if (*nparams < maxparams) { \
|
||||||
|
for (i = 0; i < def->blkio.ndevices; i++) { \
|
||||||
|
if (!def->blkio.devices[i].param) \
|
||||||
|
continue; \
|
||||||
|
virBufferAsprintf(&buf, "%s," format ",", \
|
||||||
|
def->blkio.devices[i].path, \
|
||||||
|
def->blkio.devices[i].param); \
|
||||||
|
} \
|
||||||
|
virBufferTrim(&buf, ",", -1); \
|
||||||
|
if (virBufferCheckError(&buf) < 0) \
|
||||||
|
goto error; \
|
||||||
|
data = virBufferContentAndReset(&buf); \
|
||||||
|
if (virTypedParameterAssign(&(params[(*nparams)++]), name, \
|
||||||
|
VIR_TYPED_PARAM_STRING, data) < 0) \
|
||||||
|
goto error; \
|
||||||
|
VIR_FREE(data); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* blkiotune.device_weight */
|
||||||
|
QEMU_BLKIO_ASSIGN(weight, "%u", VIR_DOMAIN_BLKIO_DEVICE_WEIGHT);
|
||||||
|
/* blkiotune.device_read_iops */
|
||||||
|
QEMU_BLKIO_ASSIGN(riops, "%u", VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS);
|
||||||
|
/* blkiotune.device_write_iops */
|
||||||
|
QEMU_BLKIO_ASSIGN(wiops, "%u", VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS);
|
||||||
|
/* blkiotune.device_read_bps */
|
||||||
|
QEMU_BLKIO_ASSIGN(rbps, "%llu", VIR_DOMAIN_BLKIO_DEVICE_READ_BPS);
|
||||||
|
/* blkiotune.device_write_bps */
|
||||||
|
QEMU_BLKIO_ASSIGN(wbps, "%llu", VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS);
|
||||||
|
|
||||||
|
#undef QEMU_BLKIO_ASSIGN
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(data);
|
||||||
|
virBufferFreeAndReset(&buf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuDomainGetBlkioParameters(virDomainPtr dom,
|
qemuDomainGetBlkioParameters(virDomainPtr dom,
|
||||||
virTypedParameterPtr params,
|
virTypedParameterPtr params,
|
||||||
@ -9087,10 +9139,10 @@ qemuDomainGetBlkioParameters(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virQEMUDriverPtr driver = dom->conn->privateData;
|
virQEMUDriverPtr driver = dom->conn->privateData;
|
||||||
size_t i, j;
|
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr def = NULL;
|
virDomainDefPtr def = NULL;
|
||||||
virDomainDefPtr persistentDef = NULL;
|
virDomainDefPtr persistentDef = NULL;
|
||||||
|
int maxparams = QEMU_NB_BLKIO_PARAM;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
qemuDomainObjPrivatePtr priv;
|
qemuDomainObjPrivatePtr priv;
|
||||||
@ -9123,8 +9175,12 @@ qemuDomainGetBlkioParameters(virDomainPtr dom,
|
|||||||
*nparams = QEMU_NB_BLKIO_PARAM;
|
*nparams = QEMU_NB_BLKIO_PARAM;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
} else if (*nparams < maxparams) {
|
||||||
|
maxparams = *nparams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*nparams = 0;
|
||||||
|
|
||||||
if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
|
if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -9135,347 +9191,31 @@ qemuDomainGetBlkioParameters(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < *nparams && i < QEMU_NB_BLKIO_PARAM; i++) {
|
/* fill blkio weight here */
|
||||||
virTypedParameterPtr param = ¶ms[i];
|
if (virCgroupGetBlkioWeight(priv->cgroup, &val) < 0)
|
||||||
val = 0;
|
goto cleanup;
|
||||||
|
if (virTypedParameterAssign(&(params[(*nparams)++]),
|
||||||
|
VIR_DOMAIN_BLKIO_WEIGHT,
|
||||||
|
VIR_TYPED_PARAM_UINT, val) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
switch (i) {
|
if (qemuDomainGetBlkioParametersAssignFromDef(def, params, nparams,
|
||||||
case 0: /* fill blkio weight here */
|
maxparams) < 0)
|
||||||
if (virCgroupGetBlkioWeight(priv->cgroup, &val) < 0)
|
goto cleanup;
|
||||||
goto cleanup;
|
|
||||||
if (virTypedParameterAssign(param, VIR_DOMAIN_BLKIO_WEIGHT,
|
|
||||||
VIR_TYPED_PARAM_UINT, val) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1: /* blkiotune.device_weight */
|
|
||||||
if (def->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < def->blkio.ndevices; j++) {
|
|
||||||
if (!def->blkio.devices[j].weight)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%u",
|
|
||||||
def->blkio.devices[j].path,
|
|
||||||
def->blkio.devices[j].weight);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (virTypedParameterAssign(param,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WEIGHT,
|
|
||||||
VIR_TYPED_PARAM_STRING,
|
|
||||||
param->value.s) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2: /* blkiotune.device_read_iops */
|
|
||||||
if (def->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < def->blkio.ndevices; j++) {
|
|
||||||
if (!def->blkio.devices[j].riops)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%u",
|
|
||||||
def->blkio.devices[j].path,
|
|
||||||
def->blkio.devices[j].riops);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (virTypedParameterAssign(param,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS,
|
|
||||||
VIR_TYPED_PARAM_STRING,
|
|
||||||
param->value.s) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3: /* blkiotune.device_write_iops */
|
|
||||||
if (def->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < def->blkio.ndevices; j++) {
|
|
||||||
if (!def->blkio.devices[j].wiops)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%u",
|
|
||||||
def->blkio.devices[j].path,
|
|
||||||
def->blkio.devices[j].wiops);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (virTypedParameterAssign(param,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS,
|
|
||||||
VIR_TYPED_PARAM_STRING,
|
|
||||||
param->value.s) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4: /* blkiotune.device_read_bps */
|
|
||||||
if (def->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < def->blkio.ndevices; j++) {
|
|
||||||
if (!def->blkio.devices[j].rbps)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%llu",
|
|
||||||
def->blkio.devices[j].path,
|
|
||||||
def->blkio.devices[j].rbps);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (virTypedParameterAssign(param,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_READ_BPS,
|
|
||||||
VIR_TYPED_PARAM_STRING,
|
|
||||||
param->value.s) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5: /* blkiotune.device_write_bps */
|
|
||||||
if (def->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < def->blkio.ndevices; j++) {
|
|
||||||
if (!def->blkio.devices[j].wbps)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%llu",
|
|
||||||
def->blkio.devices[j].path,
|
|
||||||
def->blkio.devices[j].wbps);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (virTypedParameterAssign(param,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS,
|
|
||||||
VIR_TYPED_PARAM_STRING,
|
|
||||||
param->value.s) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* coverity[dead_error_begin] */
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
/* should not hit here */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (persistentDef) {
|
} else if (persistentDef) {
|
||||||
for (i = 0; i < *nparams && i < QEMU_NB_BLKIO_PARAM; i++) {
|
/* fill blkio weight here */
|
||||||
virTypedParameterPtr param = ¶ms[i];
|
if (virTypedParameterAssign(&(params[(*nparams)++]),
|
||||||
val = 0;
|
VIR_DOMAIN_BLKIO_WEIGHT,
|
||||||
param->value.ui = 0;
|
VIR_TYPED_PARAM_UINT,
|
||||||
param->type = VIR_TYPED_PARAM_UINT;
|
persistentDef->blkio.weight) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
switch (i) {
|
if (qemuDomainGetBlkioParametersAssignFromDef(persistentDef, params,
|
||||||
case 0: /* fill blkio weight here */
|
nparams, maxparams) < 0)
|
||||||
if (virStrcpyStatic(param->field, VIR_DOMAIN_BLKIO_WEIGHT) == NULL) {
|
goto cleanup;
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Field name '%s' too long"),
|
|
||||||
VIR_DOMAIN_BLKIO_WEIGHT);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
param->value.ui = persistentDef->blkio.weight;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1: /* blkiotune.device_weight */
|
|
||||||
if (persistentDef->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < persistentDef->blkio.ndevices; j++) {
|
|
||||||
if (!persistentDef->blkio.devices[j].weight)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%u",
|
|
||||||
persistentDef->blkio.devices[j].path,
|
|
||||||
persistentDef->blkio.devices[j].weight);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (!param->value.s && VIR_STRDUP(param->value.s, "") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->type = VIR_TYPED_PARAM_STRING;
|
|
||||||
if (virStrcpyStatic(param->field,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WEIGHT) == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Field name '%s' too long"),
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WEIGHT);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2: /* blkiotune.device_read_iops */
|
|
||||||
if (persistentDef->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < persistentDef->blkio.ndevices; j++) {
|
|
||||||
if (!persistentDef->blkio.devices[j].riops)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%u",
|
|
||||||
persistentDef->blkio.devices[j].path,
|
|
||||||
persistentDef->blkio.devices[j].riops);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (!param->value.s && VIR_STRDUP(param->value.s, "") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->type = VIR_TYPED_PARAM_STRING;
|
|
||||||
if (virStrcpyStatic(param->field,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS) == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Field name '%s' too long"),
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3: /* blkiotune.device_write_iops */
|
|
||||||
if (persistentDef->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < persistentDef->blkio.ndevices; j++) {
|
|
||||||
if (!persistentDef->blkio.devices[j].wiops)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%u",
|
|
||||||
persistentDef->blkio.devices[j].path,
|
|
||||||
persistentDef->blkio.devices[j].wiops);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (!param->value.s && VIR_STRDUP(param->value.s, "") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->type = VIR_TYPED_PARAM_STRING;
|
|
||||||
if (virStrcpyStatic(param->field,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS) == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Field name '%s' too long"),
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4: /* blkiotune.device_read_bps */
|
|
||||||
if (persistentDef->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < persistentDef->blkio.ndevices; j++) {
|
|
||||||
if (!persistentDef->blkio.devices[j].rbps)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%llu",
|
|
||||||
persistentDef->blkio.devices[j].path,
|
|
||||||
persistentDef->blkio.devices[j].rbps);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (!param->value.s && VIR_STRDUP(param->value.s, "") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->type = VIR_TYPED_PARAM_STRING;
|
|
||||||
if (virStrcpyStatic(param->field,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_READ_BPS) == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Field name '%s' too long"),
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_READ_BPS);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5: /* blkiotune.device_write_bps */
|
|
||||||
if (persistentDef->blkio.ndevices > 0) {
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
bool comma = false;
|
|
||||||
|
|
||||||
for (j = 0; j < persistentDef->blkio.ndevices; j++) {
|
|
||||||
if (!persistentDef->blkio.devices[j].wbps)
|
|
||||||
continue;
|
|
||||||
if (comma)
|
|
||||||
virBufferAddChar(&buf, ',');
|
|
||||||
else
|
|
||||||
comma = true;
|
|
||||||
virBufferAsprintf(&buf, "%s,%llu",
|
|
||||||
persistentDef->blkio.devices[j].path,
|
|
||||||
persistentDef->blkio.devices[j].wbps);
|
|
||||||
}
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->value.s = virBufferContentAndReset(&buf);
|
|
||||||
}
|
|
||||||
if (!param->value.s && VIR_STRDUP(param->value.s, "") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
param->type = VIR_TYPED_PARAM_STRING;
|
|
||||||
if (virStrcpyStatic(param->field,
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS) == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Field name '%s' too long"),
|
|
||||||
VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
/* coverity[dead_error_begin] */
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
/* should not hit here */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QEMU_NB_BLKIO_PARAM < *nparams)
|
|
||||||
*nparams = QEMU_NB_BLKIO_PARAM;
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
Loading…
Reference in New Issue
Block a user