From: Xiubo Li Date: Wed, 6 May 2020 00:43:12 +0000 (-0400) Subject: libfuse: check the libfuse version from the pkconfig/fuse{3}.pc file X-Git-Tag: v16.1.0~2168^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7a3cc61de03075ada0527f77b64d3456cb47e3a2;p=ceph.git libfuse: check the libfuse version from the pkconfig/fuse{3}.pc file Since libfuse 3.2 to 3.8 the minor version for FUSE library has stopped updating together with the releases. So we cannot check version by using the FUSE_VERSION macro in the fuse_common.h header file directly. This will check the major/minor version from the fuse{3}.pc pkconfig file. Fixes: https://tracker.ceph.com/issues/45396 Signed-off-by: Xiubo Li --- diff --git a/cmake/modules/FindFUSE.cmake b/cmake/modules/FindFUSE.cmake index 1d0766f33553..db489bdc1ad6 100644 --- a/cmake/modules/FindFUSE.cmake +++ b/cmake/modules/FindFUSE.cmake @@ -28,14 +28,25 @@ find_library(FUSE_LIBRARIES NAMES ${fuse_names} PATHS /usr/local/lib64 /usr/local/lib) -foreach(ver "MAJOR" "MINOR") - file(STRINGS "${FUSE_INCLUDE_DIR}/fuse_common.h" fuse_ver_${ver}_line - REGEX "^#define[\t ]+FUSE_${ver}_VERSION[\t ]+[0-9]+$") - string(REGEX REPLACE ".*#define[\t ]+FUSE_${ver}_VERSION[\t ]+([0-9]+)$" - "\\1" FUSE_VERSION_${ver} "${fuse_ver_${ver}_line}") -endforeach() +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_search_module(PKG_FUSE QUIET ${fuse_names}) + + string(REGEX REPLACE "([0-9]+)\.([0-9]+)\.([0-9]+)" + "\\1" FUSE_MAJOR_VERSION "${PKG_FUSE_VERSION}") + string(REGEX REPLACE "([0-9]+)\.([0-9]+)\.([0-9]+)" + "\\2" FUSE_MINOR_VERSION "${PKG_FUSE_VERSION}") +else() + foreach(ver "MAJOR" "MINOR") + file(STRINGS "${FUSE_INCLUDE_DIR}/fuse_common.h" fuse_ver_${ver}_line + REGEX "^#define[\t ]+FUSE_${ver}_VERSION[\t ]+[0-9]+$") + string(REGEX REPLACE ".*#define[\t ]+FUSE_${ver}_VERSION[\t ]+([0-9]+)$" + "\\1" FUSE_${ver}_VERSION "${fuse_ver_${ver}_line}") + endforeach() +endif() + set(FUSE_VERSION - "${FUSE_VERSION_MAJOR}.${FUSE_VERSION_MINOR}") + "${FUSE_MAJOR_VERSION}.${FUSE_MINOR_VERSION}") include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FUSE diff --git a/src/ceph_fuse.cc b/src/ceph_fuse.cc index 3692b5c6ff6f..02aed32ac699 100644 --- a/src/ceph_fuse.cc +++ b/src/ceph_fuse.cc @@ -44,6 +44,7 @@ #include #include +#include "include/ceph_fuse.h" #define dout_context g_ceph_context diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 43b33e32a06c..034977b1832e 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -34,6 +34,7 @@ #include "common/config.h" #include "include/ceph_assert.h" #include "include/cephfs/ceph_ll_client.h" +#include "include/ceph_fuse.h" #include "fuse_ll.h" #include diff --git a/src/include/ceph_fuse.h b/src/include/ceph_fuse.h index 45881930b87b..ae504f6715de 100644 --- a/src/include/ceph_fuse.h +++ b/src/include/ceph_fuse.h @@ -15,8 +15,19 @@ #define CEPH_FUSE_H #define FUSE_USE_VERSION 30 -#include "acconfig.h" #include +#include "acconfig.h" + +/* + * Redefine the FUSE_VERSION macro defined in "fuse_common.h" + * header file, because the MINOR numner has been forgotten to + * update since libfuse 3.2 to 3.8. We need to fetch the MINOR + * number from pkgconfig file. + */ +#ifdef FUSE_VERSION +#undef FUSE_VERSION +#define FUSE_VERSION FUSE_MAKE_VERSION(CEPH_FUSE_MAJOR_VERSION, CEPH_FUSE_MINOR_VERSION) +#endif static inline int filler_compat(fuse_fill_dir_t filler, void *buf, const char *name, diff --git a/src/include/config-h.in.cmake b/src/include/config-h.in.cmake index e26671d3a005..40cbc430730b 100644 --- a/src/include/config-h.in.cmake +++ b/src/include/config-h.in.cmake @@ -87,6 +87,12 @@ /* Define if you have fuse */ #cmakedefine HAVE_LIBFUSE +/* Define version major */ +#define CEPH_FUSE_MAJOR_VERSION @FUSE_MAJOR_VERSION@ + +/* Define version minor */ +#define CEPH_FUSE_MINOR_VERSION @FUSE_MINOR_VERSION@ + /* Define to 1 if you have libxfs */ #cmakedefine HAVE_LIBXFS 1