From 85f208d1641be515c21f8a3cded609cb1e5f8765 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" 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