*dst = *src;
dst->group_name = g_strdup(src->group_name);
}
+
+
+bool
+virDomainBlockIoTuneInfoEqual(const virDomainBlockIoTuneInfo *a,
+ const virDomainBlockIoTuneInfo *b)
+{
+ return a->total_bytes_sec == b->total_bytes_sec &&
+ a->read_bytes_sec == b->read_bytes_sec &&
+ a->write_bytes_sec == b->write_bytes_sec &&
+ a->total_iops_sec == b->total_iops_sec &&
+ a->read_iops_sec == b->read_iops_sec &&
+ a->write_iops_sec == b->write_iops_sec &&
+ a->total_bytes_sec_max == b->total_bytes_sec_max &&
+ a->read_bytes_sec_max == b->read_bytes_sec_max &&
+ a->write_bytes_sec_max == b->write_bytes_sec_max &&
+ a->total_iops_sec_max == b->total_iops_sec_max &&
+ a->read_iops_sec_max == b->read_iops_sec_max &&
+ a->write_iops_sec_max == b->write_iops_sec_max &&
+ a->size_iops_sec == b->size_iops_sec &&
+ a->total_bytes_sec_max_length == b->total_bytes_sec_max_length &&
+ a->read_bytes_sec_max_length == b->read_bytes_sec_max_length &&
+ a->write_bytes_sec_max_length == b->write_bytes_sec_max_length &&
+ a->total_iops_sec_max_length == b->total_iops_sec_max_length &&
+ a->read_iops_sec_max_length == b->read_iops_sec_max_length &&
+ a->write_iops_sec_max_length == b->write_iops_sec_max_length;
+}
*/
static int
qemuCheckDiskConfigBlkdeviotune(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
/* group_name by itself is ignored by qemu */
return -1;
}
+ /* checking def here is only for calling from tests */
+ if (disk->blkdeviotune.group_name) {
+ size_t i;
+
+ for (i = 0; i < def->ndisks; i++) {
+ virDomainDiskDefPtr d = def->disks[i];
+
+ if (STREQ(d->dst, disk->dst) ||
+ STRNEQ_NULLABLE(d->blkdeviotune.group_name,
+ disk->blkdeviotune.group_name))
+ continue;
+
+ if (!virDomainBlockIoTuneInfoEqual(&d->blkdeviotune,
+ &disk->blkdeviotune)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("different iotunes for disks %s and %s"),
+ disk->dst, d->dst);
+ return -1;
+ }
+ }
+ }
+
if (disk->blkdeviotune.total_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
disk->blkdeviotune.read_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
disk->blkdeviotune.write_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
*/
int
qemuCheckDiskConfig(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
- if (qemuCheckDiskConfigBlkdeviotune(disk, qemuCaps) < 0)
+ if (qemuCheckDiskConfigBlkdeviotune(disk, def, qemuCaps) < 0)
return -1;
if (disk->wwn) {
static char *
qemuBuildDriveStr(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
g_auto(virBuffer) opt = VIR_BUFFER_INITIALIZER;
}
/* if we are using -device this will be checked elsewhere */
- if (qemuCheckDiskConfig(disk, qemuCaps) < 0)
+ if (qemuCheckDiskConfig(disk, def, qemuCaps) < 0)
return NULL;
virBufferAsprintf(&opt, "if=%s",
g_autofree char *scsiVPDDeviceId = NULL;
int controllerModel;
- if (qemuCheckDiskConfig(disk, qemuCaps) < 0)
+ if (qemuCheckDiskConfig(disk, def, qemuCaps) < 0)
return NULL;
if (!qemuDomainCheckCCWS390AddressSupport(def, &disk->info, qemuCaps, disk->dst))
static int
qemuBuildDiskSourceCommandLine(virCommandPtr cmd,
virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
g_autoptr(qemuBlockStorageSourceChainData) data = NULL;
!(copyOnReadProps = qemuBlockStorageGetCopyOnReadProps(disk)))
return -1;
} else {
- if (!(data = qemuBuildStorageSourceChainAttachPrepareDrive(disk, qemuCaps)))
+ if (!(data = qemuBuildStorageSourceChainAttachPrepareDrive(disk, def, qemuCaps)))
return -1;
}
{
g_autofree char *optstr = NULL;
- if (qemuBuildDiskSourceCommandLine(cmd, disk, qemuCaps) < 0)
+ if (qemuBuildDiskSourceCommandLine(cmd, disk, def, qemuCaps) < 0)
return -1;
if (!qemuDiskBusNeedsDriveArg(disk->bus)) {
*/
qemuBlockStorageSourceAttachDataPtr
qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
g_autoptr(qemuBlockStorageSourceAttachData) data = NULL;
if (VIR_ALLOC(data) < 0)
return NULL;
- if (!(data->driveCmd = qemuBuildDriveStr(disk, qemuCaps)) ||
+ if (!(data->driveCmd = qemuBuildDriveStr(disk, def, qemuCaps)) ||
!(data->driveAlias = qemuAliasDiskDriveFromDisk(disk)))
return NULL;
*/
qemuBlockStorageSourceChainDataPtr
qemuBuildStorageSourceChainAttachPrepareDrive(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
g_autoptr(qemuBlockStorageSourceAttachData) elem = NULL;
if (VIR_ALLOC(data) < 0)
return NULL;
- if (!(elem = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps)))
+ if (!(elem = qemuBuildStorageSourceAttachPrepareDrive(disk, def, qemuCaps)))
return NULL;
if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, elem, qemuCaps) < 0)
qemuBlockStorageSourceAttachDataPtr
qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps);
int
qemuBuildStorageSourceAttachPrepareCommon(virStorageSourcePtr src,
qemuBlockStorageSourceChainDataPtr
qemuBuildStorageSourceChainAttachPrepareDrive(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps);
qemuDiskConfigBlkdeviotuneEnabled(virDomainDiskDefPtr disk);
int qemuCheckDiskConfig(virDomainDiskDefPtr disk,
+ const virDomainDef *def,
virQEMUCapsPtr qemuCaps);
bool
testQemuDiskXMLToProps(const void *opaque)
{
struct testQemuDiskXMLToJSONData *data = (void *) opaque;
+ g_autoptr(virDomainDef) vmdef = NULL;
virDomainDiskDefPtr disk = NULL;
virStorageSourcePtr n;
virJSONValuePtr formatProps = NULL;
VIR_DOMAIN_DEF_PARSE_STATUS)))
goto cleanup;
- if (qemuCheckDiskConfig(disk, data->qemuCaps) < 0 ||
+ if (!(vmdef = virDomainDefNew()) ||
+ virDomainDiskInsert(vmdef, disk) < 0)
+ goto cleanup;
+
+ if (qemuCheckDiskConfig(disk, vmdef, data->qemuCaps) < 0 ||
qemuDomainDeviceDefValidateDisk(disk, data->qemuCaps) < 0) {
VIR_TEST_VERBOSE("invalid configuration for disk");
goto cleanup;
cleanup:
virJSONValueFree(formatProps);
virJSONValueFree(storageProps);
- virDomainDiskDefFree(disk);
VIR_FREE(xmlpath);
VIR_FREE(xmlstr);
return ret;