AC_SUBST(ZFS_LIBZFS_LIBS)
]) # LB_ZFS_USER
+AC_DEFUN([LZ_KABI_ZFS], [
+ #
+ ## LZ_ZFS_NVLIST_CONST_INTERFACES
+ #
+ # ZFS 2.2.0 nvpair now returns and expects constant args
+ #
+ AC_DEFUN([LZ_SRC_ZFS_NVLIST_CONST_INTERFACES], [
+ LB2_LINUX_TEST_SRC([zfs_nvpair_const], [
+ #include <sys/nvpair.h>
+ ],[
+ nvpair_t *nvp = NULL;
+ nvlist_t *nvl = NULL;
+ const char *name = nvpair_name(nvp);
+ nvlist_lookup_string(nvl, name, &name);
+ nvlist_lookup_nvlist(nvl, name, &nvl);
+ ],[-Werror],[],[])
+ ])
+ AC_DEFUN([LZ_ZFS_NVLIST_CONST_INTERFACES], [
+ LB2_MSG_LINUX_TEST_RESULT([if ZFS nvlist interfaces require const],
+ [zfs_nvpair_const], [
+ AC_DEFINE(HAVE_ZFS_NVLIST_CONST_INTERFACES, 1,
+ [ZFS nvlist interfaces require const])
+ ])
+ ]) # LZ_ZFS_NVLIST_CONST_INTERFACES
+
+ #
+ ## LZ_ZFS_ARC_PRUNE_FUNC_UINT64
+ #
+ # ZFS 2.2.1 arc_prune_func_t now uses uint64_t for the
+ # first parameter
+ #
+ AC_DEFUN([LZ_SRC_ZFS_ARC_PRUNE_FUNC_UINT64], [
+ LB2_LINUX_TEST_SRC([zfs_arc_prune_func_uint64], [
+ #include <sys/arc.h>
+ ],[
+ void arc_prune_func(uint64_t bytes, void *priv) {}
+ arc_prune_t *arc_p __attribute__ ((unused)) =
+ arc_add_prune_callback(arc_prune_func, NULL);
+ ],[-Werror],[],[])
+ ])
+ AC_DEFUN([LZ_ZFS_ARC_PRUNE_FUNC_UINT64], [
+ LB2_MSG_LINUX_TEST_RESULT([if ZFS arc_prune_func_t uses uint64_t],
+ [zfs_arc_prune_func_uint64], [
+ AC_DEFINE(HAVE_ZFS_ARC_PRUNE_FUNC_UINT64, 1,
+ [ZFS arc_prune_func_t uses uint64_t])
+ ])
+ ]) # LZ_ZFS_ARC_PRUNE_FUNC_UINT64
+
+ #
+ ## LZ_DMU_BUF_WILL_FILL_3ARGS
+ #
+ # ZFS 2.2.3:
+ # Adds a boolean_t to dmu_buf_will_fill() and dmu_buf_fill_done()
+ #
+ # introduced in zfs commit 9b1677fb5a0824b5f4b425c0ee950aaecf252029
+ # dmu: Allow buffer fills to fail
+ #
+ AC_DEFUN([LZ_SRC_DMU_BUF_WILL_FILL_3ARGS], [
+ LB2_LINUX_TEST_SRC([dmu_buf_will_fill_3args], [
+ #include <sys/dbuf.h>
+ ],[
+ dmu_buf_t *db = NULL;
+ dmu_tx_t *tx = NULL;
+ dmu_buf_will_fill(db, tx, B_TRUE);
+ ],[-Werror],[],[])
+ ])
+ AC_DEFUN([LZ_DMU_BUF_WILL_FILL_3ARGS], [
+ LB2_MSG_LINUX_TEST_RESULT([if dmu_buf_will_fill() has 3 args],
+ [dmu_buf_will_fill_3args], [
+ AC_DEFINE(HAVE_DMU_BUF_WILL_FILL_3ARGS, 1,
+ [dmu_buf_will_fill() has 3 args])
+ AC_DEFINE(LL_BFILL, [, B_FALSE], [buf bool arg])
+ ],[
+ AC_DEFINE(LL_BFILL, [], [buf bool arg])
+ ])
+ ]) # LZ_DMU_BUF_WILL_FILL_3ARGS
+
+ AC_DEFUN([LZ_KABI_ZFS_TESTS], [
+ LZ_SRC_ZFS_NVLIST_CONST_INTERFACES
+ LZ_SRC_ZFS_ARC_PRUNE_FUNC_UINT64
+ LZ_SRC_DMU_BUF_WILL_FILL_3ARGS
+ ])
+ AC_DEFUN([LZ_KABI_ZFS_CHECKS], [
+ LZ_ZFS_NVLIST_CONST_INTERFACES
+ LZ_ZFS_ARC_PRUNE_FUNC_UINT64
+ LZ_DMU_BUF_WILL_FILL_3ARGS
+ ])
+])
+
#
# LB_CONFIG_ZFS
#
])
])
])
-
-
- AS_IF([test "x$enable_zfs" = xyes], [
- LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit],
- dsl_pool_config_enter, [
- #include <sys/dsl_pool.h>
- ],[
- dsl_pool_config_enter(NULL, FTAG);
- ],[
- AC_DEFINE(HAVE_DSL_POOL_CONFIG, 1,
- [Have dsl_pool_config_enter/exit in ZFS])
- ],[
- AC_MSG_ERROR([dsl_pool_config_enter/exit do not exist])
- ])
- LB_CHECK_COMPILE([if zfs defines zio_buf_alloc/free],
- zio_buf_alloc, [
- #include <sys/zio.h>
- ],[
- void *ptr = zio_buf_alloc(1024);
-
- (void)ptr;
- ],[
- AC_DEFINE(HAVE_ZIO_BUF_ALLOC, 1,
- [Have zio_buf_alloc/free in ZFS])
- ],[
- AC_MSG_ERROR([zio_buf_alloc/free do not exist])
- ])
- LB_CHECK_COMPILE([if zfs defines spa_maxblocksize],
- spa_maxblocksize, [
- #include <sys/spa.h>
- ],[
- spa_t *spa = NULL;
- int size = spa_maxblocksize(spa);
-
- (void)size;
- ],[
- AC_DEFINE(HAVE_SPA_MAXBLOCKSIZE, 1,
- [Have spa_maxblocksize in ZFS])
- ],[
- AC_MSG_ERROR([spa_maxblocksize does not exist])
- ])
-
- #
- # ZFS 0.7.x adds support for large dnodes. This
- # allows Lustre to optionally specify the size of a
- # dnode which ZFS will then use to store metadata such
- # as xattrs. The default dnode size specified by the
- # 'dnodesize' dataset property will be used unless a
- # specific value is provided.
- #
- 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])
- ],[
- AC_MSG_ERROR([dmu_object_alloc_dnsize does not exist])
- ])
-
- #
- # ZFS 0.7.x extended dmu_prefetch() to take an additional
- # 'level' and 'priority' argument. Use a level of 0 and a
- # priority of ZIO_PRIORITY_SYNC_READ to replicate the
- # behavior of the four argument version.
- #
- 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])
- ],[
- AC_MSG_ERROR([6 argument dmu_pretch does not exist])
- ])
- #
- # ZFS 0.7.0 feature: SPA_FEATURE_USEROBJ_ACCOUNTING
- #
- 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])
- ],[
- AC_MSG_ERROR([native dnode accounting does not exist])
- ])
- #
- # ZFS 0.7.0 feature: MULTIHOST
- #
- LB_CHECK_COMPILE([if ZFS has multihost protection],
- spa_multihost, [
- #include <sys/fs/zfs.h>
- ],[
- zpool_prop_t prop = ZPOOL_PROP_MULTIHOST;
-
- (void)prop;
- ],[
- AC_DEFINE(HAVE_ZFS_MULTIHOST, 1,
- [Have multihost protection in ZFS])
- ],[
- AC_MSG_ERROR([multihost protection does not exist])
- ])
- #
- # ZFS 0.7.x adds new method zap_lookup_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([zap_lookup_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.x adds new method zap_add_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([zap_add_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.x adds new method zap_remove_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([zap_remove_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.x adds new method dmu_tx_hold_zap_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([dmu_tx_hold_zap_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.x adds new method dmu_tx_hold_write_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([dmu_tx_hold_write_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.x adds new method dmu_write_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([dmu_write_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.x adds new method dmu_read_by_dnode
- #
- 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])
- ],[
- AC_MSG_ERROR([dmu_read_by_dnode does not exist])
- ])
- #
- # ZFS 0.7.2 adds new method dmu_tx_mark_netfree
- #
- 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])
- ])
- #
- # ZFS 0.7.10 changes timestruc_t to inode_timespec_t
- #
- 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])
- ])
- # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of
- # refcount_add(). ZFS 2.0 renamed sys/refcount.h to
- # sys/zfs_refcount.h, rather the add another check to
- # determine the correct header name include it
- # indirectly through sys/dnode.h.
- #
- LB_CHECK_COMPILE([if ZFS has 'zfs_refcount_add'],
- zfs_refcount_add, [
- #include <sys/dnode.h>
- ],[
- zfs_refcount_add((zfs_refcount_t *) NULL, NULL);
- ],[
- AC_DEFINE(HAVE_ZFS_REFCOUNT_ADD, 1,
- [Have zfs_refcount_add])
- ])
- #
- # ZFS 0.8.x changes dmu_objset_own for encryption
- #
- 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])
- ])
- #
- # ZFS 0.8.x changes dmu_objset_disown for encryption
- #
- 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])
- ])
- #
- # ZFS exports dmu_offet_next
- #
- AC_CACHE_CHECK([if ZFS exports 'dmu_offset_next'],
- [lb_cv_dmu_offset_next], [
- lb_cv_dmu_offset_next="no"
- AS_IF([grep -q -E "EXPORT_SYMBOL.*\(dmu_offset_next\)" "$zfssrc/module/zfs/dmu.c" 2>/dev/null],
- [lb_cv_dmu_offset_next="yes"])
- ])
- AS_IF([test "x$lb_cv_dmu_offset_next" = "xyes"], [
- AC_DEFINE(HAVE_DMU_OFFSET_NEXT, 1,
- [Have dmu_offset_next() exported])
- ])
- #
- # ZFS 2.0 replaced .db_last_dirty / .dr_next with a list_t
- # and list_node_t named .db_dirty_records / .dr_dbuf_node.
- #
- LB_CHECK_COMPILE([if ZFS has 'db_dirty_records' list_t],
- db_dirty_records, [
- #include <sys/dbuf.h>
- ],[
- dmu_buf_impl_t db;
- dbuf_dirty_record_t *dr;
- dr = list_head(&db.db_dirty_records);
- ],[
- AC_DEFINE(HAVE_DB_DIRTY_RECORDS_LIST, 1,
- [Have db_dirty_records list_t])
- ])
- #
- # ZFS 2.0 renamed sys/refcount.h to zfs_refcount.h
- # This build issue shows up with ZFS 2.0.7 and Lustre 2.12 LTS
- #
- LB_CHECK_COMPILE([if ZFS renamed sys/refcount to zfs_refcount.h],
- zfs_zfs_refcount, [
- #include <sys/zfs_refcount.h>
- ],[
- zfs_refcount_add((zfs_refcount_t *) NULL, NULL);
- ],[
- AC_DEFINE(HAVE_ZFS_REFCOUNT_HEADER, 1,
- [Have zfs_refcount.h])
- ])
- old_EXTRA_KCFLAGS=$EXTRA_KCFLAGS
- EXTRA_KCFLAGS+=" -Werror"
- dnl #
- dnl # ZFS 2.2.0 nvpair now returns and expects constant args
- dnl #
- LB_CHECK_COMPILE([if ZFS nvlist interfaces require const],
- zfs_nvpair_const, [
- #include <sys/nvpair.h>
- ], [
- nvpair_t *nvp = NULL;
- nvlist_t *nvl = NULL;
- const char *name = nvpair_name(nvp);
- nvlist_lookup_string(nvl, name, &name);
- nvlist_lookup_nvlist(nvl, name, &nvl);
- ], [
- AC_DEFINE(HAVE_ZFS_NVLIST_CONST_INTERFACES, 1,
- [ZFS nvlist interfaces require const])
- ])
- dnl #
- dnl # ZFS 2.2.1 arc_prune_func_t now uses uint64_t for the
- dnl # first parameter
- dnl #
- LB_CHECK_COMPILE([if ZFS arc_prune_func_t uses uint64_t],
- zfs_arc_prune_func_uint64, [
- #include <sys/arc.h>
- ], [
- void arc_prune_func(uint64_t bytes, void *priv) {}
- arc_prune_t *arc_p __attribute__ ((unused)) =
- arc_add_prune_callback(arc_prune_func, NULL);
- ], [
- AC_DEFINE(HAVE_ZFS_ARC_PRUNE_FUNC_UINT64, 1,
- [ZFS arc_prune_func_t uses uint64_t])
- ])
- EXTRA_KCFLAGS=$old_EXTRA_KCFLAGS
- ])
-
AS_IF([test "x$enable_zfs" = xyes], [
AC_SUBST(ENABLE_ZFS, yes)
], [
AM_CONDITIONAL(ZFS_ENABLED, [test "x$enable_zfs" = xyes])
AM_CONDITIONAL(SPL_ENABLED, [test "x$enable_spl" = xyes])
]) # LB_CONFIG_ZFS
+
+AC_DEFUN([LZ_ZFS_KABI_SERIAL], [
+ LB_CHECK_COMPILE([if zfs defines dsl_pool_config_enter/exit],
+ dsl_pool_config_enter, [
+ #include <sys/dsl_pool.h>
+ ],[
+ dsl_pool_config_enter(NULL, FTAG);
+ ],[
+ AC_DEFINE(HAVE_DSL_POOL_CONFIG, 1,
+ [Have dsl_pool_config_enter/exit in ZFS])
+ ],[
+ AC_MSG_ERROR([dsl_pool_config_enter/exit do not exist])
+ ])
+ LB_CHECK_COMPILE([if zfs defines zio_buf_alloc/free],
+ zio_buf_alloc, [
+ #include <sys/zio.h>
+ ],[
+ void *ptr = zio_buf_alloc(1024);
+
+ (void)ptr;
+ ],[
+ AC_DEFINE(HAVE_ZIO_BUF_ALLOC, 1,
+ [Have zio_buf_alloc/free in ZFS])
+ ],[
+ AC_MSG_ERROR([zio_buf_alloc/free do not exist])
+ ])
+ LB_CHECK_COMPILE([if zfs defines spa_maxblocksize],
+ spa_maxblocksize, [
+ #include <sys/spa.h>
+ ],[
+ spa_t *spa = NULL;
+ int size = spa_maxblocksize(spa);
+
+ (void)size;
+ ],[
+ AC_DEFINE(HAVE_SPA_MAXBLOCKSIZE, 1,
+ [Have spa_maxblocksize in ZFS])
+ ],[
+ AC_MSG_ERROR([spa_maxblocksize does not exist])
+ ])
+
+ #
+ # ZFS 0.7.x adds support for large dnodes. This
+ # allows Lustre to optionally specify the size of a
+ # dnode which ZFS will then use to store metadata such
+ # as xattrs. The default dnode size specified by the
+ # 'dnodesize' dataset property will be used unless a
+ # specific value is provided.
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([dmu_object_alloc_dnsize does not exist])
+ ])
+
+ #
+ # ZFS 0.7.x extended dmu_prefetch() to take an additional
+ # 'level' and 'priority' argument. Use a level of 0 and a
+ # priority of ZIO_PRIORITY_SYNC_READ to replicate the
+ # behavior of the four argument version.
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([6 argument dmu_pretch does not exist])
+ ])
+ #
+ # ZFS 0.7.0 feature: SPA_FEATURE_USEROBJ_ACCOUNTING
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([native dnode accounting does not exist])
+ ])
+ #
+ # ZFS 0.7.0 feature: MULTIHOST
+ #
+ LB_CHECK_COMPILE([if ZFS has multihost protection],
+ spa_multihost, [
+ #include <sys/fs/zfs.h>
+ ],[
+ zpool_prop_t prop = ZPOOL_PROP_MULTIHOST;
+
+ (void)prop;
+ ],[
+ AC_DEFINE(HAVE_ZFS_MULTIHOST, 1,
+ [Have multihost protection in ZFS])
+ ],[
+ AC_MSG_ERROR([multihost protection does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method zap_lookup_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([zap_lookup_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method zap_add_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([zap_add_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method zap_remove_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([zap_remove_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method dmu_tx_hold_zap_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([dmu_tx_hold_zap_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method dmu_tx_hold_write_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([dmu_tx_hold_write_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method dmu_write_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([dmu_write_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.x adds new method dmu_read_by_dnode
+ #
+ 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])
+ ],[
+ AC_MSG_ERROR([dmu_read_by_dnode does not exist])
+ ])
+ #
+ # ZFS 0.7.2 adds new method dmu_tx_mark_netfree
+ #
+ 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])
+ ])
+ #
+ # ZFS 0.7.10 changes timestruc_t to inode_timespec_t
+ #
+ 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])
+ ])
+ # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of
+ # refcount_add(). ZFS 2.0 renamed sys/refcount.h to
+ # sys/zfs_refcount.h, rather the add another check to
+ # determine the correct header name include it
+ # indirectly through sys/dnode.h.
+ #
+ LB_CHECK_COMPILE([if ZFS has 'zfs_refcount_add'],
+ zfs_refcount_add, [
+ #include <sys/dnode.h>
+ ],[
+ zfs_refcount_add((zfs_refcount_t *) NULL, NULL);
+ ],[
+ AC_DEFINE(HAVE_ZFS_REFCOUNT_ADD, 1,
+ [Have zfs_refcount_add])
+ ])
+ #
+ # ZFS 0.8.x changes dmu_objset_own for encryption
+ #
+ 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])
+ ])
+ #
+ # ZFS 0.8.x changes dmu_objset_disown for encryption
+ #
+ 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])
+ ])
+ #
+ # ZFS exports dmu_offet_next
+ #
+ AC_CACHE_CHECK([if ZFS exports 'dmu_offset_next'],
+ [lb_cv_dmu_offset_next], [
+ lb_cv_dmu_offset_next="no"
+ AS_IF([grep -q -E "EXPORT_SYMBOL.*\(dmu_offset_next\)" "$zfssrc/module/zfs/dmu.c" 2>/dev/null],
+ [lb_cv_dmu_offset_next="yes"])
+ ])
+ AS_IF([test "x$lb_cv_dmu_offset_next" = "xyes"], [
+ AC_DEFINE(HAVE_DMU_OFFSET_NEXT, 1,
+ [Have dmu_offset_next() exported])
+ ])
+ #
+ # ZFS 2.0 replaced .db_last_dirty / .dr_next with a list_t
+ # and list_node_t named .db_dirty_records / .dr_dbuf_node.
+ #
+ LB_CHECK_COMPILE([if ZFS has 'db_dirty_records' list_t],
+ db_dirty_records, [
+ #include <sys/dbuf.h>
+ ],[
+ dmu_buf_impl_t db;
+ dbuf_dirty_record_t *dr;
+ dr = list_head(&db.db_dirty_records);
+ ],[
+ AC_DEFINE(HAVE_DB_DIRTY_RECORDS_LIST, 1,
+ [Have db_dirty_records list_t])
+ ])
+ #
+ # ZFS 2.0 renamed sys/refcount.h to zfs_refcount.h
+ # This build issue shows up with ZFS 2.0.7 and Lustre 2.12 LTS
+ #
+ LB_CHECK_COMPILE([if ZFS renamed sys/refcount to zfs_refcount.h],
+ zfs_zfs_refcount, [
+ #include <sys/zfs_refcount.h>
+ ],[
+ zfs_refcount_add((zfs_refcount_t *) NULL, NULL);
+ ],[
+ AC_DEFINE(HAVE_ZFS_REFCOUNT_HEADER, 1,
+ [Have zfs_refcount.h])
+ ])
+])