From a13fc434c57fd72e5f8908a8a197fca1a0d373e5 Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Mon, 6 May 2024 10:06:31 +0700 Subject: [PATCH] LU-17662 osd-zfs: Support for ZFS 2.2.3 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 Change-Id: I71a4723bfa8ce62ae6f270e26ab149bf98278d3f Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54530 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Brian Atkinson Reviewed-by: Brian Behlendorf Reviewed-by: Oleg Drokin --- config/lustre-build-ldiskfs.m4 | 14 +- config/lustre-build-zfs.m4 | 823 ++++++++++++++++++++++------------------- config/lustre-build.m4 | 41 +- lustre/osd-zfs/osd_io.c | 4 +- 4 files changed, 480 insertions(+), 402 deletions(-) diff --git a/config/lustre-build-ldiskfs.m4 b/config/lustre-build-ldiskfs.m4 index 8cc9ade..731d00b 100644 --- a/config/lustre-build-ldiskfs.m4 +++ b/config/lustre-build-ldiskfs.m4 @@ -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- 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 diff --git a/config/lustre-build-zfs.m4 b/config/lustre-build-zfs.m4 index 2ac8907..05de097 100644 --- a/config/lustre-build-zfs.m4 +++ b/config/lustre-build-zfs.m4 @@ -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 + ],[ + 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 + ],[ + 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 + ],[ + 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - #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]) - ],[ - 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - #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]) - ],[ - 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 - #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]) - ],[ - 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 - #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]) - ],[ - 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 - #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]) - ],[ - 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 - #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]) - ],[ - 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 - #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]) - ],[ - 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 - #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]) - ],[ - 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - ],[ - 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 - ], [ - 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 - ], [ - 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 + ],[ + 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 + ],[ + 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 + ],[ + 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 + #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]) + ],[ + 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 + ],[ + 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 + ],[ + 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 + ],[ + 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 + #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]) + ],[ + 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 + #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]) + ],[ + 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 + #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]) + ],[ + 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 + #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]) + ],[ + 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 + #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]) + ],[ + 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 + #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]) + ],[ + 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 + #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]) + ],[ + 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 + ],[ + 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 + ],[ + 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 + ],[ + 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 + ],[ + 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 + ],[ + 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 + ],[ + 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 + ],[ + zfs_refcount_add((zfs_refcount_t *) NULL, NULL); + ],[ + AC_DEFINE(HAVE_ZFS_REFCOUNT_HEADER, 1, + [Have zfs_refcount.h]) + ]) +]) diff --git a/config/lustre-build.m4 b/config/lustre-build.m4 index 9e56a96..737447a 100644 --- a/config/lustre-build.m4 +++ b/config/lustre-build.m4 @@ -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. diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index 23e50ef..b71eca7 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -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; -- 1.8.3.1