[libvirt PATCH v6 03/36] qemu: expand nbdkit capabilities

Jonathon Jongsma posted 36 patches 2 years, 6 months ago
There is a newer version of this series
[libvirt PATCH v6 03/36] qemu: expand nbdkit capabilities
Posted by Jonathon Jongsma 2 years, 6 months ago
In order to add caching of the nbdkit capabilities, we will need to
compare against file modification times, etc. So look up this
information when creating the nbdkit caps.

Add a nbdkit_moddir build option to allow the builder to specify the
location to look for nbdkit plugins and filters.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
---
 src/qemu/qemu_nbdkit.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/qemu/qemu_nbdkit.c b/src/qemu/qemu_nbdkit.c
index 9ff293698d..486df8c161 100644
--- a/src/qemu/qemu_nbdkit.c
+++ b/src/qemu/qemu_nbdkit.c
@@ -20,6 +20,7 @@
 #include <config.h>
 #include <glib.h>
 
+#include "configmake.h"
 #include "vircommand.h"
 #include "virerror.h"
 #include "virlog.h"
@@ -39,6 +40,10 @@
 
 VIR_LOG_INIT("qemu.nbdkit");
 
+#define NBDKIT_MODDIR LIBDIR "/nbdkit"
+#define NBDKIT_PLUGINDIR NBDKIT_MODDIR "/plugins"
+#define NBDKIT_FILTERDIR NBDKIT_MODDIR "/filters"
+
 VIR_ENUM_IMPL(qemuNbdkitCaps,
     QEMU_NBDKIT_CAPS_LAST,
     /* 0 */
@@ -52,6 +57,11 @@ struct _qemuNbdkitCaps {
 
     char *path;
     char *version;
+    time_t ctime;
+    time_t libvirtCtime;
+    time_t pluginDirMtime;
+    time_t filterDirMtime;
+    unsigned int libvirtVersion;
 
     virBitmap *flags;
 };
@@ -176,9 +186,41 @@ qemuNbdkitCapsNew(const char *path)
 }
 
 
+static time_t
+qemuNbdkitGetDirMtime(const char *moddir)
+{
+    struct stat st;
+
+    if (stat(moddir, &st) < 0) {
+        VIR_DEBUG("Failed to stat nbdkit module directory '%s': %s",
+                  moddir,
+                  g_strerror(errno));
+        return 0;
+    }
+
+    return st.st_mtime;
+}
+
+
 G_GNUC_UNUSED static void
 qemuNbdkitCapsQuery(qemuNbdkitCaps *caps)
 {
+    struct stat st;
+
+    if (stat(caps->path, &st) < 0) {
+        VIR_DEBUG("Failed to stat nbdkit binary '%s': %s",
+                  caps->path,
+                  g_strerror(errno));
+        caps->ctime  = 0;
+        return;
+    }
+
+    caps->ctime = st.st_ctime;
+    caps->filterDirMtime = qemuNbdkitGetDirMtime(NBDKIT_FILTERDIR);
+    caps->pluginDirMtime = qemuNbdkitGetDirMtime(NBDKIT_PLUGINDIR);
+    caps->libvirtCtime = virGetSelfLastChanged();
+    caps->libvirtVersion = LIBVIR_VERSION_NUMBER;
+
     qemuNbdkitCapsQueryPlugins(caps);
     qemuNbdkitCapsQueryFilters(caps);
     qemuNbdkitCapsQueryVersion(caps);
-- 
2.41.0