From nobody Sun Feb 8 18:19:07 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.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 170.10.129.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=1692170162; cv=none; d=zohomail.com; s=zohoarc; b=SYHzMQQCtKyXPNCbBznch7uV4KS8mlrMjFLlYVJO9/9oXUlIKTRiay3vvfjqerrRdkZ7DQArsut7wU7r1xLyU1uyNYbWHn7ooutgbr0NHNDozlfopSHmtV2Ogzmrf0GaTMVbqYDd/GL4FtcOPfrDb8AvH/7d3thBirfTYrEbEEQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1692170162; 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=oWK7BruuBhwVc5M/yCGP285ksN8EAtmY0EKq+Pe+g84=; b=HgYWM/5mXeqQHB9itNPQKCU2S31U5oA0jBmeaJrwSxVbYHp8Y6g9grxmr38/2fGYsM0y/+Rh7Y+5MaP02uctrk3jJqpQa3IbZEBZyWZsXOJEBQTnqyKbuQha8fI9QQm7lWmBkdwaKNTN7gJkBk8JJy5MrO5HfVZI5hsrzMj9VQQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1692170162954273.7082036666951; Wed, 16 Aug 2023 00:16:02 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-640-XHyiM5XJNxSn3fDTe51Ylg-1; Wed, 16 Aug 2023 03:15:45 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 841E9865827; Wed, 16 Aug 2023 07:15:42 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4241540D2842; Wed, 16 Aug 2023 07:15:41 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id BB4D719465B2; Wed, 16 Aug 2023 07:15:39 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 884981946589 for ; Wed, 16 Aug 2023 07:15:25 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id C79302026D2A; Wed, 16 Aug 2023 07:15:25 +0000 (UTC) Received: from localhost.localdomain (unknown [10.43.2.36]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6EEE32026D4B for ; Wed, 16 Aug 2023 07:15:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1692170161; 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=oWK7BruuBhwVc5M/yCGP285ksN8EAtmY0EKq+Pe+g84=; b=a37G7+AD6ovj4juHpX7B7rNqe4mZ9mWI8Xx06oS71ICPLpgKCPyEqX7TK6G//KFxlK59JF 57wb7FWe980BkCBHq8KKs9nrZ4GmQetVr6jPl+++JmYouHtcHbzCIHXDcGmjF1nIt2RahC xqk24Uei+UcnXvd8koHcitcoj1QDSBA= X-MC-Unique: XHyiM5XJNxSn3fDTe51Ylg-1 X-Original-To: libvir-list@listman.corp.redhat.com From: Michal Privoznik To: libvir-list@redhat.com Subject: [PATCH 2/2] qemu: Move channelTargetDir into stateDir Date: Wed, 16 Aug 2023 09:15:22 +0200 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1692170163505100001 Content-Type: text/plain; charset="utf-8"; x-default="true" For historical reasons (i.e. unknown reason) we put channel sockets into a path derived from cfg->libDir which is a path that survives host reboots (e.g. /var/lib/libvirt/...). This is not necessary and in fact for session daemon creates a longer prefix: XDG_CONFIG_HOME -> /home/user/.config XDG_RUNTIME_DIR -> /run/user/1000 Worse, if host is rebooted suddenly (e.g. due to power loss) then we leave files behind and nobody will ever remove them. Therefore, place the channel target dir into state dir. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D2173980 Signed-off-by: Michal Privoznik --- libvirt.spec.in | 1 - src/qemu/qemu_conf.c | 9 ++-- src/qemu/qemu_domain.c | 52 +++++++++++++++++-- .../qemuhotplug-qemu-agent-detach.xml | 2 +- ...emuhotplug-base-live+qemu-agent-detach.xml | 2 +- .../qemuhotplug-base-live+qemu-agent.xml | 2 +- .../channel-unix-source-path.xml | 4 ++ .../channel-unix-source-path-active.xml | 5 ++ .../channel-unix-source-path-inactive.xml | 4 ++ tests/testutilsqemu.c | 2 +- 10 files changed, 67 insertions(+), 16 deletions(-) diff --git a/libvirt.spec.in b/libvirt.spec.in index 3b179d1fd9..7157cfe3b4 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -2135,7 +2135,6 @@ exit 0 %ghost %dir %{_rundir}/libvirt/qemu/slirp/ %ghost %dir %{_rundir}/libvirt/qemu/swtpm/ %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvir= t/qemu/ -%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvir= t/qemu/channel/ %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvir= t/qemu/checkpoint/ %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvir= t/qemu/dump/ %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvir= t/qemu/nvram/ diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 532fe36be3..3f811d064f 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -143,6 +143,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->configBaseDir =3D g_strdup_printf("%s/etc", root); cfg->stateDir =3D g_strdup_printf("%s/run/qemu", root); cfg->swtpmStateDir =3D g_strdup_printf("%s/run/swtpm", root); + cfg->channelTargetDir =3D g_strdup_printf("%s/channel", cfg->state= Dir); cfg->cacheDir =3D g_strdup_printf("%s/cache/qemu", root); cfg->libDir =3D g_strdup_printf("%s/lib/qemu", root); cfg->swtpmStorageDir =3D g_strdup_printf("%s/lib/swtpm", root); @@ -151,7 +152,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->snapshotDir =3D g_strdup_printf("%s/snapshot", cfg->libDir); cfg->checkpointDir =3D g_strdup_printf("%s/checkpoint", cfg->libDi= r); cfg->autoDumpPath =3D g_strdup_printf("%s/dump", cfg->libDir); - cfg->channelTargetDir =3D g_strdup_printf("%s/channel", cfg->libDi= r); cfg->nvramDir =3D g_strdup_printf("%s/nvram", cfg->libDir); cfg->memoryBackingDir =3D g_strdup_printf("%s/ram", cfg->libDir); } else if (privileged) { @@ -163,8 +163,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->configBaseDir =3D g_strdup(SYSCONFDIR "/libvirt"); =20 cfg->stateDir =3D g_strdup_printf("%s/libvirt/qemu", RUNSTATEDIR); - cfg->swtpmStateDir =3D g_strdup_printf("%s/libvirt/qemu/swtpm", RU= NSTATEDIR); + cfg->channelTargetDir =3D g_strdup_printf("%s/channel", cfg->state= Dir); =20 cfg->cacheDir =3D g_strdup_printf("%s/cache/libvirt/qemu", LOCALST= ATEDIR); =20 @@ -173,7 +173,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->snapshotDir =3D g_strdup_printf("%s/snapshot", cfg->libDir); cfg->checkpointDir =3D g_strdup_printf("%s/checkpoint", cfg->libDi= r); cfg->autoDumpPath =3D g_strdup_printf("%s/dump", cfg->libDir); - cfg->channelTargetDir =3D g_strdup_printf("%s/channel", cfg->libDi= r); cfg->nvramDir =3D g_strdup_printf("%s/nvram", cfg->libDir); cfg->memoryBackingDir =3D g_strdup_printf("%s/ram", cfg->libDir); cfg->swtpmStorageDir =3D g_strdup_printf("%s/lib/libvirt/swtpm", @@ -190,8 +189,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, =20 rundir =3D virGetUserRuntimeDirectory(); cfg->stateDir =3D g_strdup_printf("%s/qemu/run", rundir); - cfg->swtpmStateDir =3D g_strdup_printf("%s/swtpm", cfg->stateDir); + cfg->channelTargetDir =3D g_strdup_printf("%s/channel", cfg->state= Dir); =20 cfg->configBaseDir =3D virGetUserConfigDirectory(); =20 @@ -201,8 +200,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->checkpointDir =3D g_strdup_printf("%s/qemu/checkpoint", cfg->configBaseDir); cfg->autoDumpPath =3D g_strdup_printf("%s/qemu/dump", cfg->configB= aseDir); - cfg->channelTargetDir =3D g_strdup_printf("%s/qemu/channel", - cfg->configBaseDir); cfg->nvramDir =3D g_strdup_printf("%s/qemu/nvram", cfg->configBase= Dir); cfg->memoryBackingDir =3D g_strdup_printf("%s/qemu/ram", cfg->conf= igBaseDir); cfg->swtpmStorageDir =3D g_strdup_printf("%s/qemu/swtpm", diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 224350dabc..d46516856e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5401,6 +5401,28 @@ qemuDomainDefaultNetModel(const virDomainDef *def, } =20 =20 + +static bool +qemuDomainChrMatchDefaultPath(const char *prefix, + const char *infix, + const char *target, + const char *path) +{ + g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + g_autofree char *regexp =3D NULL; + + virBufferEscapeRegex(&buf, "^%s", prefix); + if (infix) + virBufferEscapeRegex(&buf, "%s", infix); + virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[= ^/]+/)"); + virBufferEscapeRegex(&buf, "%s$", target); + + regexp =3D virBufferContentAndReset(&buf); + + return virStringMatch(path, regexp); +} + + /* * Clear auto generated unix socket paths: * @@ -5421,6 +5443,9 @@ qemuDomainDefaultNetModel(const virDomainDef *def, * * This function clears the path for migration as well, so we need to clear * the path even if we are not storing it in the XML. + * + * Please note, as of libvirt 9.7.0 the channelTargetDir is no longer deri= ved + * from cfg->libDir but rather cfg->stateDir. */ static void qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr, @@ -5439,14 +5464,31 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *ch= r, =20 cfg =3D virQEMUDriverGetConfig(driver); =20 - virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir); - virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[= ^/]+/)"); - virBufferEscapeRegex(&buf, "%s$", chr->target.name); + if (qemuDomainChrMatchDefaultPath(cfg->channelTargetDir, + NULL, + chr->target.name, + chr->source->data.nix.path)) { + VIR_FREE(chr->source->data.nix.path); + return; + } =20 - regexp =3D virBufferContentAndReset(&buf); + /* Previously, channelTargetDir was derived from cfg->libdir, or + * cfg->configBaseDir even. Try them too. */ + if (qemuDomainChrMatchDefaultPath(cfg->libDir, + "/channel", + chr->target.name, + chr->source->data.nix.path)) { + VIR_FREE(chr->source->data.nix.path); + return; + } =20 - if (virStringMatch(chr->source->data.nix.path, regexp)) + if (qemuDomainChrMatchDefaultPath(cfg->configBaseDir, + "/qemu/channel", + chr->target.name, + chr->source->data.nix.path)) { VIR_FREE(chr->source->data.nix.path); + return; + } } =20 =20 diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml= b/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml index 7871de59c4..dd4feae855 100644 --- a/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml +++ b/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml @@ -1,5 +1,5 @@ - +
diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-= detach.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-= detach.xml index bf2afb67d9..cfa7509485 100644 --- a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.= xml +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.= xml @@ -39,7 +39,7 @@
- +
diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.= xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml index 00191a9cb8..eb543dbaf4 100644 --- a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml @@ -42,7 +42,7 @@
- +
diff --git a/tests/qemuxml2argvdata/channel-unix-source-path.xml b/tests/qe= muxml2argvdata/channel-unix-source-path.xml index db0e99c3d1..df548d88e7 100644 --- a/tests/qemuxml2argvdata/channel-unix-source-path.xml +++ b/tests/qemuxml2argvdata/channel-unix-source-path.xml @@ -28,6 +28,10 @@ + + + + diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml b= /tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml index 68835ceb15..ec927d37c6 100644 --- a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml +++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml @@ -46,6 +46,11 @@
+ + + +
+