- qemu: Generate shorter channel target paths
- qemu: Move channelTargetDir into stateDir - qemu_domain: Drop unused variables from qemuDomainChrDefDropDefaultPath()
This commit is contained in:
		
							parent
							
								
									c10bd8cbd9
								
							
						
					
					
						commit
						0a1fe0c265
					
				
							
								
								
									
										232
									
								
								SOURCES/qemu-generate-shorter-channel-target-paths.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								SOURCES/qemu-generate-shorter-channel-target-paths.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,232 @@ | ||||
| From d3759d3674ab9453e5fb5a27ab6c28b8ff8d5569 Mon Sep 17 00:00:00 2001 | ||||
| From: Michal Privoznik <mprivozn@redhat.com> | ||||
| Date: Tue, 18 Apr 2023 17:34:12 +0200 | ||||
| Subject: [PATCH] qemu: Generate shorter channel target paths | ||||
| 
 | ||||
| A <channel/> device is basically an UNIX socket into guest. | ||||
| Whatever is sent from the host, appears in the guest and vice | ||||
| versa. But because of that, the length of the path to the socket | ||||
| is important (underscored by fact that we derive the path from | ||||
| domain short name). But there are still cases where we might not | ||||
| fit into UNIX_PATH_MAX limit (usually 108 characters), because | ||||
| the path is derived also from other variables, e.g. | ||||
| XDG_CONFIG_HOME for session domains. | ||||
| 
 | ||||
| There are two components though, that are needless: "/target/" | ||||
| and "domain-" prefix. Drop them. This is safe to do, because | ||||
| running domains have their path saved in status XML and even | ||||
| though paths are dropped on migration, they are not part of guest | ||||
| ABI and thus we are free to change them. | ||||
| 
 | ||||
| Signed-off-by: Michal Privoznik <mprivozn@redhat.com> | ||||
| Reviewed-by: Pavel Hrdina <phrdina@redhat.com> | ||||
| ---
 | ||||
|  libvirt.spec.in                                   |  1 - | ||||
|  src/qemu/qemu_conf.c                              |  6 +++--- | ||||
|  src/qemu/qemu_domain.c                            | 15 +++++++++------ | ||||
|  .../qemuhotplug-qemu-agent-detach.xml             |  2 +- | ||||
|  .../qemuhotplug-base+qemu-agent-detach.xml        |  2 +- | ||||
|  .../qemuhotplug-base+qemu-agent.xml               |  2 +- | ||||
|  .../qemuhotplug-base-live+qemu-agent-detach.xml   |  2 +- | ||||
|  .../qemuhotplug-base-live+qemu-agent.xml          |  2 +- | ||||
|  .../qemuxml2argvdata/channel-unix-source-path.xml |  4 ++++ | ||||
|  .../channel-unix-source-path-active.xml           |  5 +++++ | ||||
|  .../channel-unix-source-path-inactive.xml         |  4 ++++ | ||||
|  tests/testutilsqemu.c                             |  2 +- | ||||
|  12 files changed, 31 insertions(+), 16 deletions(-) | ||||
| 
 | ||||
| diff --git a/libvirt.spec.in b/libvirt.spec.in
 | ||||
| index 17d5f5ff4a0..3b179d1fd98 100644
 | ||||
| --- a/libvirt.spec.in
 | ||||
| +++ b/libvirt.spec.in
 | ||||
| @@ -2136,7 +2136,6 @@ exit 0
 | ||||
|  %ghost %dir %{_rundir}/libvirt/qemu/swtpm/ | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/ | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/ | ||||
| -%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/target/
 | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/ | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/ | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/ | ||||
| diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
 | ||||
| index bd984448a39..532fe36be36 100644
 | ||||
| --- a/src/qemu/qemu_conf.c
 | ||||
| +++ b/src/qemu/qemu_conf.c
 | ||||
| @@ -146,7 +146,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir); | ||||
|          cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir); | ||||
|          cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir); | ||||
| -        cfg->channelTargetDir = g_strdup_printf("%s/channel/target", cfg->libDir);
 | ||||
| +        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
 | ||||
|          cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir); | ||||
|          cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir); | ||||
|      } else if (privileged) { | ||||
| @@ -168,7 +168,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir); | ||||
|          cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir); | ||||
|          cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir); | ||||
| -        cfg->channelTargetDir = g_strdup_printf("%s/channel/target", cfg->libDir);
 | ||||
| +        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
 | ||||
|          cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir); | ||||
|          cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir); | ||||
|          cfg->swtpmStorageDir = g_strdup_printf("%s/lib/libvirt/swtpm", | ||||
| @@ -202,7 +202,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->checkpointDir = g_strdup_printf("%s/qemu/checkpoint", | ||||
|                                               cfg->configBaseDir); | ||||
|          cfg->autoDumpPath = g_strdup_printf("%s/qemu/dump", cfg->configBaseDir); | ||||
| -        cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel/target",
 | ||||
| +        cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel",
 | ||||
|                                                  cfg->configBaseDir); | ||||
|          cfg->nvramDir = g_strdup_printf("%s/qemu/nvram", cfg->configBaseDir); | ||||
|          cfg->memoryBackingDir = g_strdup_printf("%s/qemu/ram", cfg->configBaseDir); | ||||
| diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
 | ||||
| index 029238a9d73..224350dabc3 100644
 | ||||
| --- a/src/qemu/qemu_domain.c
 | ||||
| +++ b/src/qemu/qemu_domain.c
 | ||||
| @@ -1733,7 +1733,7 @@ qemuDomainSetPrivatePaths(virQEMUDriver *driver,
 | ||||
|          priv->libDir = g_strdup_printf("%s/domain-%s", cfg->libDir, domname); | ||||
|   | ||||
|      if (!priv->channelTargetDir) | ||||
| -        priv->channelTargetDir = g_strdup_printf("%s/domain-%s",
 | ||||
| +        priv->channelTargetDir = g_strdup_printf("%s/%s",
 | ||||
|                                                   cfg->channelTargetDir, domname); | ||||
|   | ||||
|      return 0; | ||||
| @@ -5157,13 +5157,16 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
 | ||||
|   * Clear auto generated unix socket paths: | ||||
|   * | ||||
|   * libvirt 1.2.18 and older: | ||||
| - *     {cfg->channelTargetDir}/{dom-name}.{target-name}
 | ||||
| + *     {cfg->channelTargetDir}/target/{dom-name}.{target-name}
 | ||||
|   * | ||||
|   * libvirt 1.2.19 - 1.3.2: | ||||
| - *     {cfg->channelTargetDir}/domain-{dom-name}/{target-name}
 | ||||
| + *     {cfg->channelTargetDir}/target/domain-{dom-name}/{target-name}
 | ||||
| + *
 | ||||
| + * libvirt 1.3.3 - 9.7.0:
 | ||||
| + *     {cfg->channelTargetDir}/target/domain-{dom-id}-{short-dom-name}/{target-name}
 | ||||
|   * | ||||
| - * libvirt 1.3.3 and newer:
 | ||||
| - *     {cfg->channelTargetDir}/domain-{dom-id}-{short-dom-name}/{target-name}
 | ||||
| + * libvirt 9.7.0 and newer:
 | ||||
| + *     {cfg->channelTargetDir}/{dom-id}-{short-dom-name}/{target-name}
 | ||||
|   * | ||||
|   * The unix socket path was stored in config XML until libvirt 1.3.0. | ||||
|   * If someone specifies the same path as we generate, they shouldn't do it. | ||||
| @@ -5189,7 +5192,7 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
 | ||||
|      cfg = virQEMUDriverGetConfig(driver); | ||||
|   | ||||
|      virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir); | ||||
| -    virBufferAddLit(&buf, "/([^/]+\\.)|(domain-[^/]+/)");
 | ||||
| +    virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
 | ||||
|      virBufferEscapeRegex(&buf, "%s$", chr->target.name); | ||||
|   | ||||
|      regexp = virBufferContentAndReset(&buf); | ||||
| diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml b/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml
 | ||||
| index 0c3c70a78e8..7871de59c40 100644
 | ||||
| --- a/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml
 | ||||
| +++ b/tests/qemuhotplugtestdevices/qemuhotplug-qemu-agent-detach.xml
 | ||||
| @@ -1,5 +1,5 @@
 | ||||
|      <channel type='unix'> | ||||
| -      <source mode='bind' path='/tmp/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
| +      <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.0'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='1'/> | ||||
|      </channel> | ||||
| diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml
 | ||||
| index 728af3391e3..bf2afb67d9c 100644
 | ||||
| --- a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml
 | ||||
| +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent-detach.xml
 | ||||
| @@ -39,7 +39,7 @@
 | ||||
|        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> | ||||
|      </controller> | ||||
|      <channel type='unix'> | ||||
| -      <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
| +      <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.0'/> | ||||
|        <alias name='channel0'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='1'/> | ||||
| diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml
 | ||||
| index 728af3391e3..31917cee92c 100644
 | ||||
| --- a/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml
 | ||||
| +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base+qemu-agent.xml
 | ||||
| @@ -39,7 +39,7 @@
 | ||||
|        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> | ||||
|      </controller> | ||||
|      <channel type='unix'> | ||||
| -      <source mode='bind' path='/tmp/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
| +      <source mode='bind' path='/var/lib/libvirt/qemu/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.0'/> | ||||
|        <alias name='channel0'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='1'/> | ||||
| diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent-detach.xml
 | ||||
| index 728af3391e3..bf2afb67d9c 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 @@
 | ||||
|        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> | ||||
|      </controller> | ||||
|      <channel type='unix'> | ||||
| -      <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
| +      <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.0'/> | ||||
|        <alias name='channel0'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='1'/> | ||||
| diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml
 | ||||
| index 0e4c3907bfb..00191a9cb8b 100644
 | ||||
| --- a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml
 | ||||
| +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+qemu-agent.xml
 | ||||
| @@ -39,7 +39,7 @@
 | ||||
|        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> | ||||
|      </controller> | ||||
|      <channel type='unix'> | ||||
| -      <source mode='bind' path='/tmp/channel/domain-7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
| +      <source mode='bind' path='/tmp/channel/7-hotplug/org.qemu.guest_agent.0'/>
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.0'/> | ||||
|        <alias name='channel0'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='1'/> | ||||
| diff --git a/tests/qemuxml2argvdata/channel-unix-source-path.xml b/tests/qemuxml2argvdata/channel-unix-source-path.xml
 | ||||
| index f24c636147e..db0e99c3d12 100644
 | ||||
| --- a/tests/qemuxml2argvdata/channel-unix-source-path.xml
 | ||||
| +++ b/tests/qemuxml2argvdata/channel-unix-source-path.xml
 | ||||
| @@ -24,6 +24,10 @@
 | ||||
|        <source mode='bind' path='/tmp/channel/QEMUGuest1/org.qemu.guest_agent.3'/> | ||||
|        <target type='virtio' name='org.qemu.guest_agent.3'/> | ||||
|      </channel> | ||||
| +    <channel type='unix'>
 | ||||
| +      <source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
 | ||||
| +      <target type='virtio' name='org.qemu.guest_agent.4'/>
 | ||||
| +    </channel>
 | ||||
|      <memballoon model='none'/> | ||||
|    </devices> | ||||
|  </domain> | ||||
| diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
 | ||||
| index 0d6a0295f82..68835ceb151 100644
 | ||||
| --- a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
 | ||||
| +++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
 | ||||
| @@ -41,6 +41,11 @@
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.3'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='4'/> | ||||
|      </channel> | ||||
| +    <channel type='unix'>
 | ||||
| +      <source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
 | ||||
| +      <target type='virtio' name='org.qemu.guest_agent.4'/>
 | ||||
| +      <address type='virtio-serial' controller='0' bus='0' port='5'/>
 | ||||
| +    </channel>
 | ||||
|      <input type='mouse' bus='ps2'/> | ||||
|      <input type='keyboard' bus='ps2'/> | ||||
|      <audio id='1' type='none'/> | ||||
| diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
 | ||||
| index d02ea52408d..738c1184c0e 100644
 | ||||
| --- a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
 | ||||
| +++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
 | ||||
| @@ -38,6 +38,10 @@
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.3'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='4'/> | ||||
|      </channel> | ||||
| +    <channel type='unix'>
 | ||||
| +      <target type='virtio' name='org.qemu.guest_agent.4'/>
 | ||||
| +      <address type='virtio-serial' controller='0' bus='0' port='5'/>
 | ||||
| +    </channel>
 | ||||
|      <input type='mouse' bus='ps2'/> | ||||
|      <input type='keyboard' bus='ps2'/> | ||||
|      <audio id='1' type='none'/> | ||||
							
								
								
									
										229
									
								
								SOURCES/qemu-move-channelTargetDir-into-stateDir.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								SOURCES/qemu-move-channelTargetDir-into-stateDir.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,229 @@ | ||||
| From 8abc979bb09ca4b93123e8f75f3d28cc421a0bb6 Mon Sep 17 00:00:00 2001 | ||||
| From: Michal Privoznik <mprivozn@redhat.com> | ||||
| Date: Thu, 20 Apr 2023 10:16:43 +0200 | ||||
| Subject: [PATCH] qemu: Move channelTargetDir into stateDir | ||||
| 
 | ||||
| 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=2173980 | ||||
| Signed-off-by: Michal Privoznik <mprivozn@redhat.com> | ||||
| Reviewed-by: Pavel Hrdina <phrdina@redhat.com> | ||||
| ---
 | ||||
|  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 3b179d1fd98..7157cfe3b4f 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/libvirt/qemu/ | ||||
| -%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/
 | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/ | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/ | ||||
|  %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/ | ||||
| diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
 | ||||
| index 532fe36be36..3f811d064fe 100644
 | ||||
| --- a/src/qemu/qemu_conf.c
 | ||||
| +++ b/src/qemu/qemu_conf.c
 | ||||
| @@ -138,6 +138,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->configBaseDir = g_strdup_printf("%s/etc", root); | ||||
|          cfg->stateDir = g_strdup_printf("%s/run/qemu", root); | ||||
|          cfg->swtpmStateDir = g_strdup_printf("%s/run/swtpm", root); | ||||
| +        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
 | ||||
|          cfg->cacheDir = g_strdup_printf("%s/cache/qemu", root); | ||||
|          cfg->libDir = g_strdup_printf("%s/lib/qemu", root); | ||||
|          cfg->swtpmStorageDir = g_strdup_printf("%s/lib/swtpm", root); | ||||
| @@ -146,7 +147,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir); | ||||
|          cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir); | ||||
|          cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir); | ||||
| -        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
 | ||||
|          cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir); | ||||
|          cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir); | ||||
|      } else if (privileged) { | ||||
| @@ -158,8 +158,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt"); | ||||
|   | ||||
|          cfg->stateDir = g_strdup_printf("%s/libvirt/qemu", RUNSTATEDIR); | ||||
| -
 | ||||
|          cfg->swtpmStateDir = g_strdup_printf("%s/libvirt/qemu/swtpm", RUNSTATEDIR); | ||||
| +        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
 | ||||
|   | ||||
|          cfg->cacheDir = g_strdup_printf("%s/cache/libvirt/qemu", LOCALSTATEDIR); | ||||
|   | ||||
| @@ -168,7 +168,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir); | ||||
|          cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir); | ||||
|          cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir); | ||||
| -        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
 | ||||
|          cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir); | ||||
|          cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir); | ||||
|          cfg->swtpmStorageDir = g_strdup_printf("%s/lib/libvirt/swtpm", | ||||
| @@ -191,8 +190,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|   | ||||
|          rundir = virGetUserRuntimeDirectory(); | ||||
|          cfg->stateDir = g_strdup_printf("%s/qemu/run", rundir); | ||||
| -
 | ||||
|          cfg->swtpmStateDir = g_strdup_printf("%s/swtpm", cfg->stateDir); | ||||
| +        cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
 | ||||
|   | ||||
|          cfg->configBaseDir = virGetUserConfigDirectory(); | ||||
|   | ||||
| @@ -202,8 +201,6 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged,
 | ||||
|          cfg->checkpointDir = g_strdup_printf("%s/qemu/checkpoint", | ||||
|                                               cfg->configBaseDir); | ||||
|          cfg->autoDumpPath = g_strdup_printf("%s/qemu/dump", cfg->configBaseDir); | ||||
| -        cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel",
 | ||||
| -                                                cfg->configBaseDir);
 | ||||
|          cfg->nvramDir = g_strdup_printf("%s/qemu/nvram", cfg->configBaseDir); | ||||
|          cfg->memoryBackingDir = g_strdup_printf("%s/qemu/ram", cfg->configBaseDir); | ||||
|          cfg->swtpmStorageDir = g_strdup_printf("%s/qemu/swtpm", | ||||
| diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
 | ||||
| index 224350dabc3..d46516856eb 100644
 | ||||
| --- a/src/qemu/qemu_domain.c
 | ||||
| +++ b/src/qemu/qemu_domain.c
 | ||||
| @@ -5153,6 +5153,28 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| +
 | ||||
| +static bool
 | ||||
| +qemuDomainChrMatchDefaultPath(const char *prefix,
 | ||||
| +                              const char *infix,
 | ||||
| +                              const char *target,
 | ||||
| +                              const char *path)
 | ||||
| +{
 | ||||
| +    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 | ||||
| +    g_autofree char *regexp = NULL;
 | ||||
| +
 | ||||
| +    virBufferEscapeRegex(&buf, "^%s", prefix);
 | ||||
| +    if (infix)
 | ||||
| +        virBufferEscapeRegex(&buf, "%s", infix);
 | ||||
| +    virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
 | ||||
| +    virBufferEscapeRegex(&buf, "%s$", target);
 | ||||
| +
 | ||||
| +    regexp = virBufferContentAndReset(&buf);
 | ||||
| +
 | ||||
| +    return virStringMatch(path, regexp);
 | ||||
| +}
 | ||||
| +
 | ||||
| +
 | ||||
|  /* | ||||
|   * Clear auto generated unix socket paths: | ||||
|   * | ||||
| @@ -5173,6 +5195,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 derived
 | ||||
| + * from cfg->libDir but rather cfg->stateDir.
 | ||||
|   */ | ||||
|  static void | ||||
|  qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr, | ||||
| @@ -5191,14 +5216,31 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
 | ||||
|   | ||||
|      cfg = virQEMUDriverGetConfig(driver); | ||||
|   | ||||
| -    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;
 | ||||
| +    }
 | ||||
|   | ||||
| -    regexp = 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;
 | ||||
| +    }
 | ||||
|   | ||||
| -    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;
 | ||||
| +    }
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| diff --git a/tests/qemuxml2argvdata/channel-unix-source-path.xml b/tests/qemuxml2argvdata/channel-unix-source-path.xml
 | ||||
| index db0e99c3d12..df548d88e72 100644
 | ||||
| --- a/tests/qemuxml2argvdata/channel-unix-source-path.xml
 | ||||
| +++ b/tests/qemuxml2argvdata/channel-unix-source-path.xml
 | ||||
| @@ -28,6 +28,10 @@
 | ||||
|        <source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/> | ||||
|        <target type='virtio' name='org.qemu.guest_agent.4'/> | ||||
|      </channel> | ||||
| +    <channel type='unix'>
 | ||||
| +      <source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
 | ||||
| +      <target type='virtio' name='org.qemu.guest_agent.5'/>
 | ||||
| +    </channel>
 | ||||
|      <memballoon model='none'/> | ||||
|    </devices> | ||||
|  </domain> | ||||
| diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
 | ||||
| index 68835ceb151..ec927d37c68 100644
 | ||||
| --- a/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
 | ||||
| +++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-active.xml
 | ||||
| @@ -46,6 +46,11 @@
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.4'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='5'/> | ||||
|      </channel> | ||||
| +    <channel type='unix'>
 | ||||
| +      <source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
 | ||||
| +      <target type='virtio' name='org.qemu.guest_agent.5'/>
 | ||||
| +      <address type='virtio-serial' controller='0' bus='0' port='6'/>
 | ||||
| +    </channel>
 | ||||
|      <input type='mouse' bus='ps2'/> | ||||
|      <input type='keyboard' bus='ps2'/> | ||||
|      <audio id='1' type='none'/> | ||||
| diff --git a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
 | ||||
| index 738c1184c0e..c979bedb392 100644
 | ||||
| --- a/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
 | ||||
| +++ b/tests/qemuxml2xmloutdata/channel-unix-source-path-inactive.xml
 | ||||
| @@ -42,6 +42,10 @@
 | ||||
|        <target type='virtio' name='org.qemu.guest_agent.4'/> | ||||
|        <address type='virtio-serial' controller='0' bus='0' port='5'/> | ||||
|      </channel> | ||||
| +    <channel type='unix'>
 | ||||
| +      <target type='virtio' name='org.qemu.guest_agent.5'/>
 | ||||
| +      <address type='virtio-serial' controller='0' bus='0' port='6'/>
 | ||||
| +    </channel>
 | ||||
|      <input type='mouse' bus='ps2'/> | ||||
|      <input type='keyboard' bus='ps2'/> | ||||
|      <audio id='1' type='none'/> | ||||
							
								
								
									
										29
									
								
								SOURCES/qemu_domain-drop-unused-variables-from.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								SOURCES/qemu_domain-drop-unused-variables-from.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| From b07640bb438d21e592d66ca8367904d82838602f Mon Sep 17 00:00:00 2001 | ||||
| From: Michal Privoznik <mprivozn@redhat.com> | ||||
| Date: Thu, 17 Aug 2023 17:43:54 +0200 | ||||
| Subject: [PATCH] qemu_domain: Drop unused variables from | ||||
|  qemuDomainChrDefDropDefaultPath() | ||||
| 
 | ||||
| In mu previous commits I've moved internals of | ||||
| qemuDomainChrDefDropDefaultPath() into a separate function | ||||
| (qemuDomainChrMatchDefaultPath()) but forgot to remove @buf and | ||||
| @regexp variables which are now unused.
 | ||||
| 
 | ||||
| Signed-off-by: Michal Privoznik <mprivozn@redhat.com> | ||||
| ---
 | ||||
|  src/qemu/qemu_domain.c | 2 -- | ||||
|  1 file changed, 2 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
 | ||||
| index d46516856eb..f64836fbb17 100644
 | ||||
| --- a/src/qemu/qemu_domain.c
 | ||||
| +++ b/src/qemu/qemu_domain.c
 | ||||
| @@ -5204,8 +5204,6 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
 | ||||
|                                  virQEMUDriver *driver) | ||||
|  { | ||||
|      g_autoptr(virQEMUDriverConfig) cfg = NULL; | ||||
| -    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 | ||||
| -    g_autofree char *regexp = NULL;
 | ||||
|   | ||||
|      if (chr->deviceType != VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL || | ||||
|          chr->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO || | ||||
| @ -229,7 +229,7 @@ | ||||
| Summary: Library providing a simple virtualization API | ||||
| Name: libvirt | ||||
| Version: 9.0.0 | ||||
| Release: 10.2%{?dist}%{?extra_release} | ||||
| Release: 10.3%{?dist}%{?extra_release}.alma.1 | ||||
| License: LGPLv2+ | ||||
| URL: https://libvirt.org/ | ||||
| 
 | ||||
| @ -307,6 +307,13 @@ Patch66: libvirt-docs-Document-memory-allocation-and-emulator-pinning-limitation | ||||
| Patch67: libvirt-conf-Fix-migration-in-some-firmware-autoselection-scenarios.patch | ||||
| Patch68: libvirt-virpci-Resolve-leak-in-virPCIVirtualFunctionList-cleanup.patch | ||||
| 
 | ||||
| # Patches were taken from and backported to apply cleanly: | ||||
| # https://github.com/libvirt/libvirt/commit/d3759d3674ab9453e5fb5a27ab6c28b8ff8d5569 | ||||
| Patch69: qemu-generate-shorter-channel-target-paths.patch | ||||
| # https://github.com/libvirt/libvirt/commit/8abc979bb09ca4b93123e8f75f3d28cc421a0bb6 | ||||
| Patch70: qemu-move-channelTargetDir-into-stateDir.patch | ||||
| # https://github.com/libvirt/libvirt/commit/b07640bb438d21e592d66ca8367904d82838602f | ||||
| Patch71: qemu_domain-drop-unused-variables-from.patch | ||||
| 
 | ||||
| Requires: libvirt-daemon = %{version}-%{release} | ||||
| Requires: libvirt-daemon-config-network = %{version}-%{release} | ||||
| @ -2069,8 +2076,6 @@ exit 0 | ||||
| %ghost %dir %{_rundir}/libvirt/qemu/slirp/ | ||||
| %ghost %dir %{_rundir}/libvirt/qemu/swtpm/ | ||||
| %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/ | ||||
| %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/ | ||||
| %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/target/ | ||||
| %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/ | ||||
| %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/ | ||||
| %dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/ | ||||
| @ -2399,6 +2404,11 @@ exit 0 | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Wed Sep 13 2023 Eduard Abdullin <eabdullin@almalinux.org> - 9.0.0-10.3.el9_2.alma.1 | ||||
| - qemu: Generate shorter channel target paths | ||||
| - qemu: Move channelTargetDir into stateDir | ||||
| - qemu_domain: Drop unused variables from qemuDomainChrDefDropDefaultPath() | ||||
| 
 | ||||
| * Mon May 29 2023 Jiri Denemark <jdenemar@redhat.com> - 9.0.0-10.2.el9_2 | ||||
| - virpci: Resolve leak in virPCIVirtualFunctionList cleanup (CVE-2023-2700, rhbz#2208596) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user