On Thu, Oct 20, 2022 at 16:58:59 -0500, Jonathon Jongsma wrote:
An object for storing information about a nbdkit process that is
serving
a specific virStorageSource. At the moment, this information is just
stored in the private data of virStorageSource and not used at all.
Future commits will use this data to actually start a nbdkit process.
Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
src/qemu/qemu_conf.c | 23 ++++++++++++
src/qemu/qemu_conf.h | 3 ++
src/qemu/qemu_domain.c | 31 ++++++++++++++++
src/qemu/qemu_domain.h | 4 +++
src/qemu/qemu_nbdkit.c | 82 ++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_nbdkit.h | 26 ++++++++++++++
6 files changed, 169 insertions(+)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index ae5bbcd138..0370429da0 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1641,3 +1641,26 @@ qemuHugepageMakeBasedir(virQEMUDriver *driver,
return 0;
}
+
+
+/*
+ * qemuGetNbdkitCaps:
+ * @driver: the qemu driver
+ *
+ * Gets the capabilities for Nbdkit for the specified driver. These can be used
+ * to determine whether a particular disk source can be served by nbdkit or
+ * not.
+ *
+ * Returns: a reference to qemuNbdkitCaps or NULL
+ */
+qemuNbdkitCaps*
+qemuGetNbdkitCaps(virQEMUDriver *driver)
+{
+ if (!driver->nbdkitBinary)
+ driver->nbdkitBinary = virFindFileInPath("nbdkit");
+
+ if (driver->nbdkitBinary)
+ return virFileCacheLookup(driver->nbdkitCapsCache, driver->nbdkitBinary);
+
+ return NULL;
+}
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 95c05e6888..8b4f6ce669 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -323,6 +323,7 @@ struct _virQEMUDriver {
/* Immutable pointer, self-locking APIs */
virFileCache *nbdkitCapsCache;
+ char *nbdkitBinary;
The above statement doesn't apply to 'nbdkitBinary'. It's not immutable
because you update it in qemuGetNbdkitCaps and it also certainly doesn't
have self-locking APIS.
You can claim immutability if and only if it's assigned in
qemuStateInitialize and never changed afterwards.
I don't think we should cache the path though as it creates weird
situations where a different version of nbdkit placed in $PATH
preferentially will be picked up, but only after a restart.
This brings another issue though I think that the path to
modules/plugins should be detected from the actual NBDkit instance
rather than hardcoded:
$ nbdkit --dump-config
binary=/usr/sbin/nbdkit
bindir=/usr/bin
exit_with_parent=yes
filterdir=/usr/lib64/nbdkit/filters
host_cpu=x86_64
host_os=linux-gnu
libdir=/usr/lib64
mandir=/usr/share/man
name=nbdkit
plugindir=/usr/lib64/nbdkit/plugins
root_tls_certificates_dir=/etc/pki/nbdkit
sbindir=/usr/sbin
selinux=yes
sysconfdir=/etc
tls=yes
version=1.32.4
version_extra=nbdkit-1.32.4-1.fc37
version_major=1
version_minor=32
zstd=yes
This way each cached version will properly see the corresponding plugin
version. You also won't have a config-time option for it which can't be
changed after the package is installed.