storage: zfs: Use 'zfs list' to check pool status

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>
This commit is contained in:
Matt Low 2023-07-03 16:53:28 -06:00 committed by Michal Privoznik
parent fa0d5f4ebc
commit 3cde509f1a

View File

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