]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: zfs: Use 'zfs list' to check pool status
authorMatt Low <matt@mlow.ca>
Mon, 3 Jul 2023 22:53:28 +0000 (16:53 -0600)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 20 Jul 2023 08:44:14 +0000 (10:44 +0200)
The current virtStorageBackendZFSCheckPool checks for the existence of a
path under /dev/zvol/ to determine if the pool is active. ZFS does not
create a path under /dev/zvol/ if no ZFS volumes have been created under
a particular dataset, thus, empty ZFS storage pools are deactivated
whenever checkPool is called on them (as noted in referenced issue).

This commit changes virStorageBackendZFSCheckPool so that the 'zfs list'
command is used to explicitly check for the existence a dataset
specified by the pool's def->source.name.

Resolves: https://gitlab.com/libvirt/libvirt/-/issues/221

Signed-off-by: Matt Low <matt@mlow.ca>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/storage/storage_backend_zfs.c

index 2a5d74357d9c5bae46d6d58a26a6a677a67eba97..4e243a738af0a51646735f83b9204b792f856626 100644 (file)
@@ -85,10 +85,24 @@ virStorageBackendZFSCheckPool(virStoragePoolObj *pool G_GNUC_UNUSED,
                               bool *isActive)
 {
     virStoragePoolDef *def = virStoragePoolObjGetDef(pool);
-    g_autofree char *devpath = NULL;
+    g_autoptr(virCommand) cmd = NULL;
+    int exit_code = -1;
+
+    /* Check for an existing dataset of type 'filesystem' by the name of our
+     * pool->source.name.  */
+    cmd = virCommandNewArgList(ZFS,
+                               "list", "-H",
+                               "-t", "filesystem",
+                               "-o", "name",
+                               def->source.name,
+                               NULL);
+
+
+    if (virCommandRun(cmd, &exit_code) < 0)
+        return -1;
 
-    devpath = g_strdup_printf("/dev/zvol/%s", def->source.name);
-    *isActive = virFileIsDir(devpath);
+    /* zfs list exits with 0 if the dataset exists, 1 if it doesn't */
+    *isActive = exit_code == 0;
 
     return 0;
 }