X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=config%2Flustre-build-zfs.m4;h=80dfcfffe88574ec6540aabf7dbd333689d4b1d0;hp=dd14cc66ed656994b2f36ca62293fa209fc7bd98;hb=fe2300b2fb91cc321412a6e53335848741ea30cd;hpb=bc9eae65f0880e5ae781d373f843d2c76f263714 diff --git a/config/lustre-build-zfs.m4 b/config/lustre-build-zfs.m4 index dd14cc6..80dfcff 100644 --- a/config/lustre-build-zfs.m4 +++ b/config/lustre-build-zfs.m4 @@ -12,11 +12,11 @@ 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/ -dnl # * $LINUX +dnl # * ../zfs/ +dnl # * $LINUX/zfs dnl # dnl # --with-zfs-devel=path dnl # - User provided directory where zfs development headers @@ -42,11 +42,11 @@ 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/ -dnl # * $LINUX +dnl # * $LINUX/spl dnl # dnl # --with-spl=path - Enable spl support and use the spl headers in the dnl # provided path. No autodetection is performed. @@ -72,16 +72,16 @@ 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/" - splsrc4="$LINUX" + splsrc4="$LINUX/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"], [ @@ -105,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]]*/ 2> /dev/null | 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]" ]) @@ -147,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 @@ -159,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], [ @@ -178,16 +190,16 @@ 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/" - zfssrc4="$LINUX" + zfssrc4="$LINUX/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"], [ @@ -211,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]]*/ 2> /dev/null | 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]" ]) @@ -253,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 @@ -265,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], [ @@ -299,7 +323,7 @@ AC_DEFUN([LB_ZFS_USER], [ 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/" + zfslib="-L$zfssrc/lib/libzfs/.libs/ -L$zfssrc/lib/libnvpair/.libs" ], [test -d /usr/include/libzfs && test -d /usr/include/libspl], [ zfsinc="-I/usr/include/libspl -I /usr/include/libzfs" zfslib="" @@ -312,9 +336,11 @@ AC_DEFUN([LB_ZFS_USER], [ AC_MSG_RESULT([$zfsinc]) ZFS_LIBZFS_INCLUDE=${zfsinc} - ZFS_LIBZFS_LDFLAGS="-lzfs ${zfslib}" + ZFS_LIBZFS_LDFLAGS=${zfslib} + ZFS_LIBZFS_LIBS="-lzfs -lnvpair" AC_SUBST(ZFS_LIBZFS_INCLUDE) AC_SUBST(ZFS_LIBZFS_LDFLAGS) + AC_SUBST(ZFS_LIBZFS_LIBS) ]) AC_DEFUN([LB_CONFIG_ZFS], [ @@ -322,21 +348,26 @@ AC_DEFUN([LB_CONFIG_ZFS], [ [AS_HELP_STRING([--with-zfs=PATH], [Path to zfs source])], [ AS_IF([test x$withval = xno], [ + enable_spl=no enable_zfs=no require_zfs=no ], [test x$withval = xyes], [ + enable_spl=yes enable_zfs=yes require_zfs=yes ], [ + enable_spl=yes enable_zfs=yes require_zfs=yes zfssrc="$withval" ]) ], [ AS_IF([test x$enable_server != xno], [ + enable_spl=yes require_zfs=no enable_zfs=yes ], [ + enable_spl=no require_zfs=no enable_zfs=no ]) @@ -347,13 +378,35 @@ AC_DEFUN([LB_CONFIG_ZFS], [ AS_IF([test x$enable_zfs = xyes], [ AS_IF([test x$enable_modules = xyes], [ - LB_SPL LB_ZFS ]) LB_ZFS_DEVEL LB_ZFS_USER dnl # + dnl # Define zfs source code version + dnl # + ZFS_MAJOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\1/']) + ZFS_MINOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\2/']) + ZFS_PATCH=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\3/']) + ZFS_FIX=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\5/']) + AS_IF([test -z "$ZFS_FIX"], [ZFS_FIX="0"]) + + AC_DEFINE_UNQUOTED([ZFS_MAJOR], [$ZFS_MAJOR], [zfs major version]) + AC_DEFINE_UNQUOTED([ZFS_MINOR], [$ZFS_MINOR], [zfs minor version]) + AC_DEFINE_UNQUOTED([ZFS_PATCH], [$ZFS_PATCH], [zfs patch version]) + AC_DEFINE_UNQUOTED([ZFS_FIX], [$ZFS_FIX], [zfs fix version]) + + dnl # + dnl # SPL is only needed if ZFS is prior to 0.8.0 + dnl # + AS_IF([test x$enable_modules = xyes && test $ZFS_MAJOR -eq 0 && test $ZFS_MINOR -lt 8], [ + LB_SPL + ],[ + enable_spl=no + ]) + + dnl # dnl # enable_zfs will be set to no in LB_SPL or LB_ZFS if dnl # one of more of the build requirements is not met. dnl # @@ -382,6 +435,7 @@ your distribution. ]) ]) + AS_IF([test "x$enable_zfs" = xyes], [ LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit], dsl_pool_config_enter, [ @@ -426,7 +480,253 @@ your distribution. 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]) + ]) + + dnl # + dnl # ZFS 0.7.x extended dmu_prefetch() to take an additional + dnl # 'level' and 'priority' argument. Use a level of 0 and a + dnl # priority of ZIO_PRIORITY_SYNC_READ to replicate the + dnl # behavior of the four argument version. + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_prefetch' with 6 args], + dmu_prefetch, [ + #include + ],[ + objset_t *os = NULL; + uint64_t object = 0; + int64_t level = 0; + uint64_t offset = 0; + uint64_t len = 0; + enum zio_priority pri = ZIO_PRIORITY_SYNC_READ; + + dmu_prefetch(os, object, level, offset, len, pri); + ],[ + AC_DEFINE(HAVE_DMU_PREFETCH_6ARG, 1, + [Have 6 argument dmu_pretch in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.0 feature: SPA_FEATURE_USEROBJ_ACCOUNTING + dnl # + LB_CHECK_COMPILE([if ZFS has native dnode accounting supported], + dmu_objset_userobjused_enabled, [ + #include + ],[ + dmu_objset_userobjused_enabled(NULL); + ],[ + AC_DEFINE(HAVE_DMU_USEROBJ_ACCOUNTING, 1, + [Have native dnode accounting in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.0 feature: MULTIHOST + dnl # + LB_CHECK_COMPILE([if ZFS has multihost protection], + spa_multihost, [ + #include + ],[ + spa_multihost(NULL); + ],[ + AC_DEFINE(HAVE_ZFS_MULTIHOST, 1, + [Have multihost protection in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method zap_lookup_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'zap_lookup_by_dnode'], + zap_lookup_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + zap_lookup_by_dnode(dn, NULL, 1, 1, NULL); + ],[ + AC_DEFINE(HAVE_ZAP_LOOKUP_BY_DNODE, 1, + [Have zap_lookup_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method zap_add_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'zap_add_by_dnode'], + zap_add_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + zap_add_by_dnode(dn, NULL, 1, 1, NULL, NULL); + ],[ + AC_DEFINE(HAVE_ZAP_ADD_BY_DNODE, 1, + [Have zap_add_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method zap_remove_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'zap_remove_by_dnode'], + zap_remove_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + zap_remove_by_dnode(dn, NULL, NULL); + ],[ + AC_DEFINE(HAVE_ZAP_REMOVE_ADD_BY_DNODE, 1, + [Have zap_remove_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method dmu_tx_hold_zap_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_zap_by_dnode'], + dmu_tx_hold_zap_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + dmu_tx_hold_zap_by_dnode(NULL, dn, TRUE, NULL); + ],[ + AC_DEFINE(HAVE_DMU_TX_HOLD_ZAP_BY_DNODE, 1, + [Have dmu_tx_hold_zap_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method dmu_tx_hold_write_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_write_by_dnode'], + dmu_tx_hold_write_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + dmu_tx_hold_write_by_dnode(NULL, dn, 0, 0); + ],[ + AC_DEFINE(HAVE_DMU_TX_HOLD_WRITE_BY_DNODE, 1, + [Have dmu_tx_hold_write_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method dmu_write_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_write_by_dnode'], + dmu_write_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + dmu_write_by_dnode(dn, 0, 0, NULL, NULL); + ],[ + AC_DEFINE(HAVE_DMU_WRITE_BY_DNODE, 1, + [Have dmu_write_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.x adds new method dmu_read_by_dnode + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_read_by_dnode'], + dmu_read_by_dnode, [ + #include + #include + ],[ + dnode_t *dn = NULL; + dmu_read_by_dnode(dn, 0, 0, NULL, 0); + ],[ + AC_DEFINE(HAVE_DMU_READ_BY_DNODE, 1, + [Have dmu_read_by_dnode() in ZFS]) + ]) + dnl # + dnl # ZFS 0.7.2 adds new method dmu_tx_mark_netfree + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_tx_mark_netfree'], + dmu_tx_mark_netfree, [ + #include + ],[ + dmu_tx_t *tx = NULL; + dmu_tx_mark_netfree(tx); + ],[ + AC_DEFINE(HAVE_DMU_TX_MARK_NETFREE, 1, + [Have dmu_tx_mark_netfree]) + ]) + dnl # + dnl # ZFS 0.7.10 changes timestruc_t to inode_timespec_t + dnl # + LB_CHECK_COMPILE([if SPL has 'inode_timespec_t'], + zfs_have_inode_timespec, [ + #include + ],[ + inode_timespec_t now; + gethrestime(&now); + ],[ + AC_DEFINE(HAVE_ZFS_INODE_TIMESPEC, 1, + [Have inode_timespec_t]) + ]) + dnl # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of + dnl # refcount_add(). + dnl # + LB_CHECK_COMPILE([if ZFS has 'zfs_refcount_add'], + zfs_refcount_add, [ + #include + ],[ + zfs_refcount_add((zfs_refcount_t *) NULL, NULL); + ],[ + AC_DEFINE(HAVE_ZFS_REFCOUNT_ADD, 1, + [Have zfs_refcount_add]) + ]) + dnl # + dnl # ZFS 0.8.x changes dmu_objset_own for encryption + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_objset_own' with 6 args], + dmu_objset_own, [ + #include + ],[ + objset_t *os = NULL; + dmu_objset_type_t type = DMU_OST_ANY; + dmu_objset_own(NULL, type, B_FALSE, B_TRUE, FTAG, &os); + ],[ + AC_DEFINE(HAVE_DMU_OBJSET_OWN_6ARG, 1, + [Have dmu_objset_own() with 6 args]) + ]) + dnl # + dnl # ZFS 0.8.x changes dmu_objset_disown for encryption + dnl # + LB_CHECK_COMPILE([if ZFS has 'dmu_objset_disown' with 3 args], + dmu_objset_disown, [ + #include + ],[ + objset_t *os = NULL; + dmu_objset_disown(os, B_TRUE, FTAG); + ],[ + AC_DEFINE(HAVE_DMU_OBJSET_DISOWN_3ARG, 1, + [Have dmu_objset_disown() with 3 args]) + ]) ]) + AS_IF([test "x$enable_zfs" = xyes], [ + AC_SUBST(ENABLE_ZFS, yes) + ], [ + AC_SUBST(ENABLE_ZFS, no) + ]) AM_CONDITIONAL(ZFS_ENABLED, [test "x$enable_zfs" = xyes]) + AM_CONDITIONAL(SPL_ENABLED, [test "x$enable_spl" = xyes]) ])