[PATCH v2 08/13] qemu: put data-file path to VM's cgroup and namespace

Nikolai Barybin via Devel posted 13 patches 1 year, 5 months ago
There is a newer version of this series
[PATCH v2 08/13] qemu: put data-file path to VM's cgroup and namespace
Posted by Nikolai Barybin via Devel 1 year, 5 months ago
Signed-off-by: Nikolai Barybin <nikolai.barybin@virtuozzo.com>
---
 src/qemu/qemu_cgroup.c    | 4 ++++
 src/qemu/qemu_namespace.c | 5 +++++
 2 files changed, 9 insertions(+)

diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index 23b7e6b4e8..a6d3c16e50 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -223,6 +223,10 @@ qemuSetupImageCgroupInternal(virDomainObj *vm,
         qemuSetupImagePathCgroup(vm, QEMU_DEVICE_MAPPER_CONTROL_PATH, false) < 0)
         return -1;
 
+    if (src->dataFileStore &&
+        qemuSetupImagePathCgroup(vm, src->dataFileStore->path, readonly) < 0)
+        return -1;
+
     return qemuSetupImagePathCgroup(vm, path, readonly);
 }
 
diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c
index bbe3d5a1f7..afeec63a4f 100644
--- a/src/qemu/qemu_namespace.c
+++ b/src/qemu/qemu_namespace.c
@@ -290,6 +290,11 @@ qemuDomainSetupDisk(virStorageSource *src,
 
             if (targetPaths)
                 *paths = g_slist_concat(g_slist_reverse(targetPaths), *paths);
+
+            if (next->dataFileStore) {
+                g_autofree char *dataFilePath = g_strdup(next->dataFileStore->path);
+                *paths = g_slist_prepend(*paths, g_steal_pointer(&dataFilePath));
+            }
         }
 
         *paths = g_slist_prepend(*paths, g_steal_pointer(&tmpPath));
-- 
2.43.5
Re: [PATCH v2 08/13] qemu: put data-file path to VM's cgroup and namespace
Posted by Peter Krempa 1 year, 3 months ago
On Sat, Sep 07, 2024 at 17:15:31 +0300, Nikolai Barybin via Devel wrote:
> Signed-off-by: Nikolai Barybin <nikolai.barybin@virtuozzo.com>
> ---
>  src/qemu/qemu_cgroup.c    | 4 ++++
>  src/qemu/qemu_namespace.c | 5 +++++
>  2 files changed, 9 insertions(+)

Firstly, that applies everywhere, you must not use the 'path' member of
virStorageSource as a local file path unless you check that it's a local
source by calling virStorageSourceIsLocalStorage. Network storage
backends (e.g. NBD) use that field for the relative path/export name
so it's not a local path then.

> 
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index 23b7e6b4e8..a6d3c16e50 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -223,6 +223,10 @@ qemuSetupImageCgroupInternal(virDomainObj *vm,
>          qemuSetupImagePathCgroup(vm, QEMU_DEVICE_MAPPER_CONTROL_PATH, false) < 0)
>          return -1;
>  
> +    if (src->dataFileStore &&
> +        qemuSetupImagePathCgroup(vm, src->dataFileStore->path, readonly) < 0)
> +        return -1;
> +

I don't think this is correct. You should call
'qemuSetupImageCgroupInternal' on the data file virStorageSource struct
instead, rather than setup it partially inside.

>      return qemuSetupImagePathCgroup(vm, path, readonly);
>  }
>  
> diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c
> index bbe3d5a1f7..afeec63a4f 100644
> --- a/src/qemu/qemu_namespace.c
> +++ b/src/qemu/qemu_namespace.c
> @@ -290,6 +290,11 @@ qemuDomainSetupDisk(virStorageSource *src,
>  
>              if (targetPaths)
>                  *paths = g_slist_concat(g_slist_reverse(targetPaths), *paths);
> +
> +            if (next->dataFileStore) {
> +                g_autofree char *dataFilePath = g_strdup(next->dataFileStore->path);
> +                *paths = g_slist_prepend(*paths, g_steal_pointer(&dataFilePath));
> +            }

And this isn't correct either because this code will be skipped if the
QCOW2 bit (the metadata file) is not stored locally.

>          }
>  
>          *paths = g_slist_prepend(*paths, g_steal_pointer(&tmpPath));
> -- 
> 2.43.5
>