Whamcloud - gitweb
LU-17662 osd-zfs: Support for ZFS 2.2.3 30/54530/9 master
authorShaun Tancheff <shaun.tancheff@hpe.com>
Mon, 6 May 2024 03:06:31 +0000 (10:06 +0700)
committerOleg Drokin <green@whamcloud.com>
Tue, 21 May 2024 18:49:10 +0000 (18:49 +0000)
ZFS commit zfs-2.2.99-269-g9b1677fb5
   dmu: Allow buffer fills to fail
Adds a boolean_t to dmu_buf_will_fill() and dmu_buf_fill_done()

Lustre always uses B_FALSE for this argument.

Also re-arrange and split some configure macros so we can all
the zfs and ldiskfs tests can be run in the same parallel pass.

Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: I71a4723bfa8ce62ae6f270e26ab149bf98278d3f
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54530
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
config/lustre-build-ldiskfs.m4
config/lustre-build-zfs.m4
config/lustre-build.m4
lustre/osd-zfs/osd_io.c

index 8cc9ade..731d00b 100644 (file)
@@ -622,8 +622,8 @@ AC_MSG_RESULT([$enable_ldiskfs])
 AM_CONDITIONAL([LDISKFS_ENABLED], [test x$enable_ldiskfs = xyes])
 ]) # LB_CONFIG_LDISKFS
 
-AS_IF([test x$enable_ldiskfs != xno],[
-       AC_DEFUN([LB_EXT4_SRC_DIR_SRC],[
+AC_DEFUN([LB_KABI_LDISKFS], [AS_IF([test x$enable_ldiskfs != xno],[
+       AC_DEFUN([LB_EXT4_LDISKFS_TESTS],[
                LB_SRC_EXT4_BREAD_4ARGS
                LB_SRC_EXT4_HAVE_INFO_DQUOT
                LB_SRC_EXT4_HAVE_I_CRYPT_INFO
@@ -635,7 +635,7 @@ AS_IF([test x$enable_ldiskfs != xno],[
                LB_SRC_JBD2_JOURNAL_GET_MAX_TXN_BUFS
                LB2_SRC_CHECK_CONFIG_IM([FS_ENCRYPTION])
        ])
-       AC_DEFUN([LB_EXT4_SRC_DIR_RESULTS], [
+       AC_DEFUN([LB_EXT4_LDISKFS_CHECKS], [
                LB_EXT4_BREAD_4ARGS
                LB_EXT4_HAVE_INFO_DQUOT
                LB_EXT4_HAVE_I_CRYPT_INFO
@@ -650,7 +650,7 @@ AS_IF([test x$enable_ldiskfs != xno],[
                        EXT4_CRYPTO='%/crypto.c'])
        ])
        AC_SUBST(EXT4_CRYPTO)
-])
+])])
 
 #
 # LB_VALIDATE_EXT4_SRC_DIR
@@ -696,12 +696,12 @@ and kernel-debuginfo-common-<arch> packages are installed.
 ]) # LB_VALIDATE_EXT4_SRC_DIR
 
 #
-# LB_EXT4_SRC_DIR
+# LB_EXT4_SOURCE_PATH
 #
 # Determine the location of the ext4 source code.  It it required
 # for several configure tests and to build ldiskfs.
 #
-AC_DEFUN([LB_EXT4_SRC_DIR], [
+AC_DEFUN([LB_EXT4_SOURCE_PATH], [
 AC_MSG_CHECKING([ext4 source directory])
 # Kernel ext source located with devel headers
 linux_src=$LINUX
@@ -729,7 +729,7 @@ AC_MSG_RESULT([$EXT4_SRC_DIR])
 AC_SUBST(EXT4_SRC_DIR)
 
 LB_VALIDATE_EXT4_SRC_DIR
-]) # LB_EXT4_SRC_DIR
+]) # LB_EXT4_SOURCE_PATH
 
 #
 # LB_DEFINE_E2FSPROGS_NAMES
index 2ac8907..05de097 100644 (file)
@@ -374,6 +374,95 @@ AC_DEFUN([LB_ZFS_USER], [
        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
 #
@@ -469,391 +558,6 @@ your distribution.
                        ])
                ])
        ])
-
-
-       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)
        ], [
@@ -862,3 +566,352 @@ your distribution.
        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])
+       ])
+])
index 9e56a96..737447a 100644 (file)
@@ -151,22 +151,36 @@ AC_ARG_ENABLE([modules],
                LC_TARGET_SUPPORTED([enable_modules="yes"],
                                    [enable_modules="no"])
        ])
-AC_MSG_RESULT([$enable_modules ($target_os)])
+       AC_MSG_RESULT([$enable_modules ($target_os)])
+       AS_IF([test "x$enable_modules" = xyes], [
+               AS_IF([test "x$FLEX" = "x"], [AC_MSG_ERROR(
+                       [flex package is required to build kernel modules])])
+               AS_IF([test "x$BISON" = "x"], [AC_MSG_ERROR(
+                       [bison package is required to build kernel modules])])
+       AS_CASE([$target_os], [linux*], [
+                       # Ensure SUBARCH is defined
+                       SUBARCH=$(echo $target_cpu | sed -e 's/powerpc.*/powerpc/' -e 's/ppc.*/powerpc/' -e 's/x86_64/x86/' -e 's/i.86/x86/' -e 's/k1om/x86/' -e 's/aarch64.*/arm64/' -e 's/armv7.*/arm/')
+                       LB_PROG_LINUX
+                       AS_IF([test "x$enable_server" != xno],
+                               [LB_EXT4_SOURCE_PATH])
+               ], [*], [
+                       # This is strange - Lustre supports a target we don't
+                       AC_MSG_ERROR([Modules are not supported on $target_os])
+       ])
+])
 
-AS_IF([test "x$enable_modules" = xyes], [
-       AS_IF([test "x$FLEX" = "x"], [AC_MSG_ERROR([flex package is required to build kernel modules])])
-       AS_IF([test "x$BISON" = "x"], [AC_MSG_ERROR([bison package is required to build kernel modules])])
+AC_DEFUN([LB_KABI_CHECKS], [
        AS_CASE([$target_os],
                [linux*], [
                        # Ensure SUBARCH is defined
                        SUBARCH=$(echo $target_cpu | sed -e 's/powerpc.*/powerpc/' -e 's/ppc.*/powerpc/' -e 's/x86_64/x86/' -e 's/i.86/x86/' -e 's/k1om/x86/' -e 's/aarch64.*/arm64/' -e 's/armv7.*/arm/')
 
                        # Run serial tests
-                       LB_PROG_LINUX
                        LIBCFS_PROG_LINUX
                        LN_PROG_LINUX
-                       AS_IF([test "x$enable_server" != xno], [LB_EXT4_SRC_DIR])
                        LC_PROG_LINUX
+                       AS_IF([test "x$enable_zfs" = xyes],
+                               [LZ_ZFS_KABI_SERIAL])
 
                        # Run 'early' checks. The results of these are used in
                        # other configure tests:
@@ -187,8 +201,11 @@ AS_IF([test "x$enable_modules" = xyes], [
                        LB_PROG_LINUX_SRC
                        LIBCFS_PROG_LINUX_SRC
                        LN_PROG_LINUX_SRC
-                       AS_IF([test "x$enable_server" != xno], [LB_EXT4_SRC_DIR_SRC])
+                       AS_IF([test "x$enable_server" != xno],
+                               [LB_EXT4_LDISKFS_TESTS])
                        LC_PROG_LINUX_SRC
+                       AS_IF([test "x$enable_zfs" = xyes],
+                               [LZ_KABI_ZFS_TESTS])
 
                        LB2_LINUX_TEST_COMPILE_ALL([lustre],
                                [for available lustre kapi interfaces])
@@ -197,8 +214,11 @@ AS_IF([test "x$enable_modules" = xyes], [
                        LB_PROG_LINUX_RESULTS
                        LIBCFS_PROG_LINUX_RESULTS
                        LN_PROG_LINUX_RESULTS
-                       AS_IF([test "x$enable_server" != xno], [LB_EXT4_SRC_DIR_RESULTS])
+                       AS_IF([test "x$enable_server" != xno],
+                               [LB_EXT4_LDISKFS_CHECKS])
                        LC_PROG_LINUX_RESULTS
+                       AS_IF([test "x$enable_zfs" = xyes],
+                               [LZ_KABI_ZFS_CHECKS])
 
                ], [*], [
                        # This is strange - Lustre supports a target we don't
@@ -439,6 +459,11 @@ LB_CONFIG_MODULES
 AS_IF([test x$enable_modules = xno], [enable_server=no])
 LB_CONFIG_LDISKFS
 LB_CONFIG_ZFS
+AS_IF([test "x$enable_dist" = xno], [
+       LB_KABI_LDISKFS
+       LZ_KABI_ZFS
+       LB_KABI_CHECKS
+])
 
 # If no backends were configured, and the user did not explicitly
 # require servers to be enabled, we just disable servers.
index 23e50ef..b71eca7 100644 (file)
@@ -301,7 +301,7 @@ static ssize_t osd_write_llog_header(struct osd_object *obj,
                bufoff = offset - db->db_offset;
                tocpy = MIN(db->db_size - bufoff, len);
                if (tocpy == db->db_size)
-                       dmu_buf_will_fill(db, oh->ot_tx);
+                       dmu_buf_will_fill(db, oh->ot_tx LL_BFILL);
                else
                        dmu_buf_will_dirty(db, oh->ot_tx);
                LASSERT(offset >= db->db_offset);
@@ -309,7 +309,7 @@ static ssize_t osd_write_llog_header(struct osd_object *obj,
                (void) memcpy((char *)db->db_data + bufoff, data, tocpy);
 
                if (tocpy == db->db_size)
-                       dmu_buf_fill_done(db, oh->ot_tx);
+                       dmu_buf_fill_done(db, oh->ot_tx LL_BFILL);
 
                offset += tocpy;
                data += tocpy;