From 5165473737e488447edfe25209c68704e08b3a2d Mon Sep 17 00:00:00 2001 From: Carlos Alberto Lopez Perez Date: Sat, 27 Apr 2013 20:18:11 +0200 Subject: [PATCH] Ensure --with-spl-timeout waits for spl_config.h and symvers The previous code was only waiting for the symver file. But the postinst target of the DKMS script for SPL will not only create the symvers file, but also the header spl_config.h. If we are waiting in the configure script of ZFS for the SPL symvers file, then we also need to wait for spl_config.h. Otherwise the configure script will abort because the spl_config.h is not yet available. On top of that, the function ZFS_AC_SPL_MODULE_SYMVERS is moved to the end of the function ZFS_AC_SPL to allow both checks share the with-spl-timeout parameter. Signed-off-by: Brian Behlendorf Closes #1431 --- config/kernel.m4 | 123 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 67 insertions(+), 56 deletions(-) diff --git a/config/kernel.m4 b/config/kernel.m4 index d8a7b35..d068980 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -229,54 +229,6 @@ AC_DEFUN([ZFS_AC_KERNEL], [ ZFS_AC_MODULE_SYMVERS ]) -dnl # -dnl # Detect name used for the additional SPL Module.symvers file. If one -dnl # does not exist this is likely because the SPL has been configured -dnl # but not built. The '--with-spl-timeout' option can be passed -dnl # to pause here, waiting for the file to appear from a concurrently -dnl # building SPL package. If the file does not appear in time, a good -dnl # guess is made as to what this file will be named based on what it -dnl # is named in the kernel build products. This file will first be -dnl # used at link time so if the guess is wrong the build will fail -dnl # then. This unfortunately means the ZFS package does not contain a -dnl # reliable mechanism to detect symbols exported by the SPL at -dnl # configure time. -dnl # -AC_DEFUN([ZFS_AC_SPL_MODULE_SYMVERS], [ - AC_ARG_WITH([spl-timeout], - AS_HELP_STRING([--with-spl-timeout=SECS], - [Wait SECS for symvers file to appear @<:@default=0@:>@]), - [timeout="$withval"], [timeout=0]) - - AC_MSG_CHECKING([spl file name for module symbols]) - SPL_SYMBOLS=NONE - - while true; do - AS_IF([test -r $SPL_OBJ/Module.symvers], [ - SPL_SYMBOLS=Module.symvers - ], [test -r $SPL_OBJ/Modules.symvers], [ - SPL_SYMBOLS=Modules.symvers - ], [test -r $SPL_OBJ/module/Module.symvers], [ - SPL_SYMBOLS=Module.symvers - ], [test -r $SPL_OBJ/module/Modules.symvers], [ - SPL_SYMBOLS=Modules.symvers - ]) - - AS_IF([test $SPL_SYMBOLS != NONE -o $timeout -le 0], [ - break; - ], [ - sleep 1 - timeout=$((timeout-1)) - ]) - done - - AS_IF([test "$SPL_SYMBOLS" = NONE], [ - SPL_SYMBOLS=$LINUX_SYMBOLS - ]) - - AC_MSG_RESULT([$SPL_SYMBOLS]) - AC_SUBST(SPL_SYMBOLS) -]) dnl # dnl # Detect the SPL module to be built against @@ -292,6 +244,11 @@ AC_DEFUN([ZFS_AC_SPL], [ [Path to spl build objects]), [splbuild="$withval"]) + AC_ARG_WITH([spl-timeout], + AS_HELP_STRING([--with-spl-timeout=SECS], + [Wait SECS for SPL header and symver file @<:@default=0@:>@]), + [timeout="$withval"], [timeout=0]) + dnl # dnl # The existence of spl.release.in is used to identify a valid dnl # source directory. In order of preference: @@ -338,16 +295,30 @@ AC_DEFUN([ZFS_AC_SPL], [ dnl # directory are the same, however the objects may also reside dnl # is a subdirectory named after the kernel version. dnl # + dnl # This file is supposed to be available after DKMS finishes + dnl # building the SPL kernel module for the target kernel. The + dnl # '--with-spl-timeout' option can be passed to pause here, + dnl # waiting for the file to appear from a concurrently building + dnl # SPL package. + dnl # AC_MSG_CHECKING([spl build directory]) - AS_IF([test -z "$splbuild"], [ - AS_IF([ test -e "${splsrc}/${LINUX_VERSION}/spl_config.h" ], [ - splbuild="${splsrc}/${LINUX_VERSION}" - ], [ test -e "${splsrc}/spl_config.h" ], [ - splbuild="${splsrc}" + while true; do + AS_IF([test -z "$splbuild"], [ + AS_IF([ test -e "${splsrc}/${LINUX_VERSION}/spl_config.h" ], [ + splbuild="${splsrc}/${LINUX_VERSION}" + ], [ test -e "${splsrc}/spl_config.h" ], [ + splbuild="${splsrc}" + ], [ + splbuild="[Not found]" + ]) + ]) + AS_IF([test -e "$splbuild/spl_config.h" -o $timeout -le 0], [ + break; ], [ - splbuild="[Not found]" + sleep 1 + timeout=$((timeout-1)) ]) - ]) + done AC_MSG_RESULT([$splbuild]) AS_IF([ ! test -e "$splbuild/spl_config.h"], [ @@ -385,7 +356,47 @@ AC_DEFUN([ZFS_AC_SPL], [ AC_SUBST(SPL_OBJ) AC_SUBST(SPL_VERSION) - ZFS_AC_SPL_MODULE_SYMVERS + dnl # + dnl # Detect the name used for the SPL Module.symvers file. If one + dnl # does not exist this is likely because the SPL has been configured + dnl # but not built. The '--with-spl-timeout' option can be passed + dnl # to pause here, waiting for the file to appear from a concurrently + dnl # building SPL package. If the file does not appear in time, a good + dnl # guess is made as to what this file will be named based on what it + dnl # is named in the kernel build products. This file will first be + dnl # used at link time so if the guess is wrong the build will fail + dnl # then. This unfortunately means the ZFS package does not contain a + dnl # reliable mechanism to detect symbols exported by the SPL at + dnl # configure time. + dnl # + AC_MSG_CHECKING([spl file name for module symbols]) + SPL_SYMBOLS=NONE + + while true; do + AS_IF([test -r $SPL_OBJ/Module.symvers], [ + SPL_SYMBOLS=Module.symvers + ], [test -r $SPL_OBJ/Modules.symvers], [ + SPL_SYMBOLS=Modules.symvers + ], [test -r $SPL_OBJ/module/Module.symvers], [ + SPL_SYMBOLS=Module.symvers + ], [test -r $SPL_OBJ/module/Modules.symvers], [ + SPL_SYMBOLS=Modules.symvers + ]) + + AS_IF([test $SPL_SYMBOLS != NONE -o $timeout -le 0], [ + break; + ], [ + sleep 1 + timeout=$((timeout-1)) + ]) + done + + AS_IF([test "$SPL_SYMBOLS" = NONE], [ + SPL_SYMBOLS=$LINUX_SYMBOLS + ]) + + AC_MSG_RESULT([$SPL_SYMBOLS]) + AC_SUBST(SPL_SYMBOLS) ]) dnl # -- 1.8.3.1