From nobody Mon Feb 9 00:27:06 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1607436649; cv=none; d=zohomail.com; s=zohoarc; b=Oah6LhT40TorfVBAiKOSqmxbDPGvJ1buFI+/EKwJfiu3/RzPbaFXiQTYItvLXvpcBTJq3jlGKYb/hiTC8h89krJ6nR8fXhlYm+NrckALHCnv/98Nf1HyQP5AxIK+7+XoGCgHnIuYjMgFDfMkBJZywLNES77TRsOIah+i+k+GYhA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1607436649; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=FSmuPxlvs8Hdis++bFR576qXM+seh26f7yMaWcEGrc8=; b=L5U6VBRJ9lXWFEf4KIc1L7nYQ+tXUdY+TAm3CGp4lW4+NCCdQFAA2VTknwV+8/e3bVJTX5M+NpRR5gDbyTpVq/0mqgJN59jkGFpXjkaRripv6ZdO+h9XV3flzzsrBfIzllxRixfp22zPCLGI8dEXcA818/DZTpZia9ZkzGA8DAY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 1607436649042939.6139325716224; Tue, 8 Dec 2020 06:10:49 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-282-ud7QIkWNOgStDvnJc_6wOA-1; Tue, 08 Dec 2020 09:02:19 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0772D192FDA2; Tue, 8 Dec 2020 14:02:10 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CF31F5C1BB; Tue, 8 Dec 2020 14:02:09 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 953E24E58F; Tue, 8 Dec 2020 14:02:09 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 0B8E2111020959 for ; Tue, 8 Dec 2020 09:02:01 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0F5D31042A49; Tue, 8 Dec 2020 14:02:01 +0000 (UTC) Received: from speedmetal.lan (unknown [10.40.208.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id 084531042A4C for ; Tue, 8 Dec 2020 14:01:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1607436141; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=FSmuPxlvs8Hdis++bFR576qXM+seh26f7yMaWcEGrc8=; b=KjtBeQHlqZ4THwrTYVE6ZZDPt9pKhi50M8r28gni/T54kLzCN+jdNh65qctD+BeDUNE6K8 7UPaoUPPuCuHG539rwSq4M3ZaR/tVvjZwY4UIAryF4Xf+X9F2hoyruJcc4RIGpq5agIEal kjUuZFN+icqCR8pqZ2IsfzmDMDotF7c= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1607436644; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=FSmuPxlvs8Hdis++bFR576qXM+seh26f7yMaWcEGrc8=; b=WqAfLKEPuLaaAeVsgaK47THB3z0GToFhqGif38W8mmUPTWDHz119pQS/8K01V74ZABg+di i3toWurOpUD8W8iLvbKdVmgKZNR/1ppT+73QogFElfkPPlW4E1i/ROQAp5g9xOsBqQ1P80 lj7oFnQ8XUqqo137aM92cArKKQ+DiIA= X-MC-Unique: ud7QIkWNOgStDvnJc_6wOA-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 1/4] virDomainDefValidate: Add per-run 'opaque' data Date: Tue, 8 Dec 2020 15:01:43 +0100 Message-Id: <9ff0fe1cb137ffed8c203aa8ae0c52a47c7aa0c6.1607435748.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) (identity @redhat.com) Content-Type: text/plain; charset="utf-8" virDomainDefPostParse infrastructure has apart from the global opaque data also per-run data, but this was not duplicated into the validation callbacks. This is important when drivers want to use correct run-state for the validation. Signed-off-by: Peter Krempa --- src/bhyve/bhyve_domain.c | 3 ++- src/conf/domain_conf.c | 21 +++++++++++++-------- src/conf/domain_conf.h | 9 ++++++--- src/qemu/qemu_process.c | 2 +- src/qemu/qemu_validate.c | 6 ++++-- src/qemu/qemu_validate.h | 7 +++++-- src/vz/vz_driver.c | 6 ++++-- 7 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 6935609b96..f0e553113f 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -199,7 +199,8 @@ virBhyveDriverCreateXMLConf(bhyveConnPtr driver) static int bhyveDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def G_GNUC_UNUSED, - void *opaque G_GNUC_UNUSED) + void *opaque G_GNUC_UNUSED, + void *parseOpaque G_GNUC_UNUSED) { if (dev->type =3D=3D VIR_DOMAIN_DEVICE_CONTROLLER && dev->data.controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_ISA && diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 66ee658e7b..fa19563a35 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6974,14 +6974,15 @@ static int virDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, unsigned int parseFlags, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { /* validate configuration only in certain places */ if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE) return 0; if (xmlopt->config.deviceValidateCallback && - xmlopt->config.deviceValidateCallback(dev, def, xmlopt->config.pri= v)) + xmlopt->config.deviceValidateCallback(dev, def, xmlopt->config.pri= v, parseOpaque)) return -1; if (virDomainDeviceDefValidateInternal(dev, def) < 0) @@ -6999,7 +7000,8 @@ virDomainDefValidateDeviceIterator(virDomainDefPtr de= f, { struct virDomainDefPostParseDeviceIteratorData *data =3D opaque; return virDomainDeviceDefValidate(dev, def, - data->parseFlags, data->xmlopt); + data->parseFlags, data->xmlopt, + data->parseOpaque); } @@ -7357,6 +7359,7 @@ virDomainDefValidateInternal(const virDomainDef *def, * @caps: driver capabilities object * @parseFlags: virDomainDefParseFlags * @xmlopt: XML parser option object + * @parseOpaque: hypervisor driver specific data for this validation run * * This validation function is designed to take checks of globally invalid * configurations that the parser needs to accept so that VMs don't vanish= upon @@ -7369,11 +7372,13 @@ virDomainDefValidateInternal(const virDomainDef *de= f, int virDomainDefValidate(virDomainDefPtr def, unsigned int parseFlags, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { struct virDomainDefPostParseDeviceIteratorData data =3D { .xmlopt =3D xmlopt, .parseFlags =3D parseFlags, + .parseOpaque =3D parseOpaque, }; /* validate configuration only in certain places */ @@ -7382,7 +7387,7 @@ virDomainDefValidate(virDomainDefPtr def, /* call the domain config callback */ if (xmlopt->config.domainValidateCallback && - xmlopt->config.domainValidateCallback(def, xmlopt->config.priv) < = 0) + xmlopt->config.domainValidateCallback(def, xmlopt->config.priv, pa= rseOpaque) < 0) return -1; /* iterate the devices */ @@ -17220,7 +17225,7 @@ virDomainDeviceDefParse(const char *xmlStr, return NULL; /* validate the configuration */ - if (virDomainDeviceDefValidate(dev, def, flags, xmlopt) < 0) + if (virDomainDeviceDefValidate(dev, def, flags, xmlopt, parseOpaque) <= 0) return NULL; return g_steal_pointer(&dev); @@ -22617,7 +22622,7 @@ virDomainObjParseXML(xmlDocPtr xml, goto error; /* validate configuration */ - if (virDomainDefValidate(obj->def, flags, xmlopt) < 0) + if (virDomainDefValidate(obj->def, flags, xmlopt, parseOpaque) < 0) goto error; return obj; @@ -22701,7 +22706,7 @@ virDomainDefParseNode(xmlDocPtr xml, return NULL; /* validate configuration */ - if (virDomainDefValidate(def, flags, xmlopt) < 0) + if (virDomainDefValidate(def, flags, xmlopt, parseOpaque) < 0) return NULL; return g_steal_pointer(&def); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cdf08de60a..72771c46b9 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2867,13 +2867,15 @@ typedef void (*virDomainDefPostParseDataFree)(void = *parseOpaque); * for configurations that were previously accepted. This shall not modify= the * config. */ typedef int (*virDomainDefValidateCallback)(const virDomainDef *def, - void *opaque); + void *opaque, + void *parseOpaque); /* Called once per device, for adjusting per-device settings while * leaving the overall domain otherwise unchanged. */ typedef int (*virDomainDeviceDefValidateCallback)(const virDomainDeviceDef= *dev, const virDomainDef *def, - void *opaque); + void *opaque, + void *parseOpaque); struct _virDomainDefParserConfig { /* driver domain definition callbacks */ @@ -2993,7 +2995,8 @@ bool virDomainDeviceAliasIsUserAlias(const char *alia= sStr); int virDomainDefValidate(virDomainDefPtr def, unsigned int parseFlags, - virDomainXMLOptionPtr xmlopt); + virDomainXMLOptionPtr xmlopt, + void *parseOpaque); int virDomainActualNetDefValidate(const virDomainNetDef *net); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index e0b42ee2c9..474cb93bad 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5464,7 +5464,7 @@ qemuProcessStartValidate(virQEMUDriverPtr driver, * VM that was running before (migration, snapshots, save). It's more * important to start such VM than keep the configuration clean */ if ((flags & VIR_QEMU_PROCESS_START_NEW) && - virDomainDefValidate(vm->def, 0, driver->xmlopt) < 0) + virDomainDefValidate(vm->def, 0, driver->xmlopt, qemuCaps) < 0) return -1; if (qemuProcessStartValidateGraphics(vm) < 0) diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 52d15defed..62d7243e21 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1066,7 +1066,8 @@ qemuValidateDomainDefPanic(const virDomainDef *def, int qemuValidateDomainDef(const virDomainDef *def, - void *opaque) + void *opaque, + void *parseOpaque G_GNUC_UNUSED) { virQEMUDriverPtr driver =3D opaque; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); @@ -4670,7 +4671,8 @@ qemuValidateDomainDeviceDefShmem(virDomainShmemDefPtr= shmem, int qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev, const virDomainDef *def, - void *opaque) + void *opaque, + void *parseOpaque G_GNUC_UNUSED) { int ret =3D 0; virQEMUDriverPtr driver =3D opaque; diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index acf7d26ce0..b6c5441f90 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -26,10 +26,13 @@ #include "qemu_capabilities.h" #include "qemu_conf.h" -int qemuValidateDomainDef(const virDomainDef *def, void *opaque); +int qemuValidateDomainDef(const virDomainDef *def, + void *opaque, + void *parseOpaque); int qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk, const virDomainDef *def, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev, const virDomainDef *def, - void *opaque); + void *opaque, + void *parseOpaque); diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 8d47b90bdb..b60e99d4f5 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -259,7 +259,8 @@ vzDomainDefPostParse(virDomainDefPtr def, static int vzDomainDefValidate(const virDomainDef *def, - void *opaque) + void *opaque, + void *parseOpaque G_GNUC_UNUSED) { if (vzCheckUnsupportedControllers(def, opaque) < 0) return -1; @@ -295,7 +296,8 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, static int vzDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, - void *opaque) + void *opaque, + void *parseOpaque G_GNUC_UNUSED) { vzDriverPtr driver =3D opaque; --=20 2.28.0