X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=config%2Flustre-build-zfs.m4;h=3aa9314ab59b68b26323c3131edbbb4a0cce6186;hp=f200d01908a4656d077ebf73179733c451ac9721;hb=0a0f9f7dafefcb4b9e3c3fc6e9fd8ecd368e7c00;hpb=4dd31baae9a73502c5c7bb5c0962fd703e231fd5 diff --git a/config/lustre-build-zfs.m4 b/config/lustre-build-zfs.m4 index f200d01..3aa9314 100644 --- a/config/lustre-build-zfs.m4 +++ b/config/lustre-build-zfs.m4 @@ -12,7 +12,7 @@ dnl # --with-zfs=yes headers in one of the following places. Because zfs dnl # support was explicitly required if the headers cannot dnl # be located it is treated as a fatal error. dnl # -dnl # * /var/lib/dkms/zfs/${VERSION}/build +dnl # * /var/lib/dkms/zfs/${VERSION}/source dnl # * /usr/src/zfs-${VERSION}/${LINUXRELEASE} dnl # * /usr/src/zfs-${VERSION} dnl # * ../spl/ @@ -22,6 +22,11 @@ dnl # --with-zfs-devel=path dnl # - User provided directory where zfs development headers dnl # are located. This option is typically used when user dnl # uses rpm2cpio to unpack src rpm. +dnl # Assumes layout of: +dnl # ${zfs-devel-path}/usr/include/libzfs +dnl # ${zfs-devel-path}/usr/include/libspl +dnl # ${zfs-devel-path}/lib64/libzfs.so.* or +dnl # ${zfs-devel-path}/lib/libzfs.so.* dnl # dnl # --with-zfs=path - Enable zfs support and use the zfs headers in the dnl # provided path. No autodetection is performed and @@ -37,7 +42,7 @@ dnl # --with-spl=no dnl # dnl # --with-spl - Enable spl support and attempt to autodetect the spl dnl # --with-spl=yes headers in one of the following places in this order: -dnl # * /var/lib/dkms/spl/${VERSION}/build +dnl # * /var/lib/dkms/spl/${VERSION}/source dnl # * /usr/src/spl-${VERSION}/${LINUXRELEASE} dnl # * /usr/src/spl-${VERSION} dnl # * ../spl/ @@ -67,7 +72,7 @@ AC_DEFUN([LB_SPL], [ dnl # source directory. In order of preference: dnl # splver=$(ls -1 /usr/src/ | grep -m1 spl | cut -f2 -d'-') - splsrc0="/var/lib/dkms/spl/${splver}/build" + spldkms="/var/lib/dkms/spl/${splver}" splsrc1="/usr/src/spl-${splver}/${LINUXRELEASE}" splsrc2="/usr/src/spl-${splver}" splsrc3="../spl/" @@ -75,8 +80,8 @@ AC_DEFUN([LB_SPL], [ AC_MSG_CHECKING([spl source directory]) AS_IF([test -z "${splsrc}"], [ - AS_IF([test -e "${splsrc0}/spl.release.in"], [ - splsrc=${splsrc0} + AS_IF([test -e "${spldkms}/source/spl.release.in"], [ + splsrc=${spldkms}/source ], [test -e "${splsrc1}/spl.release.in"], [ splsrc=${splsrc1} ], [test -e "${splsrc2}/spl.release.in"], [ @@ -100,14 +105,25 @@ AC_DEFUN([LB_SPL], [ dnl # The existence of the spl_config.h is used to identify a valid dnl # spl object directory. In many cases the object and source dnl # directory are the same, however the objects may also reside - dnl # is a subdirectory named after the kernel version. + dnl # is a subdirectory named after the kernel version. When + dnl # weak modules are used, the kernel version may not be the + dnl # same as the LINUXRELEASE against which we are building lustre. dnl # AC_MSG_CHECKING([spl build directory]) AS_IF([test -z "$splobj"], [ - AS_IF([test -e "${splsrc}/${LINUXRELEASE}/spl_config.h"], [ + last_spl_obj_dir=$(ls -d ${splsrc}/[[0-9]]*/ | tail -n 1 | sed 's|/$||') + AS_IF([test "${splsrc}" = "${spldkms}/source"], [ + AS_IF([test -e "${spldkms}/${LINUXRELEASE}/${target_cpu}/spl_config.h"], [ + splobj=${spldkms}/${LINUXRELEASE}/${target_cpu} + ], [ + splobj="[Not found]" + ]) + ],[test -e "${splsrc}/${LINUXRELEASE}/spl_config.h"], [ splobj="${splsrc}/${LINUXRELEASE}" ], [test -e "${splsrc}/spl_config.h"], [ splobj="${splsrc}" + ], [test -e "${last_spl_obj_dir}/spl_config.h"], [ + splobj="${last_spl_obj_dir}" ], [ splobj="[Not found]" ]) @@ -142,8 +158,10 @@ AC_DEFUN([LB_SPL], [ AC_MSG_CHECKING([spl file name for module symbols]) AS_IF([test -r $splobj/$SYMVERFILE], [ splsym=$SYMVERFILE + EXTRA_SYMBOLS="$EXTRA_SYMBOLS $splobj/$SYMVERFILE" ], [test -r $splobj/module/$SYMVERFILE], [ splsym=$SYMVERFILE + EXTRA_SYMBOLS="$EXTRA_SYMBOLS $splobj/module/$SYMVERFILE" ], [ splsym="[Not found]" enable_zfs=no @@ -154,12 +172,11 @@ AC_DEFUN([LB_SPL], [ SPL=${splsrc} SPL_OBJ=${splobj} SPL_VERSION=${splver} - SPL_SYMBOLS=${splsym} AC_SUBST(SPL) AC_SUBST(SPL_OBJ) AC_SUBST(SPL_VERSION) - AC_SUBST(SPL_SYMBOLS) + AC_SUBST(EXTRA_SYMBOLS) ]) AC_DEFUN([LB_ZFS], [ @@ -173,7 +190,7 @@ AC_DEFUN([LB_ZFS], [ dnl # source directory. In order of preference: dnl # zfsver=$(ls -1 /usr/src/ | grep -m1 zfs | cut -f2 -d'-') - zfssrc0="/var/lib/dkms/zfs/${zfsver}/build" + zfsdkms="/var/lib/dkms/zfs/${zfsver}" zfssrc1="/usr/src/zfs-${zfsver}/${LINUXRELEASE}" zfssrc2="/usr/src/zfs-${zfsver}" zfssrc3="../zfs/" @@ -181,8 +198,8 @@ AC_DEFUN([LB_ZFS], [ AC_MSG_CHECKING([zfs source directory]) AS_IF([test -z "${zfssrc}"], [ - AS_IF([test -e "${zfssrc0}/zfs.release.in"], [ - zfssrc=${zfssrc0} + AS_IF([test -e "${zfsdkms}/source/zfs.release.in"], [ + zfssrc=${zfsdkms}/source ], [test -e "${zfssrc1}/zfs.release.in"], [ zfssrc=${zfssrc1} ], [test -e "${zfssrc2}/zfs.release.in"], [ @@ -206,14 +223,25 @@ AC_DEFUN([LB_ZFS], [ dnl # The existence of the zfs_config.h is used to identify a valid dnl # zfs object directory. In many cases the object and source dnl # directory are the same, however the objects may also reside - dnl # is a subdirectory named after the kernel version. + dnl # is a subdirectory named after the kernel version. When + dnl # weak modules are used, the kernel version may not be the + dnl # same as the LINUXRELEASE against which we are building lustre. dnl # AC_MSG_CHECKING([zfs build directory]) AS_IF([test -z "$zfsobj"], [ - AS_IF([test -e "${zfssrc}/${LINUXRELEASE}/zfs_config.h"], [ + last_zfs_obj_dir=$(ls -d ${zfssrc}/[[0-9]]*/ | tail -n 1 | sed 's|/$||') + AS_IF([test "${zfssrc}" = "${zfsdkms}/source"], [ + AS_IF([test -e "${zfsdkms}/${LINUXRELEASE}/${target_cpu}/zfs_config.h"], [ + zfsobj=${zfsdkms}/${LINUXRELEASE}/${target_cpu} + ], [ + zfsobj="[Not found]" + ]) + ], [test -e "${zfssrc}/${LINUXRELEASE}/zfs_config.h"], [ zfsobj="${zfssrc}/${LINUXRELEASE}" ], [test -e "${zfssrc}/zfs_config.h"], [ zfsobj="${zfssrc}" + ], [test -e "${last_zfs_obj_dir}/zfs_config.h"], [ + zfsobj="${last_zfs_obj_dir}" ], [ zfsobj="[Not found]" ]) @@ -248,8 +276,10 @@ AC_DEFUN([LB_ZFS], [ AC_MSG_CHECKING([zfs file name for module symbols]) AS_IF([test -r $zfsobj/$SYMVERFILE], [ zfssym=$SYMVERFILE + EXTRA_SYMBOLS="$EXTRA_SYMBOLS $zfsobj/$SYMVERFILE" ], [test -r $zfsobj/module/$SYMVERFILE], [ zfssym=$SYMVERFILE + EXTRA_SYMBOLS="$EXTRA_SYMBOLS $zfsobj/module/$SYMVERFILE" ], [ zfssym="[Not found]" enable_zfs=no @@ -260,12 +290,11 @@ AC_DEFUN([LB_ZFS], [ ZFS=${zfssrc} ZFS_OBJ=${zfsobj} ZFS_VERSION=${zfsver} - ZFS_SYMBOLS=${zfssym} AC_SUBST(ZFS) AC_SUBST(ZFS_OBJ) AC_SUBST(ZFS_VERSION) - AC_SUBST(ZFS_SYMBOLS) + AC_SUBST(EXTRA_SYMBOLS) ]) AC_DEFUN([LB_ZFS_DEVEL], [ @@ -277,12 +306,13 @@ AC_DEFUN([LB_ZFS_DEVEL], [ AC_MSG_CHECKING([user provided zfs devel headers]) AS_IF([test ! -z "${zfsdevel}"], [ AS_IF([test -d "${zfsdevel}/usr/include/libspl" && test -d "${zfsdevel}/usr/include/libzfs"], [ - zfslib="-I $zfsdevel/usr/include/libspl -I $zfsdevel/usr/include/libzfs" + zfsinc="-I $zfsdevel/usr/include/libspl -I $zfsdevel/usr/include/libzfs" + zfslib="-L$zfsdevel/usr/lib64 -L$zfsdevel/usr/lib -L$zfsdevel/lib64 -L$zfsdevel/lib" ], [ AC_MSG_ERROR([Path to development headers directory does not exist]) ]) ]) - AC_MSG_RESULT([$zfslib]) + AC_MSG_RESULT([$zfsinc]) ]) AC_DEFUN([LB_ZFS_USER], [ @@ -290,20 +320,25 @@ AC_DEFUN([LB_ZFS_USER], [ dnl # Detect user space zfs development headers. dnl # AC_MSG_CHECKING([zfs devel headers]) - AS_IF([test -z "${zfslib}"], [ - AS_IF([test -e $zfssrc/include/libzfs.h && test -e $zfssrc/lib/libspl/include], [ - zfslib="-I $zfssrc/lib/libspl/include -I $zfssrc/include" + AS_IF([test -z "${zfsinc}"], [ + AS_IF([test -e "${zfssrc}/include/libzfs.h" && test -e "${zfssrc}/lib/libspl/include"], [ + zfsinc="-I $zfssrc/lib/libspl/include -I $zfssrc/include" + zfslib="-L$zfssrc/lib/libzfs/.libs/" ], [test -d /usr/include/libzfs && test -d /usr/include/libspl], [ - zfslib="-I /usr/include/libspl -I /usr/include/libzfs" + zfsinc="-I/usr/include/libspl -I /usr/include/libzfs" + zfslib="" ], [ - zfslib="[Not Found]" + zfsinc="[Not Found]" + zfslib="" enable_zfs=no ]) ]) - AC_MSG_RESULT([$zfslib]) + AC_MSG_RESULT([$zfsinc]) - ZFS_LIBZFS_INCLUDE=${zfslib} + ZFS_LIBZFS_INCLUDE=${zfsinc} + ZFS_LIBZFS_LDFLAGS="-lzfs ${zfslib}" AC_SUBST(ZFS_LIBZFS_INCLUDE) + AC_SUBST(ZFS_LIBZFS_LDFLAGS) ]) AC_DEFUN([LB_CONFIG_ZFS], [ @@ -371,5 +406,80 @@ your distribution. ]) ]) - AM_CONDITIONAL(ZFS_ENABLED, test x$enable_zfs = xyes) + AS_IF([test "x$enable_zfs" = xyes], [ + LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit], + dsl_pool_config_enter, [ + #include + ],[ + dsl_pool_config_enter(NULL, FTAG); + ],[ + AC_DEFINE(HAVE_DSL_POOL_CONFIG, 1, + [Have dsl_pool_config_enter/exit in ZFS]) + ]) + LB_CHECK_COMPILE([if zfs defines dsl_sync_task_do_nowait], + dsl_sync_task_do_nowait, [ + #include + ],[ + dsl_sync_task_do_nowait(NULL, NULL, NULL, NULL, NULL, 0, NULL); + ],[ + AC_DEFINE(HAVE_DSL_SYNC_TASK_DO_NOWAIT, 1, + [Have dsl_sync_task_do_nowait in ZFS]) + ]) + LB_CHECK_COMPILE([if zfs defines sa_spill_alloc], + sa_spill_alloc, [ + #include + #include + ],[ + void *ptr; + + ptr = sa_spill_alloc(KM_SLEEP); + sa_spill_free(ptr); + ],[ + AC_DEFINE(HAVE_SA_SPILL_ALLOC, 1, + [Have sa_spill_alloc in ZFS]) + ]) + LB_CHECK_COMPILE([if zfs defines spa_maxblocksize], + spa_maxblocksize, [ + #include + ],[ + spa_t *spa = NULL; + int size; + + size = spa_maxblocksize(spa); + ],[ + AC_DEFINE(HAVE_SPA_MAXBLOCKSIZE, 1, + [Have spa_maxblocksize in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds support for large dnodes. This + dnl # allows Lustre to optionally specify the size of a + dnl # dnode which ZFS will then use to store metadata such + dnl # as xattrs. The default dnode size specified by the + dnl # 'dnodesize' dataset property will be used unless a + dnl # specific value is provided. + dnl # + LB_CHECK_COMPILE([if zfs defines dmu_object_alloc_dnsize], + dmu_object_alloc_dnsize, [ + #include + #include + ],[ + objset_t *os = NULL; + dmu_object_type_t objtype = DMU_OT_NONE; + int blocksize = 0; + dmu_object_type_t bonustype = DMU_OT_SA; + int dnodesize = DNODE_MIN_SIZE; + dmu_tx_t *tx = NULL; + uint64_t id; + + id = dmu_object_alloc_dnsize(os, objtype, blocksize, + bonustype, + DN_BONUS_SIZE(dnodesize), + dnodesize, tx); + ],[ + AC_DEFINE(HAVE_DMU_OBJECT_ALLOC_DNSIZE, 1, + [Have dmu_object_alloc_dnsize in ZFS]) + ]) + ]) + + AM_CONDITIONAL(ZFS_ENABLED, [test "x$enable_zfs" = xyes]) ])