Whamcloud - gitweb
LU-11845 zfs: put configure checks in version order
[fs/lustre-release.git] / config / lustre-build-zfs.m4
index 548753e..54d788f 100644 (file)
@@ -12,16 +12,21 @@ 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
 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,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.
@@ -67,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"], [
@@ -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,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"], [
@@ -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,27 @@ 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 -z "${zfsinc}"], [
                AS_IF([test -e "${zfssrc}/include/libzfs.h" && test -e "${zfssrc}/lib/libspl/include"], [
-                       zfslib="-I $zfssrc/lib/libspl/include -I $zfssrc/include"
+                       zfsinc="-I $zfssrc/lib/libspl/include -I $zfssrc/include"
+                       zfslib="-L$zfssrc/lib/libzfs/.libs/ -L$zfssrc/lib/libnvpair/.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=${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], [
@@ -371,6 +408,22 @@ your distribution.
                ])
        ])
 
+       dnl #
+       dnl # Define zfs source code version
+       dnl #
+       AS_IF([test x$enable_zfs = xyes], [
+               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])
+       ])
+
        AS_IF([test "x$enable_zfs" = xyes], [
                LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit],
                dsl_pool_config_enter, [
@@ -390,7 +443,277 @@ your distribution.
                        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 <sys/kmem.h>
+                       #include <sys/sa.h>
+               ],[
+                       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 <sys/spa.h>
+               ],[
+                       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 <sys/dmu.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/dmu.h>
+               ],[
+                       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 <sys/dmu_objset.h>
+               ],[
+                       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 <sys/spa.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/zap.h>
+                       #include <sys/dnode.h>
+               ],[
+                       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 <sys/dmu.h>
+               ],[
+                       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 <sys/fs/zfs.h>
+               ],[
+                       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 <sys/refcount.h>
+               ],[
+                       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 <sys/dmu_objset.h>
+               ],[
+                       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 <sys/dmu_objset.h>
+               ],[
+                       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])
 ])