+# SPDX-License-Identifier: GPL-2.0
+
+#
+# This file is part of Lustre, http://www.lustre.org/
+#
+# config/lustre-build-ldiskfs.m4
+#
+# ldiskfs OSD related configuration
+#
+
#
# LDISKFS_LINUX_SERIES
#
# 2.6.32-rc7 ext4_free_blocks requires struct buffer_head
# Note that RHEL6 is pre 2.6.32-rc7 so this check is still needed.
#
+AC_DEFUN([LB_SRC_EXT_FREE_BLOCKS_WITH_BUFFER_HEAD], [
+ LB2_LINUX_TEST_SRC([ext4_free_blocks_with_buffer_head], [
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+ ],[
+ ext4_free_blocks(NULL, NULL, NULL, 0, 0, 0);
+ ],[],[],[ext4_free_blocks])
+])
AC_DEFUN([LB_EXT_FREE_BLOCKS_WITH_BUFFER_HEAD], [
-LB_CHECK_COMPILE([if 'ext4_free_blocks' needs 'struct buffer_head'],
-ext4_free_blocks_with_buffer_head, [
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4.h"
-],[
- ext4_free_blocks(NULL, NULL, NULL, 0, 0, 0);
-],[
+AC_MSG_CHECKING([if 'ext4_free_blocks' needs 'struct buffer_head'])
+LB2_LINUX_TEST_RESULT([ext4_free_blocks_with_buffer_head], [
AC_DEFINE(HAVE_EXT_FREE_BLOCK_WITH_BUFFER_HEAD, 1,
[ext4_free_blocks do not require struct buffer_head])
-])
+ ])
]) # LB_EXT_FREE_BLOCKS_WITH_BUFFER_HEAD
#
#
# 3.9 added a type argument to ext4_journal_start and friends
#
-AC_DEFUN([LB_EXT4_JOURNAL_START_3ARGS], [
-LB_CHECK_COMPILE([if ext4_journal_start takes 3 arguments],
-ext4_journal_start, [
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4_jbd2.h"
-],[
- ext4_journal_start(NULL, 0, 0);
-],[
- AC_DEFINE(JOURNAL_START_HAS_3ARGS, 1, [ext4_journal_start takes 3 arguments])
+AC_DEFUN([LB_SRC_EXT4_JOURNAL_START_3ARGS], [
+ LB2_LINUX_TEST_SRC([ext4_journal_start], [
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4_jbd2.h"
+ ],[
+ ext4_journal_start(NULL, 0, 0);
+ ],[],[],[__ext4_journal_start_sb])
])
+AC_DEFUN([LB_EXT4_JOURNAL_START_3ARGS], [
+ AC_MSG_CHECKING([if ext4_journal_start takes 3 arguments])
+ LB2_LINUX_TEST_RESULT([ext4_journal_start], [
+ AC_DEFINE(JOURNAL_START_HAS_3ARGS, 1,
+ [ext4_journal_start takes 3 arguments])
+ ])
]) # LB_EXT4_JOURNAL_START_3ARGS
#
# 3.18 ext4_bread has 4 arguments
# NOTE: It may not be exported for modules, use a positive compiler test here.
#
-AC_DEFUN([LB_EXT4_BREAD_4ARGS], [
-LB_CHECK_COMPILE([if ext4_bread takes 4 arguments],
-ext4_bread, [
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4.h"
-
- struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode,
- ext4_lblk_t block, int map_flags)
- {
- struct buffer_head *bh = NULL;
- (void)handle;
- (void)inode;
- (void)block;
- (void)map_flags;
- return bh;
- }
-],[
- ext4_bread(NULL, NULL, 0, 0);
-],[
- AC_DEFINE(HAVE_EXT4_BREAD_4ARGS, 1, [ext4_bread takes 4 arguments])
+AC_DEFUN([LB_SRC_EXT4_BREAD_4ARGS], [
+ LB2_LINUX_TEST_SRC([ext4_bread], [
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+
+ struct buffer_head *ext4_bread(handle_t *handle,
+ struct inode *inode,
+ ext4_lblk_t block, int map_flags)
+ {
+ struct buffer_head *bh = NULL;
+ (void)handle;
+ (void)inode;
+ (void)block;
+ (void)map_flags;
+ return bh;
+ }
+ ],[
+ ext4_bread(NULL, NULL, 0, 0);
+ ],[],[],[ext4_bread])
])
+AC_DEFUN([LB_EXT4_BREAD_4ARGS], [
+ AC_MSG_CHECKING([if ext4_bread takes 4 arguments])
+ LB2_LINUX_TEST_RESULT([ext4_bread], [
+ AC_DEFINE(HAVE_EXT4_BREAD_4ARGS, 1,
+ [ext4_bread takes 4 arguments])
+ ])
]) # LB_EXT4_BREAD_4ARGS
#
#
# in linux 4.4 i_dqout is in ext4_inode_info, not in struct inode
#
-AC_DEFUN([LB_EXT4_HAVE_INFO_DQUOT], [
-LB_CHECK_COMPILE([if i_dquot is in ext4_inode_info],
-ext4_info_dquot, [
- #include <linux/fs.h>
- #include <linux/quota.h>
- #include "$EXT4_SRC_DIR/ext4.h"
-],[
- struct ext4_inode_info in;
- struct dquot *dq;
+AC_DEFUN([LB_SRC_EXT4_HAVE_INFO_DQUOT], [
+ LB2_LINUX_TEST_SRC([ext4_info_dquot], [
+ #include <linux/fs.h>
+ #include <linux/quota.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+ ],[
+ struct ext4_inode_info in;
+ struct dquot *dq;
- dq = in.i_dquot[0];
-],[
- AC_DEFINE(HAVE_EXT4_INFO_DQUOT, 1, [i_dquot is in ext4_inode_info])
+ dq = in.i_dquot[0];
+ ])
])
+AC_DEFUN([LB_EXT4_HAVE_INFO_DQUOT], [
+ AC_MSG_CHECKING([if i_dquot is in ext4_inode_info])
+ LB2_LINUX_TEST_RESULT([ext4_info_dquot], [
+ AC_DEFINE(HAVE_EXT4_INFO_DQUOT, 1,
+ [i_dquot is in ext4_inode_info])
+ ])
]) # LB_EXT4_HAVE_INFO_DQUOT
#
# Otherwise i_crypy_info is in struct inode, we need to check kernel
# config option to determine that.
#
-AC_DEFUN([LB_EXT4_HAVE_I_CRYPT_INFO], [
-LB_CHECK_COMPILE([if i_crypt_info is in ext4_inode_info],
-ext4_i_crypt_info, [
- #define CONFIG_EXT4_FS_ENCRYPTION 1
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4.h"
-],[
- struct ext4_inode_info in;
+AC_DEFUN([LB_SRC_EXT4_HAVE_I_CRYPT_INFO], [
+ LB2_SRC_CHECK_CONFIG([EXT4_FS_ENCRYPTION])
+ LB2_LINUX_TEST_SRC([ext4_i_crypt_info], [
+ #define CONFIG_EXT4_FS_ENCRYPTION 1
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+ ],[
+ struct ext4_inode_info in;
- in.i_crypt_info = NULL;
-],[
- AC_DEFINE(
- CONFIG_LDISKFS_FS_ENCRYPTION, 1,
- [enable encryption for ldiskfs]
- )
-],[
- LB_CHECK_CONFIG([EXT4_FS_ENCRYPTION],[
- AC_DEFINE(
- CONFIG_LDISKFS_FS_ENCRYPTION, 1,
- [enable encryption for ldiskfs]
- )
+ in.i_crypt_info = NULL;
])
])
+AC_DEFUN([LB_EXT4_HAVE_I_CRYPT_INFO], [
+ AC_MSG_CHECKING([if i_crypt_info is in ext4_inode_info])
+ LB2_LINUX_TEST_RESULT([ext4_i_crypt_info], [
+ AC_DEFINE(CONFIG_LDISKFS_FS_ENCRYPTION, 1,
+ [enable encryption for ldiskfs])
+ test_have_i_crypt_info=yes
+ ],[
+ test_have_i_crypt_info=no
+ ])
+ AS_IF([test x$test_have_i_crypt_info = xno], [
+ LB2_TEST_CHECK_CONFIG([EXT4_FS_ENCRYPTION],[
+ AC_DEFINE(CONFIG_LDISKFS_FS_ENCRYPTION, 1,
+ [enable encryption for ldiskfs])
+ ])
+ ])
]) # LB_EXT4_HAVE_I_CRYPT_INFO
#
# has at least requested amount of credits available, and possibly
# restarting transaction if needed.
#
-AC_DEFUN([LB_LDISKFS_JOURNAL_ENSURE_CREDITS], [
-tmp_flags="$EXTRA_KCFLAGS"
-EXTRA_KCFLAGS="-Werror"
-LB_CHECK_COMPILE([if 'ext4_journal_ensure_credits' exists],
-ext4_journal_ensure_credits, [
- #include "$EXT4_SRC_DIR/ext4_jbd2.h"
- int __ext4_journal_ensure_credits(handle_t *handle, int check_cred,
- int extend_cred, int revoke_cred) { return 0; }
-],[
- ext4_journal_ensure_credits(NULL, 0, 0);
-],[
- AC_DEFINE(HAVE_LDISKFS_JOURNAL_ENSURE_CREDITS, 1,
- ['ext4_journal_ensure_credits' exists])
+AC_DEFUN([LB_SRC_LDISKFS_JOURNAL_ENSURE_CREDITS], [
+ LB2_LINUX_TEST_SRC([ext4_journal_ensure_credits], [
+ #include "$EXT4_SRC_DIR/ext4_jbd2.h"
+ int __ext4_journal_ensure_credits(handle_t *handle, int check_cred,
+ int extend_cred, int revoke_cred) { return 0; }
+ ],[
+ ext4_journal_ensure_credits(NULL, 0, 0);
+ ],[-Werror],[],[__ext4_journal_ensure_credits])
])
-EXTRA_KCFLAGS="$tmp_flags"
+AC_DEFUN([LB_LDISKFS_JOURNAL_ENSURE_CREDITS], [
+ AC_MSG_CHECKING([if 'ext4_journal_ensure_credits' exists])
+ LB2_LINUX_TEST_RESULT([ext4_journal_ensure_credits], [
+ AC_DEFINE(HAVE_LDISKFS_JOURNAL_ENSURE_CREDITS, 1,
+ ['ext4_journal_ensure_credits' exists])
+ ])
]) # LB_LDISKFS_JOURNAL_ENSURE_CREDITS
#
# kernel 4.19 commit 8a363970d1dc38c4ec4ad575c862f776f468d057
# ext4_iget changed to a macro with 3 args was function with 2 args
#
-AC_DEFUN([LB_LDISKFS_IGET_HAS_FLAGS_ARG], [
-tmp_flags="$EXTRA_KCFLAGS"
-EXTRA_KCFLAGS="-Werror"
-LB_CHECK_COMPILE([if ldiskfs_iget takes a flags argument],
-ext4_iget_3args, [
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4.h"
-],[
- int f = EXT4_IGET_SPECIAL;
- (void)f;
-],[
- AC_DEFINE(HAVE_LDISKFS_IGET_WITH_FLAGS, 1,
- [if ldiskfs_iget takes a flags argument])
+AC_DEFUN([LB_SRC_LDISKFS_IGET_HAS_FLAGS_ARG], [
+ LB2_LINUX_TEST_SRC([ext4_iget_3args], [
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+ ],[
+ int f = EXT4_IGET_SPECIAL;
+ (void)f;
+ ],[-Werror])
])
-EXTRA_KCFLAGS="$tmp_flags"
+AC_DEFUN([LB_LDISKFS_IGET_HAS_FLAGS_ARG], [
+ AC_MSG_CHECKING([if ldiskfs_iget takes a flags argument])
+ LB2_LINUX_TEST_RESULT([ext4_iget_3args], [
+ AC_DEFINE(HAVE_LDISKFS_IGET_WITH_FLAGS, 1,
+ [if ldiskfs_iget takes a flags argument])
+ ])
]) # LB_LDISKFS_IGET_HAS_FLAGS_ARG
#
# When the following check succeeds __ext4_find_entry helper is not
# used.
#
-AC_DEFUN([LB_LDISKFS_FIND_ENTRY_LOCKED_EXISTS], [
-tmp_flags="$EXTRA_KCFLAGS"
-EXTRA_KCFLAGS="-Werror"
-LB_CHECK_COMPILE([if __ldiskfs_find_entry is available],
-ldiskfs_find_entry_locked, [
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4.h"
- #include "$EXT4_SRC_DIR/namei.c"
+AC_DEFUN([LB_SRC_LDISKFS_FIND_ENTRY_LOCKED_EXISTS], [
+ LB2_LINUX_TEST_SRC([ldiskfs_find_entry_locked], [
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+ #include "$EXT4_SRC_DIR/namei.c"
- static int __ext4_find_entry(void) { return 0; }
-],[
- int x = __ext4_find_entry();
- (void)x;
-],[
- AC_DEFINE(HAVE___LDISKFS_FIND_ENTRY, 1,
- [if __ldiskfs_find_entry is available])
+ static int __ext4_find_entry(void) { return 0; }
+ ],[
+ int x = __ext4_find_entry();
+ (void)x;
+ ],[-Werror])
])
-EXTRA_KCFLAGS="$tmp_flags"
+AC_DEFUN([LB_LDISKFS_FIND_ENTRY_LOCKED_EXISTS], [
+ AC_MSG_CHECKING([if __ldiskfs_find_entry is available])
+ LB2_LINUX_TEST_RESULT([ldiskfs_find_entry_locked], [
+ AC_DEFINE(HAVE___LDISKFS_FIND_ENTRY, 1,
+ [if __ldiskfs_find_entry is available])
+ ])
]) # LB_LDISKFS_FIND_ENTRY_LOCKED_EXISTS
#
# kernel 5.2 commit 8a363970d1dc38c4ec4ad575c862f776f468d057
# ext4fs_dirhash UNICODE support
#
-AC_DEFUN([LB_LDISKFSFS_DIRHASH_WANTS_DIR], [
-tmp_flags="$EXTRA_KCFLAGS"
-EXTRA_KCFLAGS="-Werror"
-LB_CHECK_COMPILE([if ldiskfsfs_dirhash takes an inode argument],
-ext4fs_dirhash, [
- #include <linux/fs.h>
- #include "$EXT4_SRC_DIR/ext4.h"
-
- int ext4fs_dirhash(const struct inode *dir, const char *name, int len,
- struct dx_hash_info *hinfo)
- {
- (void)dir;
- (void)name;
- (void)len;
- (void)hinfo;
- return 0;
- }
-],[
- int f = ext4fs_dirhash(NULL, NULL, 0, NULL);
- (void)f;
-],[
- AC_DEFINE(HAVE_LDISKFSFS_GETHASH_INODE_ARG, 1,
- [ldiskfsfs_dirhash takes an inode argument])
+AC_DEFUN([LB_SRC_LDISKFSFS_DIRHASH_WANTS_DIR], [
+ LB2_LINUX_TEST_SRC([ext4fs_dirhash], [
+ #include <linux/fs.h>
+ #include "$EXT4_SRC_DIR/ext4.h"
+ ],[
+ int f = ext4fs_dirhash(NULL, NULL, 0, NULL);
+ (void)f;
+ ],[-Werror],[],[ext4fs_dirhash])
])
-EXTRA_KCFLAGS="$tmp_flags"
+AC_DEFUN([LB_LDISKFSFS_DIRHASH_WANTS_DIR], [
+ AC_MSG_CHECKING([if ldiskfsfs_dirhash takes an inode argument])
+ LB2_LINUX_TEST_RESULT([ext4fs_dirhash], [
+ AC_DEFINE(HAVE_LDISKFSFS_DIRHASH_WITH_DIR, 1,
+ [if ldiskfsfs_dirhash takes an inode argument])
+ ])
]) # LB_LDISKFSFS_DIRHASH_WANTS_DIR
#
# kernel 5.5 commit 933f1c1e0b75bbc29730eef07c9e196c6dfd37e5
# jbd2: Reserve space for revoke descriptor blocks
#
-AC_DEFUN([LB_JBD2_H_TOTAL_CREDITS], [
-tmp_flags="$EXTRA_KCFLAGS"
-EXTRA_KCFLAGS="-Werror"
-LB_CHECK_COMPILE([if struct jbd2_journal_handle has h_total_credits member],
-handle_t_h_revoke_credits, [
- #include <linux/jbd2.h>
-],[
- int x = offsetof(struct jbd2_journal_handle, h_total_credits);
- (void)x;
-],[
- AC_DEFINE(HAVE_JOURNAL_TOTAL_CREDITS, 1,
- [struct jbd2_journal_handle has h_total_credits member])
+AC_DEFUN([LB_SRC_JBD2_H_TOTAL_CREDITS], [
+ LB2_LINUX_TEST_SRC([handle_t_h_revoke_credits], [
+ #include <linux/jbd2.h>
+ ],[
+ int x = offsetof(struct jbd2_journal_handle, h_total_credits);
+ (void)x;
+ ],[-Werror])
])
-EXTRA_KCFLAGS="$tmp_flags"
+AC_DEFUN([LB_JBD2_H_TOTAL_CREDITS], [
+ AC_MSG_CHECKING([if struct jbd2_journal_handle has h_total_credits member])
+ LB2_LINUX_TEST_RESULT([handle_t_h_revoke_credits], [
+ AC_DEFINE(HAVE_JOURNAL_TOTAL_CREDITS, 1,
+ [struct jbd2_journal_handle has h_total_credits member])
+ ])
]) # LB_JBD2_H_TOTAL_CREDITS
#
# Linux commit v5.10-rc2-9-gede7dc7fa0af
# jbd2: rename j_maxlen to j_total_len and add jbd2_journal_max_txn_bufs
#
-AC_DEFUN([LB_JBD2_JOURNAL_GET_MAX_TXN_BUFS], [
-tmp_flags="$EXTRA_KCFLAGS"
-EXTRA_KCFLAGS="-Werror"
-LB_CHECK_COMPILE([if jbd2_journal_get_max_txn_bufs is available],
-jbd2_journal_get_max_txn_bufs, [
- #include <linux/jbd2.h>
-],[
- journal_t *journal = NULL;
- int x = jbd2_journal_get_max_txn_bufs(journal);
- (void)x;
-],[
- AC_DEFINE(HAVE_JBD2_JOURNAL_GET_MAX_TXN_BUFS, 1,
- [if jbd2_journal_get_max_txn_bufs is available])
+AC_DEFUN([LB_SRC_JBD2_JOURNAL_GET_MAX_TXN_BUFS], [
+ LB2_LINUX_TEST_SRC([jbd2_journal_get_max_txn_bufs], [
+ #include <linux/jbd2.h>
+ ],[
+ journal_t *journal = NULL;
+ int x = jbd2_journal_get_max_txn_bufs(journal);
+ (void)x;
+ ],[-Werror],[],[])
])
-EXTRA_KCFLAGS="$tmp_flags"
+AC_DEFUN([LB_JBD2_JOURNAL_GET_MAX_TXN_BUFS], [
+ AC_MSG_CHECKING([if jbd2_journal_get_max_txn_bufs is available])
+ LB2_LINUX_TEST_RESULT([jbd2_journal_get_max_txn_bufs], [
+ AC_DEFINE(HAVE_JBD2_JOURNAL_GET_MAX_TXN_BUFS, 1,
+ [if jbd2_journal_get_max_txn_bufs is available])
+ ])
]) # LB_JBD2_JOURNAL_GET_MAX_TXN_BUFS
#
LDISKFS_LINUX_SERIES
LDISKFS_AC_PATCH_PROGRAM
- LB_EXT_FREE_BLOCKS_WITH_BUFFER_HEAD
- LB_EXT4_JOURNAL_START_3ARGS
- LB_EXT4_BREAD_4ARGS
- LB_EXT4_HAVE_INFO_DQUOT
- LB_EXT4_HAVE_I_CRYPT_INFO
- LB_LDISKFS_JOURNAL_ENSURE_CREDITS
- LB_LDISKFS_IGET_HAS_FLAGS_ARG
- LB_LDISKFS_FIND_ENTRY_LOCKED_EXISTS
- LB_LDISKFSFS_DIRHASH_WANTS_DIR
- LB_JBD2_H_TOTAL_CREDITS
LB_EXT4_GET_BLOCKS_KEEP_SIZE
LB_EXT4_INC_DEC_COUNT_2ARGS
- LB_JBD2_JOURNAL_GET_MAX_TXN_BUFS
AC_DEFINE(CONFIG_LDISKFS_FS_POSIX_ACL, 1, [posix acls for ldiskfs])
AC_DEFINE(CONFIG_LDISKFS_FS_SECURITY, 1, [fs security for ldiskfs])
AC_DEFINE(CONFIG_LDISKFS_FS_XATTR, 1, [extened attributes for ldiskfs])
AM_CONDITIONAL([LDISKFS_ENABLED], [test x$enable_ldiskfs = xyes])
]) # LB_CONFIG_LDISKFS
-
-AC_DEFUN([LB_EXT4_SRC_DIR_SRC], [])
-AC_DEFUN([LB_EXT4_SRC_DIR_RESULTS], [])
+AC_DEFUN([LB_KABI_LDISKFS], [AS_IF([test x$enable_ldiskfs != xno],[
+ AC_DEFUN([LB_EXT4_LDISKFS_TESTS],[
+ LB_SRC_EXT_FREE_BLOCKS_WITH_BUFFER_HEAD
+ LB_SRC_EXT4_JOURNAL_START_3ARGS
+ LB_SRC_EXT4_BREAD_4ARGS
+ LB_SRC_EXT4_HAVE_INFO_DQUOT
+ LB_SRC_EXT4_HAVE_I_CRYPT_INFO
+ LB_SRC_LDISKFS_JOURNAL_ENSURE_CREDITS
+ LB_SRC_LDISKFS_IGET_HAS_FLAGS_ARG
+ LB_SRC_LDISKFS_FIND_ENTRY_LOCKED_EXISTS
+ LB_SRC_LDISKFSFS_DIRHASH_WANTS_DIR
+ LB_SRC_JBD2_H_TOTAL_CREDITS
+ LB_SRC_JBD2_JOURNAL_GET_MAX_TXN_BUFS
+ LB2_SRC_CHECK_CONFIG_IM([FS_ENCRYPTION])
+
+ LB2_LINUX_TEST_COMPILE_ALL([ldiskfs],
+ [for available ldiskfs ext4 interfaces])
+ ])
+ AC_DEFUN([LB_EXT4_LDISKFS_CHECKS], [
+ LB_EXT_FREE_BLOCKS_WITH_BUFFER_HEAD
+ LB_EXT4_JOURNAL_START_3ARGS
+ LB_EXT4_BREAD_4ARGS
+ LB_EXT4_HAVE_INFO_DQUOT
+ LB_EXT4_HAVE_I_CRYPT_INFO
+ LB_LDISKFS_JOURNAL_ENSURE_CREDITS
+ LB_LDISKFS_IGET_HAS_FLAGS_ARG
+ LB_LDISKFS_FIND_ENTRY_LOCKED_EXISTS
+ LB_LDISKFSFS_DIRHASH_WANTS_DIR
+ LB_JBD2_H_TOTAL_CREDITS
+ LB_JBD2_JOURNAL_GET_MAX_TXN_BUFS
+ LB2_TEST_CHECK_CONFIG_IM([FS_ENCRYPTION], [
+ EXT4_CRYPTO=],[
+ EXT4_CRYPTO='%/crypto.c'])
+ ])
+ AC_SUBST(EXT4_CRYPTO)
+])])
#
# LB_VALIDATE_EXT4_SRC_DIR
]) # 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
AC_SUBST(EXT4_SRC_DIR)
LB_VALIDATE_EXT4_SRC_DIR
-]) # LB_EXT4_SRC_DIR
+]) # LB_EXT4_SOURCE_PATH
#
# LB_DEFINE_E2FSPROGS_NAMES
-dnl #
-dnl # Supported configure options. When no options are specified support
-dnl # for ZFS OSDs will be autodetected assuming server support is enabled.
-dnl # If the ZFS OSD cannot be built support for it is disabled and a
-dnl # warning is issued but the configure process is allowed to continue.
-dnl #
-dnl # --without-zfs - Disable zfs support.
-dnl # --with-zfs=no
-dnl #
-dnl # --with-zfs - Enable zfs support and attempt to autodetect the zfs
-dnl # --with-zfs=yes headers in one of the following places. Because zfs
-dnl # support was explicitly required if the headers cannot
-dnl # be located it is treated as a fatal error.
-dnl #
-dnl # * /var/lib/dkms/zfs/${VERSION}/source
-dnl # * /usr/src/zfs-${VERSION}/${LINUXRELEASE}
-dnl # * /usr/src/zfs-${VERSION}
-dnl # * ../zfs/
-dnl # * $LINUX/zfs
-dnl #
-dnl # --with-zfs-devel=path
-dnl # - User provided directory where zfs development headers
-dnl # are located. This option is typically used when user
-dnl # uses rpm2cpio to unpack src rpm.
-dnl # Assumes layout of:
-dnl # ${zfs-devel-path}/usr/include/libzfs
-dnl # ${zfs-devel-path}/usr/include/libspl
-dnl # ${zfs-devel-path}/lib64/libzfs.so.* or
-dnl # ${zfs-devel-path}/lib/libzfs.so.*
-dnl #
-dnl # --with-zfs=path - Enable zfs support and use the zfs headers in the
-dnl # provided path. No autodetection is performed and
-dnl # if no headers are found this is a fatal error.
-dnl #
-dnl # --with-zfs-obj - When zfs support is enabled the object directory
-dnl # will be based on the --with-zfs directory. If this
-dnl # is detected incorrectly it can be explicitly
-dnl # specified using this option.
-dnl #
-dnl # --without-spl - Disable spl support.
-dnl # --with-spl=no
-dnl #
-dnl # --with-spl - Enable spl support and attempt to autodetect the spl
-dnl # --with-spl=yes headers in one of the following places in this order:
-dnl # * /var/lib/dkms/spl/${VERSION}/source
-dnl # * /usr/src/spl-${VERSION}/${LINUXRELEASE}
-dnl # * /usr/src/spl-${VERSION}
-dnl # * ../spl/
-dnl # * $LINUX/spl
-dnl #
-dnl # --with-spl=path - Enable spl support and use the spl headers in the
-dnl # provided path. No autodetection is performed.
-dnl #
-dnl # --with-spl-obj - When spl support is enabled the object directory
-dnl # will be based on the --with-spl directory. If this
-dnl # is detected incorrectly it can be explicitly
-dnl # specified using this option.
-dnl #
+# SPDX-License-Identifier: NOASSERTION
+
+#
+# This file is part of Lustre, http://www.lustre.org/
+#
+# config/lustre-build-zfs.m4
+#
+# openZFS OSD related configuration
+#
+
+#
+# Supported configure options. When no options are specified support
+# for ZFS OSDs will be autodetected assuming server support is enabled.
+# If the ZFS OSD cannot be built support for it is disabled and a
+# warning is issued but the configure process is allowed to continue.
+#
+# --without-zfs - Disable zfs support.
+# --with-zfs=no
+#
+# --with-zfs - Enable zfs support and attempt to autodetect the zfs
+# --with-zfs=yes headers in one of the following places. Because zfs
+# support was explicitly required if the headers cannot
+# be located it is treated as a fatal error.
+#
+# * /var/lib/dkms/zfs/${VERSION}/source
+# * /usr/src/zfs-${VERSION}/${LINUXRELEASE}
+# * /usr/src/zfs-${VERSION}
+# * ../zfs/
+# * $LINUX/zfs
+#
+# --with-zfs-devel=path
+# - User provided directory where zfs development headers
+# are located. This option is typically used when user
+# uses rpm2cpio to unpack src rpm.
+# Assumes layout of:
+# ${zfs-devel-path}/usr/include/libzfs
+# ${zfs-devel-path}/usr/include/libspl
+# ${zfs-devel-path}/lib64/libzfs.so.* or
+# ${zfs-devel-path}/lib/libzfs.so.*
+#
+# --with-zfs=path - Enable zfs support and use the zfs headers in the
+# provided path. No autodetection is performed and
+# if no headers are found this is a fatal error.
+#
+# --with-zfs-obj - When zfs support is enabled the object directory
+# will be based on the --with-zfs directory. If this
+# is detected incorrectly it can be explicitly
+# specified using this option.
+#
+# --without-spl - Disable spl support.
+# --with-spl=no
+#
+# --with-spl - Enable spl support and attempt to autodetect the spl
+# --with-spl=yes headers in one of the following places in this order:
+# * /var/lib/dkms/spl/${VERSION}/source
+# * /usr/src/spl-${VERSION}/${LINUXRELEASE}
+# * /usr/src/spl-${VERSION}
+# * ../spl/
+# * $LINUX/spl
+#
+# --with-spl=path - Enable spl support and use the spl headers in the
+# provided path. No autodetection is performed.
+#
+# --with-spl-obj - When spl support is enabled the object directory
+# will be based on the --with-spl directory. If this
+# is detected incorrectly it can be explicitly
+# specified using this option.
+#
+
+#
+# LB_SPL
+#
AC_DEFUN([LB_SPL], [
AC_ARG_WITH([spl],
AS_HELP_STRING([--with-spl=PATH],
[Path to spl build objects]),
[splobj="$withval"])
- dnl #
- dnl # The existence of spl.release[.in] is used to identify a valid
- dnl # source directory. In order of preference:
- dnl #
+ #
+ # The existence of spl.release[.in] is used to identify a valid
+ # source directory. In order of preference:
+ #
splver=$(ls -1 /usr/src/ | grep ^spl- | cut -f2 -d'-' |
sort -V | head -n1)
spldkms="/var/lib/dkms/spl/${splver}"
enable_zfs=no
])
- dnl #
- dnl # The existence of the spl_config.h is used to identify a valid
- dnl # spl object directory. In many cases the object and source
- dnl # directory are the same, however the objects may also reside
- dnl # is a subdirectory named after the kernel version. When
- dnl # weak modules are used, the kernel version may not be the
- dnl # same as the LINUXRELEASE against which we are building lustre.
- dnl #
+ #
+ # The existence of the spl_config.h is used to identify a valid
+ # spl object directory. In many cases the object and source
+ # directory are the same, however the objects may also reside
+ # is a subdirectory named after the kernel version. When
+ # weak modules are used, the kernel version may not be the
+ # same as the LINUXRELEASE against which we are building lustre.
+ #
AC_MSG_CHECKING([spl build directory])
AS_IF([test -z "$splobj"], [
last_spl_obj_dir=$(ls -d ${splsrc}/[[0-9]]*/ 2> /dev/null | tail -n 1 | sed 's|/$||')
enable_zfs=no
])
- dnl #
- dnl # Verify the source version using SPL_META_VERSION in spl_config.h
- dnl #
+ #
+ # Verify the source version using SPL_META_VERSION in spl_config.h
+ #
AS_IF([test x$enable_zfs = xyes], [
AC_MSG_CHECKING([spl source version])
AS_IF([fgrep -q SPL_META_VERSION $splobj/spl_config.h], [
AC_MSG_RESULT([$splver])
])
- dnl #
- dnl # Verify the modules systems exist by the expect name.
- dnl #
+ #
+ # Verify the modules systems exist by the expect name.
+ #
AS_IF([test x$enable_zfs = xyes], [
AC_MSG_CHECKING([spl file name for module symbols])
AS_IF([test -r $splobj/$SYMVERFILE], [
AC_SUBST(EXTRA_SYMBOLS)
])
-])
+]) # LB_SPL
+#
+# LB_ZFS
+#
AC_DEFUN([LB_ZFS], [
AC_ARG_WITH([zfs-obj],
AS_HELP_STRING([--with-zfs-obj=PATH],
[Path to zfs build objects]),
[zfsobj="$withval"])
- dnl #
- dnl # The existence of zfs.release[.in] is used to identify a valid
- dnl # source directory. In order of preference:
- dnl #
+ #
+ # The existence of zfs.release[.in] is used to identify a valid
+ # source directory. In order of preference:
+ #
zfsver=$(ls -1 /usr/src/ | grep ^zfs- | cut -f2 -d'-' |
sort -V | head -n1)
zfsdkms="/var/lib/dkms/zfs/${zfsver}"
enable_zfs=no
])
- dnl #
- dnl # The existence of the zfs_config.h is used to identify a valid
- dnl # zfs object directory. In many cases the object and source
- dnl # directory are the same, however the objects may also reside
- dnl # is a subdirectory named after the kernel version. When
- dnl # weak modules are used, the kernel version may not be the
- dnl # same as the LINUXRELEASE against which we are building lustre.
- dnl #
+ #
+ # The existence of the zfs_config.h is used to identify a valid
+ # zfs object directory. In many cases the object and source
+ # directory are the same, however the objects may also reside
+ # is a subdirectory named after the kernel version. When
+ # weak modules are used, the kernel version may not be the
+ # same as the LINUXRELEASE against which we are building lustre.
+ #
AC_MSG_CHECKING([zfs build directory])
AS_IF([test -z "$zfsobj"], [
last_zfs_obj_dir=$(ls -d ${zfssrc}/[[0-9]]*/ 2> /dev/null | tail -n 1 | sed 's|/$||')
enable_zfs=no
])
- dnl #
- dnl # Verify the source version using SPL_META_VERSION in spl_config.h
- dnl #
+ #
+ # Verify the source version using SPL_META_VERSION in spl_config.h
+ #
AS_IF([test x$enable_zfs = xyes], [
AC_MSG_CHECKING([zfs source version])
AS_IF([fgrep -q ZFS_META_VERSION $zfsobj/zfs_config.h], [
AC_MSG_RESULT([$zfsver])
])
- dnl #
- dnl # Verify the modules systems exist by the expect name.
- dnl #
+ #
+ # Verify the modules systems exist by the expect name.
+ #
AS_IF([test x$enable_zfs = xyes], [
AC_MSG_CHECKING([zfs file name for module symbols])
AS_IF([test -r $zfsobj/$SYMVERFILE], [
AC_SUBST(EXTRA_SYMBOLS)
])
-])
+]) # LB_ZFS
+#
+# LB_ZFS_DEVEL
+#
AC_DEFUN([LB_ZFS_DEVEL], [
AC_ARG_WITH([zfs-devel],
[AS_HELP_STRING([--with-zfs-devel=PATH],
])
])
AC_MSG_RESULT([$zfsinc])
-])
+]) # LB_ZFS_DEVEL
+#
+# LB_ZFS_USER
+#
AC_DEFUN([LB_ZFS_USER], [
- dnl #
- dnl # Detect user space zfs development headers.
- dnl #
+ #
+ # Detect user space zfs development headers.
+ #
AC_MSG_CHECKING([zfs devel headers])
AS_IF([test -z "${zfsinc}"], [
AS_IF([test -e "${zfssrc}/include/libzfs.h" && test -e "${zfssrc}/lib/libspl/include"], [
AC_SUBST(ZFS_LIBZFS_INCLUDE)
AC_SUBST(ZFS_LIBZFS_LDFLAGS)
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], [
+ AC_MSG_CHECKING([if ZFS nvlist interfaces require const])
+ LB2_LINUX_TEST_RESULT([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], [
+ AC_MSG_CHECKING([if ZFS arc_prune_func_t uses uint64_t])
+ LB2_LINUX_TEST_RESULT([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], [
+ AC_MSG_CHECKING([if dmu_buf_will_fill() has 3 args])
+ LB2_LINUX_TEST_RESULT([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
+#
AC_DEFUN([LB_CONFIG_ZFS], [
AC_ARG_WITH([zfs],
[AS_HELP_STRING([--with-zfs=PATH], [Path to zfs source])],
LB_ZFS_DEVEL
LB_ZFS_USER
- dnl #
- dnl # Define zfs source code version
- dnl #
+ #
+ # Define zfs source code version
+ #
ZFS_MAJOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\1/'])
ZFS_MINOR=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\2/'])
ZFS_PATCH=$(echo $zfsver | sed -re ['s/([0-9]+)\.([0-9]+)\.([0-9]+)(\.([0-9]+))?.*/\3/'])
AC_DEFINE_UNQUOTED([ZFS_PATCH], [$ZFS_PATCH], [zfs patch version])
AC_DEFINE_UNQUOTED([ZFS_FIX], [$ZFS_FIX], [zfs fix version])
- dnl #
- dnl # SPL is only needed if ZFS is prior to 0.8.0
- dnl #
+ #
+ # SPL is only needed if ZFS is prior to 0.8.0
+ #
AS_IF([test x$enable_modules = xyes && test -n "$ZFS_MAJOR" &&
test $ZFS_MAJOR -eq 0 && test $ZFS_MINOR -lt 8], [
LB_SPL
enable_spl=no
])
- dnl #
- dnl # enable_zfs will be set to no in LB_SPL or LB_ZFS if
- dnl # one of more of the build requirements is not met.
- dnl #
+ #
+ # enable_zfs will be set to no in LB_SPL or LB_ZFS if
+ # one of more of the build requirements is not met.
+ #
AS_IF([test x$enable_zfs = xyes], [
AC_DEFINE(HAVE_ZFS_OSD, 1, Enable zfs osd)
],[
])
])
])
-
-
- 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])
- ])
-
- dnl #
- dnl # ZFS 0.7.x adds support for large dnodes. This
- dnl # allows Lustre to optionally specify the size of a
- dnl # dnode which ZFS will then use to store metadata such
- dnl # as xattrs. The default dnode size specified by the
- dnl # 'dnodesize' dataset property will be used unless a
- dnl # specific value is provided.
- dnl #
- LB_CHECK_COMPILE([if zfs defines dmu_object_alloc_dnsize],
- dmu_object_alloc_dnsize, [
- #include <sys/dmu.h>
- #include <sys/dnode.h>
- ],[
- objset_t *os = NULL;
- dmu_object_type_t objtype = DMU_OT_NONE;
- int blocksize = 0;
- dmu_object_type_t bonustype = DMU_OT_SA;
- int dnodesize = DNODE_MIN_SIZE;
- dmu_tx_t *tx = NULL;
- uint64_t id;
-
- id = dmu_object_alloc_dnsize(os, objtype, blocksize,
- bonustype,
- DN_BONUS_SIZE(dnodesize),
- dnodesize, tx);
- ],[
- AC_DEFINE(HAVE_DMU_OBJECT_ALLOC_DNSIZE, 1,
- [Have dmu_object_alloc_dnsize in ZFS])
- ],[
- AC_MSG_ERROR([dmu_object_alloc_dnsize does not exist])
- ])
-
- dnl #
- dnl # ZFS 0.7.x extended dmu_prefetch() to take an additional
- dnl # 'level' and 'priority' argument. Use a level of 0 and a
- dnl # priority of ZIO_PRIORITY_SYNC_READ to replicate the
- dnl # behavior of the four argument version.
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_prefetch' with 6 args],
- dmu_prefetch, [
- #include <sys/dmu.h>
- ],[
- objset_t *os = NULL;
- uint64_t object = 0;
- int64_t level = 0;
- uint64_t offset = 0;
- uint64_t len = 0;
- enum zio_priority pri = ZIO_PRIORITY_SYNC_READ;
-
- dmu_prefetch(os, object, level, offset, len, pri);
- ],[
- AC_DEFINE(HAVE_DMU_PREFETCH_6ARG, 1,
- [Have 6 argument dmu_pretch in ZFS])
- ],[
- AC_MSG_ERROR([6 argument dmu_pretch does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.0 feature: SPA_FEATURE_USEROBJ_ACCOUNTING
- dnl #
- LB_CHECK_COMPILE([if ZFS has native dnode accounting supported],
- dmu_objset_userobjused_enabled, [
- #include <sys/dmu_objset.h>
- ],[
- dmu_objset_userobjused_enabled(NULL);
- ],[
- AC_DEFINE(HAVE_DMU_USEROBJ_ACCOUNTING, 1,
- [Have native dnode accounting in ZFS])
- ],[
- AC_MSG_ERROR([native dnode accounting does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.0 feature: MULTIHOST
- dnl #
- 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])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method zap_lookup_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'zap_lookup_by_dnode'],
- zap_lookup_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- zap_lookup_by_dnode(dn, NULL, 1, 1, NULL);
- ],[
- AC_DEFINE(HAVE_ZAP_LOOKUP_BY_DNODE, 1,
- [Have zap_lookup_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([zap_lookup_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method zap_add_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'zap_add_by_dnode'],
- zap_add_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- zap_add_by_dnode(dn, NULL, 1, 1, NULL, NULL);
- ],[
- AC_DEFINE(HAVE_ZAP_ADD_BY_DNODE, 1,
- [Have zap_add_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([zap_add_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method zap_remove_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'zap_remove_by_dnode'],
- zap_remove_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- zap_remove_by_dnode(dn, NULL, NULL);
- ],[
- AC_DEFINE(HAVE_ZAP_REMOVE_ADD_BY_DNODE, 1,
- [Have zap_remove_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([zap_remove_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method dmu_tx_hold_zap_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_zap_by_dnode'],
- dmu_tx_hold_zap_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- dmu_tx_hold_zap_by_dnode(NULL, dn, TRUE, NULL);
- ],[
- AC_DEFINE(HAVE_DMU_TX_HOLD_ZAP_BY_DNODE, 1,
- [Have dmu_tx_hold_zap_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([dmu_tx_hold_zap_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method dmu_tx_hold_write_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_tx_hold_write_by_dnode'],
- dmu_tx_hold_write_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- dmu_tx_hold_write_by_dnode(NULL, dn, 0, 0);
- ],[
- AC_DEFINE(HAVE_DMU_TX_HOLD_WRITE_BY_DNODE, 1,
- [Have dmu_tx_hold_write_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([dmu_tx_hold_write_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method dmu_write_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_write_by_dnode'],
- dmu_write_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- dmu_write_by_dnode(dn, 0, 0, NULL, NULL);
- ],[
- AC_DEFINE(HAVE_DMU_WRITE_BY_DNODE, 1,
- [Have dmu_write_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([dmu_write_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.x adds new method dmu_read_by_dnode
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_read_by_dnode'],
- dmu_read_by_dnode, [
- #include <sys/zap.h>
- #include <sys/dnode.h>
- ],[
- dnode_t *dn = NULL;
- dmu_read_by_dnode(dn, 0, 0, NULL, 0);
- ],[
- AC_DEFINE(HAVE_DMU_READ_BY_DNODE, 1,
- [Have dmu_read_by_dnode() in ZFS])
- ],[
- AC_MSG_ERROR([dmu_read_by_dnode does not exist])
- ])
- dnl #
- dnl # ZFS 0.7.2 adds new method dmu_tx_mark_netfree
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_tx_mark_netfree'],
- dmu_tx_mark_netfree, [
- #include <sys/dmu.h>
- ],[
- dmu_tx_t *tx = NULL;
- dmu_tx_mark_netfree(tx);
- ],[
- AC_DEFINE(HAVE_DMU_TX_MARK_NETFREE, 1,
- [Have dmu_tx_mark_netfree])
- ])
- dnl #
- dnl # ZFS 0.7.10 changes timestruc_t to inode_timespec_t
- dnl #
- LB_CHECK_COMPILE([if SPL has 'inode_timespec_t'],
- zfs_have_inode_timespec, [
- #include <sys/fs/zfs.h>
- ],[
- inode_timespec_t now;
- gethrestime(&now);
- ],[
- AC_DEFINE(HAVE_ZFS_INODE_TIMESPEC, 1,
- [Have inode_timespec_t])
- ])
- dnl # ZFS 0.7.12/0.8.x uses zfs_refcount_add() instead of
- dnl # refcount_add(). ZFS 2.0 renamed sys/refcount.h to
- dnl # sys/zfs_refcount.h, rather the add another check to
- dnl # determine the correct header name include it
- dnl # indirectly through sys/dnode.h.
- dnl #
- 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])
- ])
- dnl #
- dnl # ZFS 0.8.x changes dmu_objset_own for encryption
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_objset_own' with 6 args],
- dmu_objset_own, [
- #include <sys/dmu_objset.h>
- ],[
- objset_t *os = NULL;
- dmu_objset_type_t type = DMU_OST_ANY;
- dmu_objset_own(NULL, type, B_FALSE, B_TRUE, FTAG, &os);
- ],[
- AC_DEFINE(HAVE_DMU_OBJSET_OWN_6ARG, 1,
- [Have dmu_objset_own() with 6 args])
- ])
- dnl #
- dnl # ZFS 0.8.x changes dmu_objset_disown for encryption
- dnl #
- LB_CHECK_COMPILE([if ZFS has 'dmu_objset_disown' with 3 args],
- dmu_objset_disown, [
- #include <sys/dmu_objset.h>
- ],[
- objset_t *os = NULL;
- dmu_objset_disown(os, B_TRUE, FTAG);
- ],[
- AC_DEFINE(HAVE_DMU_OBJSET_DISOWN_3ARG, 1,
- [Have dmu_objset_disown() with 3 args])
- ])
- dnl #
- dnl # ZFS exports dmu_offet_next
- dnl #
- 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])
- ])
- dnl #
- dnl # ZFS 2.0 replaced .db_last_dirty / .dr_next with a list_t
- dnl # and list_node_t named .db_dirty_records / .dr_dbuf_node.
- dnl #
- 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])
- ])
- dnl #
- dnl # ZFS 2.0 renamed sys/refcount.h to zfs_refcount.h
- dnl # This build issue shows up with ZFS 2.0.7 and Lustre 2.12 LTS
- dnl #
- 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])
+ ])
])