[PATCH] qemu: forbid updating any attributes of an interface <backend> with update-device

Laine Stump laine at redhat.com
Mon Feb 20 23:35:04 UTC 2023


Ping

On 2/15/23 4:06 PM, Laine Stump wrote:
> Changing any of the attributes of an <interface>'s <backend> would
> require removing and re-adding the interface for the new setting to
> take effect, so fail any update-device that changes anything in
> <backend>
> 
> Resolves: https://bugzilla.redhat.com/2169245
> Signed-off-by: Laine Stump <laine at redhat.com>
> ---
>   src/conf/domain_conf.c   | 14 ++++++++++++++
>   src/conf/domain_conf.h   |  2 ++
>   src/libvirt_private.syms |  1 +
>   src/qemu/qemu_hotplug.c  |  9 +++++++++
>   4 files changed, 26 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 3dfc5c87af..aa7bed7dc3 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -19853,6 +19853,20 @@ virDomainFsDefCheckABIStability(virDomainFSDef *src,
>   }
>   
>   
> +bool
> +virDomainNetBackendIsEqual(virDomainNetBackend *src,
> +                           virDomainNetBackend *dst)
> +{
> +    if (src->type != dst->type ||
> +        STRNEQ_NULLABLE(src->tap, dst->tap) ||
> +        STRNEQ_NULLABLE(src->vhost, dst->vhost) ||
> +        STRNEQ_NULLABLE(src->logFile, dst->logFile)) {
> +        return false;
> +    }
> +    return true;
> +}
> +
> +
>   static bool
>   virDomainNetDefCheckABIStability(virDomainNetDef *src,
>                                    virDomainNetDef *dst)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 7d58efb011..bd8ce562d9 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -3862,6 +3862,8 @@ virDomainNetDef *virDomainNetFindByName(virDomainDef *def, const char *ifname);
>   bool virDomainHasNet(virDomainDef *def, virDomainNetDef *net);
>   int virDomainNetInsert(virDomainDef *def, virDomainNetDef *net);
>   int virDomainNetUpdate(virDomainDef *def, size_t netidx, virDomainNetDef *newnet);
> +bool virDomainNetBackendIsEqual(virDomainNetBackend *src,
> +                                virDomainNetBackend *dst);
>   int virDomainNetDHCPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces);
>   int virDomainNetARPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces);
>   virDomainNetDef *virDomainNetRemove(virDomainDef *def, size_t i);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 97c3d86217..c6c47dbfac 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -528,6 +528,7 @@ virDomainMouseModeTypeToString;
>   virDomainNetAllocateActualDevice;
>   virDomainNetAppendIPAddress;
>   virDomainNetARPInterfaces;
> +virDomainNetBackendIsEqual;
>   virDomainNetBandwidthUpdate;
>   virDomainNetDefActualFromNetworkPort;
>   virDomainNetDefActualToNetworkPort;
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index c490e2b97a..b4cddef9f5 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -3675,6 +3675,15 @@ qemuDomainChangeNet(virQEMUDriver *driver,
>           goto cleanup;
>       }
>   
> +    /* nothing in <backend> can be modified in an existing interface -
> +     * the entire device will need to be removed and re-added.
> +     */
> +    if (!virDomainNetBackendIsEqual(&olddev->backend, &newdev->backend)) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("cannot modify network device backend settings"));
> +        goto cleanup;
> +    }
> +
>       /* allocate new actual device to compare to old - we will need to
>        * free it if we fail for any reason
>        */



More information about the libvir-list mailing list