187 lines
6.8 KiB
Diff
187 lines
6.8 KiB
Diff
From fd3632aaa6528d1164f729442bd2f104d18bb941 Mon Sep 17 00:00:00 2001
|
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
Date: Fri, 29 Oct 2021 21:02:54 +0100
|
|
Subject: [PATCH] vddk: Simplify detection of VDDK symbols and baseline 6.5
|
|
|
|
Make all symbols from VDDK 6.5 into required symbols and use a single
|
|
error message function if one of these is missing. The new error is:
|
|
|
|
nbdkit: error: required VDDK symbol "VixDiskLib_Wait" is
|
|
missing. VDDK version must be >= 6.5. See nbdkit-vddk-plugin(1) man
|
|
page section "SUPPORTED VERSIONS OF VDDK". Original dlopen error:
|
|
vmware-vix-disklib-distrib/lib64/libvixDiskLib.so.6: undefined
|
|
symbol: VixDiskLib_Wait
|
|
|
|
Remove the extra check and assert.
|
|
|
|
Be more consistent about #define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
|
|
when we want the optional and required stubs to do the same thing.
|
|
|
|
(cherry picked from commit ec0d22e61881efa39a69d02ccb9e4ede8bf95e75)
|
|
---
|
|
plugins/vddk/stats.c | 2 +-
|
|
plugins/vddk/vddk-stubs.h | 45 ++++++++++++++++++---------------------
|
|
plugins/vddk/vddk.c | 36 ++++++++++++-------------------
|
|
plugins/vddk/vddk.h | 2 +-
|
|
4 files changed, 37 insertions(+), 48 deletions(-)
|
|
|
|
diff --git a/plugins/vddk/stats.c b/plugins/vddk/stats.c
|
|
index 18a42714..76e0c244 100644
|
|
--- a/plugins/vddk/stats.c
|
|
+++ b/plugins/vddk/stats.c
|
|
@@ -89,7 +89,7 @@ display_stats (void)
|
|
if (!vddk_debug_stats) return;
|
|
|
|
#define STUB(fn,ret,args) statlist_append (&stats, stats_##fn)
|
|
-#define OPTIONAL_STUB(fn,ret,args) statlist_append (&stats, stats_##fn)
|
|
+#define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
|
|
#include "vddk-stubs.h"
|
|
#undef STUB
|
|
#undef OPTIONAL_STUB
|
|
diff --git a/plugins/vddk/vddk-stubs.h b/plugins/vddk/vddk-stubs.h
|
|
index 66353691..7d8644c3 100644
|
|
--- a/plugins/vddk/vddk-stubs.h
|
|
+++ b/plugins/vddk/vddk-stubs.h
|
|
@@ -39,10 +39,7 @@
|
|
* function name, return value, arguments.
|
|
*/
|
|
|
|
-/* Required stubs, present in all versions of VDDK that we support. I
|
|
- * have checked that all these exist in at least VDDK 5.5.5 (2015).
|
|
- */
|
|
-
|
|
+/* Required stubs, present in all versions of VDDK since 6.5 (Nov 2016). */
|
|
STUB (VixDiskLib_InitEx,
|
|
VixError,
|
|
(uint32_t major, uint32_t minor,
|
|
@@ -103,27 +100,27 @@ STUB (VixDiskLib_Write,
|
|
uint64_t start_sector, uint64_t nr_sectors,
|
|
const unsigned char *buf));
|
|
|
|
-/* Added in VDDK 6.0, these will be NULL in earlier versions. */
|
|
-OPTIONAL_STUB (VixDiskLib_Flush,
|
|
- VixError,
|
|
- (VixDiskLibHandle handle));
|
|
-OPTIONAL_STUB (VixDiskLib_ReadAsync,
|
|
- VixError,
|
|
- (VixDiskLibHandle handle,
|
|
- uint64_t start_sector, uint64_t nr_sectors,
|
|
- unsigned char *buf,
|
|
- VixDiskLibCompletionCB callback, void *data));
|
|
-OPTIONAL_STUB (VixDiskLib_WriteAsync,
|
|
- VixError,
|
|
- (VixDiskLibHandle handle,
|
|
- uint64_t start_sector, uint64_t nr_sectors,
|
|
- const unsigned char *buf,
|
|
- VixDiskLibCompletionCB callback, void *data));
|
|
+/* Added in VDDK 6.0. */
|
|
+STUB (VixDiskLib_Flush,
|
|
+ VixError,
|
|
+ (VixDiskLibHandle handle));
|
|
+STUB (VixDiskLib_ReadAsync,
|
|
+ VixError,
|
|
+ (VixDiskLibHandle handle,
|
|
+ uint64_t start_sector, uint64_t nr_sectors,
|
|
+ unsigned char *buf,
|
|
+ VixDiskLibCompletionCB callback, void *data));
|
|
+STUB (VixDiskLib_WriteAsync,
|
|
+ VixError,
|
|
+ (VixDiskLibHandle handle,
|
|
+ uint64_t start_sector, uint64_t nr_sectors,
|
|
+ const unsigned char *buf,
|
|
+ VixDiskLibCompletionCB callback, void *data));
|
|
|
|
-/* Added in VDDK 6.5, this will be NULL in earlier versions. */
|
|
-OPTIONAL_STUB (VixDiskLib_Wait,
|
|
- VixError,
|
|
- (VixDiskLibHandle handle));
|
|
+/* Added in VDDK 6.5. */
|
|
+STUB (VixDiskLib_Wait,
|
|
+ VixError,
|
|
+ (VixDiskLibHandle handle));
|
|
|
|
/* Added in VDDK 6.7, these will be NULL for earlier versions: */
|
|
OPTIONAL_STUB (VixDiskLib_QueryAllocatedBlocks,
|
|
diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c
|
|
index f967e2d9..271b5ee0 100644
|
|
--- a/plugins/vddk/vddk.c
|
|
+++ b/plugins/vddk/vddk.c
|
|
@@ -63,7 +63,7 @@ NBDKIT_DLL_PUBLIC int vddk_debug_datapath = 1;
|
|
* initialized when the plugin is loaded (by vddk_get_ready).
|
|
*/
|
|
#define STUB(fn,ret,args) ret (*fn) args
|
|
-#define OPTIONAL_STUB(fn,ret,args) ret (*fn) args
|
|
+#define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
|
|
#include "vddk-stubs.h"
|
|
#undef STUB
|
|
#undef OPTIONAL_STUB
|
|
@@ -282,6 +282,17 @@ vddk_config (const char *key, const char *value)
|
|
return 0;
|
|
}
|
|
|
|
+static void
|
|
+missing_required_symbol (const char *fn)
|
|
+{
|
|
+ nbdkit_error ("required VDDK symbol \"%s\" is missing. "
|
|
+ "VDDK version must be >= 6.5. "
|
|
+ "See nbdkit-vddk-plugin(1) man page section \"SUPPORTED VERSIONS OF VDDK\". "
|
|
+ "Original dlopen error: %s\n",
|
|
+ fn, dlerror ());
|
|
+ exit (EXIT_FAILURE);
|
|
+}
|
|
+
|
|
/* Load the VDDK library. */
|
|
static void
|
|
load_library (bool load_error_is_fatal)
|
|
@@ -358,32 +369,13 @@ load_library (bool load_error_is_fatal)
|
|
#define STUB(fn,ret,args) \
|
|
do { \
|
|
fn = dlsym (dl, #fn); \
|
|
- if (fn == NULL) { \
|
|
- nbdkit_error ("required VDDK symbol \"%s\" is missing: %s", \
|
|
- #fn, dlerror ()); \
|
|
- exit (EXIT_FAILURE); \
|
|
- } \
|
|
+ if (fn == NULL) \
|
|
+ missing_required_symbol (#fn); \
|
|
} while (0)
|
|
#define OPTIONAL_STUB(fn,ret,args) fn = dlsym (dl, #fn)
|
|
#include "vddk-stubs.h"
|
|
#undef STUB
|
|
#undef OPTIONAL_STUB
|
|
-
|
|
- /* Additionally, VDDK version must be >= 6.5. This was the first
|
|
- * version which introduced VixDiskLib_Wait symbol so we can check
|
|
- * for that.
|
|
- */
|
|
- if (VixDiskLib_Wait == NULL) {
|
|
- nbdkit_error ("VDDK version must be >= 6.5. "
|
|
- "See nbdkit-vddk-plugin(1) man page section \"SUPPORTED VERSIONS OF VDDK\".");
|
|
- exit (EXIT_FAILURE);
|
|
- }
|
|
-
|
|
- /* Added in VDDK 6.0 so it must always be present. Since we are
|
|
- * going to call this function unconditionally, fail early and hard
|
|
- * if for some reason it's not present.
|
|
- */
|
|
- assert (VixDiskLib_Flush != NULL);
|
|
}
|
|
|
|
static int
|
|
diff --git a/plugins/vddk/vddk.h b/plugins/vddk/vddk.h
|
|
index be0b3492..0e3dd79e 100644
|
|
--- a/plugins/vddk/vddk.h
|
|
+++ b/plugins/vddk/vddk.h
|
|
@@ -76,7 +76,7 @@ extern int vddk_debug_datapath;
|
|
extern int vddk_debug_stats;
|
|
|
|
#define STUB(fn,ret,args) extern ret (*fn) args
|
|
-#define OPTIONAL_STUB(fn,ret,args) extern ret (*fn) args
|
|
+#define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
|
|
#include "vddk-stubs.h"
|
|
#undef STUB
|
|
#undef OPTIONAL_STUB
|
|
--
|
|
2.31.1
|
|
|