From 1876178779d3d4de2661285955f18eb6b015c9e5 Mon Sep 17 00:00:00 2001 From: Sergey Popov Date: Sun, 26 Feb 2012 14:37:02 +0400 Subject: [PATCH] Bump new ebuilds of zfs and spl, make it fully compatible with Linux 3.2 Used commits: zfsonlinux/spl@588d900, zfsonlinux/zfs@166dd49 and zfsonlinux/zfs@28eb921 Closes #3 --- sys-devel/spl/Manifest | 4 +- .../files/spl-0.6.0-kernel-3.2-compat.patch | 325 +++++ ..._rc6-r1.ebuild => spl-0.6.0_rc6-r2.ebuild} | 2 + sys-devel/spl/spl-0.6.0_rc6.ebuild | 46 - sys-fs/zfs/Manifest | 3 +- .../files/zfs-0.6.0-kernel-3.2-compat.patch | 1211 +++++++++++++++++ ..._rc6-r1.ebuild => zfs-0.6.0_rc6-r2.ebuild} | 2 + 7 files changed, 1544 insertions(+), 49 deletions(-) create mode 100644 sys-devel/spl/files/spl-0.6.0-kernel-3.2-compat.patch rename sys-devel/spl/{spl-0.6.0_rc6-r1.ebuild => spl-0.6.0_rc6-r2.ebuild} (91%) delete mode 100644 sys-devel/spl/spl-0.6.0_rc6.ebuild create mode 100644 sys-fs/zfs/files/zfs-0.6.0-kernel-3.2-compat.patch rename sys-fs/zfs/{zfs-0.6.0_rc6-r1.ebuild => zfs-0.6.0_rc6-r2.ebuild} (94%) diff --git a/sys-devel/spl/Manifest b/sys-devel/spl/Manifest index fb061fd..1268dc6 100644 --- a/sys-devel/spl/Manifest +++ b/sys-devel/spl/Manifest @@ -1,7 +1,7 @@ AUX spl-0.6.0-includedir.patch 1179 RMD160 cade3b696d6981b2583cc5ae8ecf614d38ef2efc SHA1 2c5ce007df75a7a8425e1a28308eefdcb29446c2 SHA256 8d05fc006348264e1633e14b73e022d482164d6cefc8d2425faffc50d2346150 AUX spl-0.6.0-kernel-3.1-compat.patch 27063 RMD160 df1d3e67b7aba240b7e02150122715396888e83d SHA1 d2f9266741758c8b94212885dc74b115fb6c5bcb SHA256 7cb0f13b973f03907a35f81fd4b2e7f3316029ed2aa6a79522bc2a4bf5501d72 +AUX spl-0.6.0-kernel-3.2-compat.patch 9656 RMD160 e0d03d25fa80cec7ee620fa5522ce505bfa1a050 SHA1 730c79be658e48f7fdecd1c4a62fcfafafe59f53 SHA256 cb6a02de0e113f8784382811dd589da9ca9dd5af430f746b6503ebc58046189b AUX spl-9999-includedir.patch 1165 RMD160 98219674ccbea205a3ec1de20ecfd0ca331a2537 SHA1 4d5f92617640dcdb763586f86633c894ef260fb5 SHA256 d5e7a3edabdce01cdda2dc105bafd62935f54f9cd708dcfb5b9927c6e179ecb8 DIST spl-0.6.0-rc6.tar.gz 438215 RMD160 8acfc2f7817993f561e78e6627eab22555d8ed27 SHA1 7cdbf313ccae73b382022da408eb17d6a612dd5b SHA256 a728ec0e5db9260d48e8165d3ac6f783b17812fca7b87966fae085c9e7a48446 -EBUILD spl-0.6.0_rc6-r1.ebuild 1113 RMD160 a18bcdc22b92b651544e81c2ee973ac03494ad4b SHA1 e01e006853fbb356ffb55ee9b26c06b972a45eb9 SHA256 d9fda2a368fa33be6d5821e9387db35f3369f5260fae3a63f3a59b47216c5966 -EBUILD spl-0.6.0_rc6.ebuild 1007 RMD160 cdbf9d35749584ec03f629cb056f7d667ceb2268 SHA1 e2ac30a80e61ec2c31afaefa87707163abf25b53 SHA256 25e2e25924c18ec112842b917202da8dd97989ca3175e79b824811066ea3d6f3 +EBUILD spl-0.6.0_rc6-r2.ebuild 1218 RMD160 1f4701ed12c560e1b2ded9328c12abef8003c49b SHA1 b8f5d36eaeb5665391af64f6f2d3a1dedbdc358d SHA256 c65c421f368e72cf3aab837bbf87d6bb3b0153a5fdef0ae34dea077f053aadbd EBUILD spl-9999.ebuild 930 RMD160 f80465a36115277d860f6c931c44052578a8c97a SHA1 3962be9e632fe195cf8d069a55bf56abaf53e46a SHA256 eefd5ddf6c45d36ac39ed7e29e872064e823e87f2d895a09f6c8aaf87f1f55f2 diff --git a/sys-devel/spl/files/spl-0.6.0-kernel-3.2-compat.patch b/sys-devel/spl/files/spl-0.6.0-kernel-3.2-compat.patch new file mode 100644 index 0000000..8fcd624 --- /dev/null +++ b/sys-devel/spl/files/spl-0.6.0-kernel-3.2-compat.patch @@ -0,0 +1,325 @@ +diff --git a/config/spl-build.m4 b/config/spl-build.m4 +index 90ff680..27b2c42 100644 +--- a/config/spl-build.m4 ++++ b/config/spl-build.m4 +@@ -85,6 +85,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ + SPL_AC_KERN_PATH_PARENT_SYMBOL + SPL_AC_2ARGS_ZLIB_DEFLATE_WORKSPACESIZE + SPL_AC_SHRINK_CONTROL_STRUCT ++ SPL_AC_RWSEM_SPINLOCK_IS_RAW + ]) + + AC_DEFUN([SPL_AC_MODULE_SYMVERS], [ +@@ -1973,3 +1974,29 @@ AC_DEFUN([SPL_AC_SHRINK_CONTROL_STRUCT], [ + AC_MSG_RESULT(no) + ]) + ]) ++ ++dnl # ++dnl # 3.1 API Change ++dnl # ++dnl # The rw_semaphore.wait_lock member was changed from spinlock_t to ++dnl # raw_spinlock_t at commit ddb6c9b58a19edcfac93ac670b066c836ff729f1. ++dnl # ++AC_DEFUN([SPL_AC_RWSEM_SPINLOCK_IS_RAW], [ ++ AC_MSG_CHECKING([whether struct rw_semaphore member wait_lock is raw]) ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="-Werror" ++ SPL_LINUX_TRY_COMPILE([ ++ #include ++ ],[ ++ struct rw_semaphore dummy_semaphore __attribute__ ((unused)); ++ raw_spinlock_t dummy_lock __attribute__ ((unused)); ++ dummy_semaphore.wait_lock = dummy_lock; ++ ],[ ++ AC_MSG_RESULT(yes) ++ AC_DEFINE(RWSEM_SPINLOCK_IS_RAW, 1, ++ [struct rw_semaphore member wait_lock is raw_spinlock_t]) ++ ],[ ++ AC_MSG_RESULT(no) ++ ]) ++ EXTRA_KCFLAGS="$tmp_flags" ++]) +diff --git a/configure b/configure +index 9d95d76..621773d 100755 +--- a/configure ++++ b/configure +@@ -16025,6 +16025,76 @@ fi + + + ++ ++ { $as_echo "$as_me:$LINENO: checking whether struct rw_semaphore member wait_lock is raw" >&5 ++$as_echo_n "checking whether struct rw_semaphore member wait_lock is raw... " >&6; } ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="-Werror" ++ ++ ++cat confdefs.h - <<_ACEOF >conftest.c ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++ ++ #include ++ ++int ++main (void) ++{ ++ ++ struct rw_semaphore dummy_semaphore __attribute__ ((unused)); ++ raw_spinlock_t dummy_lock __attribute__ ((unused)); ++ dummy_semaphore.wait_lock = dummy_lock; ++ ++ ; ++ return 0; ++} ++ ++_ACEOF ++ ++ ++ rm -Rf build && mkdir -p build ++ echo "obj-m := conftest.o" >build/Makefile ++ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++ { $as_echo "$as_me:$LINENO: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define RWSEM_SPINLOCK_IS_RAW 1 ++_ACEOF ++ ++ ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ ++ ++fi ++ ++ rm -Rf build ++ ++ ++ EXTRA_KCFLAGS="$tmp_flags" ++ + ;; + user) ;; + all) +@@ -20335,6 +20405,76 @@ fi + + + ++ { $as_echo "$as_me:$LINENO: checking whether struct rw_semaphore member wait_lock is raw" >&5 ++$as_echo_n "checking whether struct rw_semaphore member wait_lock is raw... " >&6; } ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="-Werror" ++ ++ ++cat confdefs.h - <<_ACEOF >conftest.c ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++ ++ #include ++ ++int ++main (void) ++{ ++ ++ struct rw_semaphore dummy_semaphore __attribute__ ((unused)); ++ raw_spinlock_t dummy_lock __attribute__ ((unused)); ++ dummy_semaphore.wait_lock = dummy_lock; ++ ++ ; ++ return 0; ++} ++ ++_ACEOF ++ ++ ++ rm -Rf build && mkdir -p build ++ echo "obj-m := conftest.o" >build/Makefile ++ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++ { $as_echo "$as_me:$LINENO: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define RWSEM_SPINLOCK_IS_RAW 1 ++_ACEOF ++ ++ ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ ++ ++fi ++ ++ rm -Rf build ++ ++ ++ EXTRA_KCFLAGS="$tmp_flags" ++ ++ + ;; + srpm) ;; + *) +diff --git a/include/linux/rwsem_compat.h b/include/linux/rwsem_compat.h +index 67a82bb..fe69f01 100644 +--- a/include/linux/rwsem_compat.h ++++ b/include/linux/rwsem_compat.h +@@ -27,6 +27,26 @@ + + #include + ++#ifdef RWSEM_SPINLOCK_IS_RAW ++#define spl_rwsem_lock_irqsave(lock, flags) \ ++({ \ ++ raw_spin_lock_irqsave(lock, flags); \ ++}) ++#define spl_rwsem_unlock_irqrestore(lock, flags) \ ++({ \ ++ raw_spin_unlock_irqrestore(lock, flags); \ ++}) ++#else ++#define spl_rwsem_lock_irqsave(lock, flags) \ ++({ \ ++ spin_lock_irqsave(lock, flags); \ ++}) ++#define spl_rwsem_unlock_irqrestore(lock, flags) \ ++({ \ ++ spin_unlock_irqrestore(lock, flags); \ ++}) ++#endif /* RWSEM_SPINLOCK_IS_RAW */ ++ + #ifdef RWSEM_IS_LOCKED_TAKES_WAIT_LOCK + /* + * A race condition in rwsem_is_locked() was fixed in Linux 2.6.33 and the fix +@@ -48,14 +68,14 @@ + + #else + +-#define spl_rwsem_is_locked(rwsem) \ +-({ \ +- unsigned long _flags_; \ +- int _rc_; \ +- spin_lock_irqsave(&rwsem->wait_lock, _flags_); \ +- _rc_ = rwsem_is_locked(rwsem); \ +- spin_unlock_irqrestore(&rwsem->wait_lock, _flags_); \ +- _rc_; \ ++#define spl_rwsem_is_locked(rwsem) \ ++({ \ ++ unsigned long _flags_; \ ++ int _rc_; \ ++ spl_rwsem_lock_irqsave(&rwsem->wait_lock, _flags_); \ ++ _rc_ = rwsem_is_locked(rwsem); \ ++ spl_rwsem_unlock_irqrestore(&rwsem->wait_lock, _flags_); \ ++ _rc_; \ + }) + + #endif /* RWSEM_IS_LOCKED_TAKES_WAIT_LOCK */ +diff --git a/include/sys/rwlock.h b/include/sys/rwlock.h +index 3d98085..9d29ad6 100644 +--- a/include/sys/rwlock.h ++++ b/include/sys/rwlock.h +@@ -52,9 +52,9 @@ spl_rw_set_owner(krwlock_t *rwp) + { + unsigned long flags; + +- spin_lock_irqsave(&SEM(rwp)->wait_lock, flags); ++ spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, flags); + rwp->rw_owner = current; +- spin_unlock_irqrestore(&SEM(rwp)->wait_lock, flags); ++ spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, flags); + } + + static inline void +@@ -62,9 +62,9 @@ spl_rw_clear_owner(krwlock_t *rwp) + { + unsigned long flags; + +- spin_lock_irqsave(&SEM(rwp)->wait_lock, flags); ++ spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, flags); + rwp->rw_owner = NULL; +- spin_unlock_irqrestore(&SEM(rwp)->wait_lock, flags); ++ spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, flags); + } + + static inline kthread_t * +@@ -73,9 +73,9 @@ rw_owner(krwlock_t *rwp) + unsigned long flags; + kthread_t *owner; + +- spin_lock_irqsave(&SEM(rwp)->wait_lock, flags); ++ spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, flags); + owner = rwp->rw_owner; +- spin_unlock_irqrestore(&SEM(rwp)->wait_lock, flags); ++ spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, flags); + + return owner; + } +@@ -187,14 +187,14 @@ extern int __down_write_trylock_locked(struct rw_semaphore *); + unsigned long _flags_; \ + int _rc_ = 0; \ + \ +- spin_lock_irqsave(&SEM(rwp)->wait_lock, _flags_); \ ++ spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, _flags_); \ + if ((list_empty(&SEM(rwp)->wait_list)) && \ + (SEM(rwp)->activity == 1)) { \ + __up_read_locked(SEM(rwp)); \ + VERIFY(_rc_ = __down_write_trylock_locked(SEM(rwp))); \ + (rwp)->rw_owner = current; \ + } \ +- spin_unlock_irqrestore(&SEM(rwp)->wait_lock, _flags_); \ ++ spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, _flags_); \ + _rc_; \ + }) + #else +diff --git a/spl_config.h.in b/spl_config.h.in +index 94e28e7..847da21 100644 +--- a/spl_config.h.in ++++ b/spl_config.h.in +@@ -271,6 +271,9 @@ + /* rwsem_is_locked() acquires sem->wait_lock */ + #undef RWSEM_IS_LOCKED_TAKES_WAIT_LOCK + ++/* struct rw_semaphore member wait_lock is raw_spinlock_t */ ++#undef RWSEM_SPINLOCK_IS_RAW ++ + /* Define the project alias string. */ + #undef SPL_META_ALIAS + diff --git a/sys-devel/spl/spl-0.6.0_rc6-r1.ebuild b/sys-devel/spl/spl-0.6.0_rc6-r2.ebuild similarity index 91% rename from sys-devel/spl/spl-0.6.0_rc6-r1.ebuild rename to sys-devel/spl/spl-0.6.0_rc6-r2.ebuild index 8fedb94..7ea06cc 100644 --- a/sys-devel/spl/spl-0.6.0_rc6-r1.ebuild +++ b/sys-devel/spl/spl-0.6.0_rc6-r2.ebuild @@ -28,6 +28,8 @@ src_prepare() { epatch "${FILESDIR}"/${PN}-0.6.0-includedir.patch # Pinkbyte: fix build issue with 3.1 kernel epatch "${FILESDIR}"/${PN}-0.6.0-kernel-3.1-compat.patch + # Pinkbyte: add compatibility with 3.2 kernel + epatch "${FILESDIR}"/${PN}-0.6.0-kernel-3.2-compat.patch # eautoreconf # cd "${WORKDIR}" diff --git a/sys-devel/spl/spl-0.6.0_rc6.ebuild b/sys-devel/spl/spl-0.6.0_rc6.ebuild deleted file mode 100644 index d56c375..0000000 --- a/sys-devel/spl/spl-0.6.0_rc6.ebuild +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 1999-2011 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: $ - -EAPI="2" - -WANT_AUTOMAKE="1.11" -AT_M4DIR=./config # for aclocal called by eautoreconf -inherit linux-info eutils autotools - -DESCRIPTION="Solaris Porting Layer - a Linux kernel module providing some Solaris kernel APIs" -HOMEPAGE="http://zfsonlinux.org" -SRC_URI="http://github.com/downloads/zfsonlinux/${PN}/${P/_/-}.tar.gz" - -LICENSE="|| ( GPL-2 GPL-3 )" -SLOT="0" -KEYWORDS="~amd64 -x86" -IUSE="" - -DEPEND=" - virtual/linux-sources - " -RDEPEND="" - -S="${WORKDIR}/${P/_/-}" - -src_prepare() { - epatch "${FILESDIR}"/${PN}-0.6.0-includedir.patch - eautoreconf -# cd "${WORKDIR}" -# ./autogen.sh -} - -src_configure() { - set_arch_to_kernel - econf \ - --with-config=all \ - --with-linux="${KV_OUT_DIR}" \ - --with-linux-obj="${KV_OUT_DIR}" -} - -src_install() { - emake DESTDIR="${D}" install || die 'emake install failed' - dosym /usr/include/spl/spl_config.h /usr/include/spl/module/spl_config.h \ - || die -} diff --git a/sys-fs/zfs/Manifest b/sys-fs/zfs/Manifest index a4a5476..74851fe 100644 --- a/sys-fs/zfs/Manifest +++ b/sys-fs/zfs/Manifest @@ -1,7 +1,8 @@ AUX zfs-0.6.0-includedir.patch 586 RMD160 eb4cc6a9d66721e70c932b1dd640abd852d5470d SHA1 c673e057008b4cb7d4c45b936533e9bceff2443c SHA256 047a0cec35bcc5f8050fa80f8203ea020bf148375297c64300a9607f062cec2d AUX zfs-0.6.0-kernel-3.1-compat.patch 13773 RMD160 8fc8d5c5a3650c775fd2b6c954dc4a9a66a24bd8 SHA1 57d82b8ff26847f0eb202eccdc26eafa1ddbc270 SHA256 348c0b1a46490d63061478898c88c4164f20ce687eeb3af898578263e4329c2e +AUX zfs-0.6.0-kernel-3.2-compat.patch 44345 RMD160 d6a3c936d4dd22e6c7c8b58c4c05d2d2a613c268 SHA1 44b8fa5afe50e951a5142aa5af81586fb0e3f290 SHA256 3d1afb6c1b65b5d01d9a78dd1957273b5ea487a555a8a129c5bf70091b23df9d AUX zfs-9999-includedir.patch 601 RMD160 a75d2aca63f0b94a88003a9361c54cf54e77b533 SHA1 f0c60696b6bdfb349897c9b936ffb33b48a70cbf SHA256 d13c30e83548482cde91fb3366ab3d53bc5d0a554270c15a213e2dd15ec937ce AUX zfs.initd 2052 RMD160 3636ead94d4b7200cc221b9e9646b85a5c3acc1a SHA1 d59d5b475c3dc335bf70a24a7af80ef7a38df347 SHA256 ad5e5aa282f2942b23364b5dcb43b4edea5c3923559d18d624ca9bcb51218476 DIST zfs-0.6.0-rc6.tar.gz 1936503 RMD160 c5bcaa967fe70f5c72863f9e230850b37d76b8ce SHA1 70e6d4a6c97281df52e9c91ae577d15637804934 SHA256 b4f72580307d8b81fa9568fd46dccc993367402bf085adb9eca4dd1a24f323e0 -EBUILD zfs-0.6.0_rc6-r1.ebuild 1690 RMD160 e0e50f6aed9a5ec69166c7787e60cac9263b4c3a SHA1 37e25488c24b19dfc705528c279f4fbf6a043ca1 SHA256 7811f99cb2ea15b82f85a334b26bcfc90310ce01ce401495fc86ca67cb07b4fc +EBUILD zfs-0.6.0_rc6-r2.ebuild 1796 RMD160 02b868234d85e13e06f19a5acae6b0fd1d793e32 SHA1 558084a301f83ac59f959a66371c2996318727c5 SHA256 31a286d6a29996c39a4b633c682f0c4dea660160a317478d7e6599c519a34d78 EBUILD zfs-9999.ebuild 1478 RMD160 74c3c243479e0a5e648c8d20122bfe7802438c8a SHA1 245a203a145160d9fcb7a349fe12b28f291e836a SHA256 d94e9a20286df8ed2f407b08e3d71a29b24d8af5fbba20869a8bc7f7505f296c diff --git a/sys-fs/zfs/files/zfs-0.6.0-kernel-3.2-compat.patch b/sys-fs/zfs/files/zfs-0.6.0-kernel-3.2-compat.patch new file mode 100644 index 0000000..d023cdb --- /dev/null +++ b/sys-fs/zfs/files/zfs-0.6.0-kernel-3.2-compat.patch @@ -0,0 +1,1211 @@ +diff --git a/config/kernel-security-inode-init.m4 b/config/kernel-security-inode-init.m4 +index a26de9f..c21588a 100644 +--- a/config/kernel-security-inode-init.m4 ++++ b/config/kernel-security-inode-init.m4 +@@ -12,7 +12,14 @@ AC_DEFUN([ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY], [ + ZFS_LINUX_TRY_COMPILE([ + #include + ],[ +- security_inode_init_security(NULL,NULL,NULL,NULL,NULL,NULL); ++ struct inode *ip __attribute__ ((unused)) = NULL; ++ struct inode *dip __attribute__ ((unused)) = NULL; ++ const struct qstr *str __attribute__ ((unused)) = NULL; ++ char *name __attribute__ ((unused)) = NULL; ++ void *value __attribute__ ((unused)) = NULL; ++ size_t len __attribute__ ((unused)) = 0; ++ ++ security_inode_init_security(ip, dip, str, &name, &value, &len); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_6ARGS_SECURITY_INODE_INIT_SECURITY, 1, +@@ -22,3 +29,33 @@ AC_DEFUN([ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY], [ + ]) + EXTRA_KCFLAGS="$tmp_flags" + ]) ++ ++dnl # ++dnl # 3.2 API change ++dnl # The security_inode_init_security() API has been changed to include ++dnl # a filesystem specific callback to write security extended attributes. ++dnl # This was done to support the initialization of multiple LSM xattrs ++dnl # and the EVM xattr. ++dnl # ++AC_DEFUN([ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY], [ ++ AC_MSG_CHECKING([whether security_inode_init_security wants callback]) ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="-Werror" ++ ZFS_LINUX_TRY_COMPILE([ ++ #include ++ ],[ ++ struct inode *ip __attribute__ ((unused)) = NULL; ++ struct inode *dip __attribute__ ((unused)) = NULL; ++ const struct qstr *str __attribute__ ((unused)) = NULL; ++ initxattrs func __attribute__ ((unused)) = NULL; ++ ++ security_inode_init_security(ip, dip, str, func, NULL); ++ ],[ ++ AC_MSG_RESULT(yes) ++ AC_DEFINE(HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY, 1, ++ [security_inode_init_security wants callback]) ++ ],[ ++ AC_MSG_RESULT(no) ++ ]) ++ EXTRA_KCFLAGS="$tmp_flags" ++]) +diff --git a/config/kernel.m4 b/config/kernel.m4 +index 2afe77e..45e9b14 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -41,6 +41,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ + ZFS_AC_KERNEL_CHECK_DISK_SIZE_CHANGE + ZFS_AC_KERNEL_TRUNCATE_SETSIZE + ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY ++ ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY + ZFS_AC_KERNEL_MOUNT_NODEV + ZFS_AC_KERNEL_SHRINK + ZFS_AC_KERNEL_BDI +diff --git a/configure b/configure +index f30b1ff..5106738 100755 +--- a/configure ++++ b/configure +@@ -15144,7 +15144,14 @@ int + main (void) + { + +- security_inode_init_security(NULL,NULL,NULL,NULL,NULL,NULL); ++ struct inode *ip __attribute__ ((unused)) = NULL; ++ struct inode *dip __attribute__ ((unused)) = NULL; ++ const struct qstr *str __attribute__ ((unused)) = NULL; ++ char *name __attribute__ ((unused)) = NULL; ++ void *value __attribute__ ((unused)) = NULL; ++ size_t len __attribute__ ((unused)) = 0; ++ ++ security_inode_init_security(ip, dip, str, &name, &value, &len); + + ; + return 0; +@@ -15192,6 +15199,79 @@ fi + EXTRA_KCFLAGS="$tmp_flags" + + ++ { $as_echo "$as_me:$LINENO: checking whether security_inode_init_security wants callback" >&5 ++$as_echo_n "checking whether security_inode_init_security wants callback... " >&6; } ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="-Werror" ++ ++ ++cat confdefs.h - <<_ACEOF >conftest.c ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++ ++ #include ++ ++int ++main (void) ++{ ++ ++ struct inode *ip __attribute__ ((unused)) = NULL; ++ struct inode *dip __attribute__ ((unused)) = NULL; ++ const struct qstr *str __attribute__ ((unused)) = NULL; ++ initxattrs func __attribute__ ((unused)) = NULL; ++ ++ security_inode_init_security(ip, dip, str, func, NULL); ++ ++ ; ++ return 0; ++} ++ ++_ACEOF ++ ++ ++ rm -Rf build && mkdir -p build ++ echo "obj-m := conftest.o" >build/Makefile ++ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++ { $as_echo "$as_me:$LINENO: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY 1 ++_ACEOF ++ ++ ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ ++ ++fi ++ ++ rm -Rf build ++ ++ ++ EXTRA_KCFLAGS="$tmp_flags" ++ ++ + { $as_echo "$as_me:$LINENO: checking whether symbol mount_nodev is exported" >&5 + $as_echo_n "checking whether symbol mount_nodev is exported... " >&6; } + grep -q -E '[[:space:]]mount_nodev[[:space:]]' \ +@@ -20191,7 +20271,14 @@ int + main (void) + { + +- security_inode_init_security(NULL,NULL,NULL,NULL,NULL,NULL); ++ struct inode *ip __attribute__ ((unused)) = NULL; ++ struct inode *dip __attribute__ ((unused)) = NULL; ++ const struct qstr *str __attribute__ ((unused)) = NULL; ++ char *name __attribute__ ((unused)) = NULL; ++ void *value __attribute__ ((unused)) = NULL; ++ size_t len __attribute__ ((unused)) = 0; ++ ++ security_inode_init_security(ip, dip, str, &name, &value, &len); + + ; + return 0; +@@ -20239,6 +20326,79 @@ fi + EXTRA_KCFLAGS="$tmp_flags" + + ++ { $as_echo "$as_me:$LINENO: checking whether security_inode_init_security wants callback" >&5 ++$as_echo_n "checking whether security_inode_init_security wants callback... " >&6; } ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="-Werror" ++ ++ ++cat confdefs.h - <<_ACEOF >conftest.c ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++ ++ #include ++ ++int ++main (void) ++{ ++ ++ struct inode *ip __attribute__ ((unused)) = NULL; ++ struct inode *dip __attribute__ ((unused)) = NULL; ++ const struct qstr *str __attribute__ ((unused)) = NULL; ++ initxattrs func __attribute__ ((unused)) = NULL; ++ ++ security_inode_init_security(ip, dip, str, func, NULL); ++ ++ ; ++ return 0; ++} ++ ++_ACEOF ++ ++ ++ rm -Rf build && mkdir -p build ++ echo "obj-m := conftest.o" >build/Makefile ++ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++ { $as_echo "$as_me:$LINENO: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY 1 ++_ACEOF ++ ++ ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ ++ ++fi ++ ++ rm -Rf build ++ ++ ++ EXTRA_KCFLAGS="$tmp_flags" ++ ++ + { $as_echo "$as_me:$LINENO: checking whether symbol mount_nodev is exported" >&5 + $as_echo_n "checking whether symbol mount_nodev is exported... " >&6; } + grep -q -E '[[:space:]]mount_nodev[[:space:]]' \ +diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c +index 9117b7b..51c81ed 100644 +--- a/module/zfs/zpl_xattr.c ++++ b/module/zfs/zpl_xattr.c +@@ -606,6 +606,34 @@ __zpl_xattr_security_set(struct inode *ip, const char *name, + } + ZPL_XATTR_SET_WRAPPER(zpl_xattr_security_set); + ++#ifdef HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY ++static int ++__zpl_xattr_security_init(struct inode *ip, const struct xattr *xattrs, ++ void *fs_info) ++{ ++ const struct xattr *xattr; ++ int error = 0; ++ ++ for (xattr = xattrs; xattr->name != NULL; xattr++) { ++ error = __zpl_xattr_security_set(ip, ++ xattr->name, xattr->value, xattr->value_len, 0); ++ ++ if (error < 0) ++ break; ++ } ++ ++ return (error); ++} ++ ++int ++zpl_xattr_security_init(struct inode *ip, struct inode *dip, ++ const struct qstr *qstr) ++{ ++ return security_inode_init_security(ip, dip, qstr, ++ &__zpl_xattr_security_init, NULL); ++} ++ ++#else + int + zpl_xattr_security_init(struct inode *ip, struct inode *dip, + const struct qstr *qstr) +@@ -631,6 +659,7 @@ zpl_xattr_security_init(struct inode *ip, struct inode *dip, + + return (error); + } ++#endif /* HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY */ + + xattr_handler_t zpl_xattr_security_handler = { + .prefix = XATTR_SECURITY_PREFIX, +diff --git a/zfs_config.h.in b/zfs_config.h.in +index b53ca52..4eee892 100644 +--- a/zfs_config.h.in ++++ b/zfs_config.h.in +@@ -66,6 +66,9 @@ + /* blk_rq_sectors() is available */ + #undef HAVE_BLK_RQ_SECTORS + ++/* security_inode_init_security wants callback */ ++#undef HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY ++ + /* check_disk_size_change() is available */ + #undef HAVE_CHECK_DISK_SIZE_CHANGE + +diff --git a/Makefile.in b/Makefile.in +index 6c55040..332efc1 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -91,6 +91,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/Makefile.in b/cmd/Makefile.in +index f006e4c..ee3f4be 100644 +--- a/cmd/Makefile.in ++++ b/cmd/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/mount_zfs/Makefile.in b/cmd/mount_zfs/Makefile.in +index 3ae2015..e7da7c2 100644 +--- a/cmd/mount_zfs/Makefile.in ++++ b/cmd/mount_zfs/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/sas_switch_id/Makefile.in b/cmd/sas_switch_id/Makefile.in +index a23b35d..fb6ea65 100644 +--- a/cmd/sas_switch_id/Makefile.in ++++ b/cmd/sas_switch_id/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zdb/Makefile.in b/cmd/zdb/Makefile.in +index 7e0a88e..da31195 100644 +--- a/cmd/zdb/Makefile.in ++++ b/cmd/zdb/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zfs/Makefile.in b/cmd/zfs/Makefile.in +index 759492f..55ca808 100644 +--- a/cmd/zfs/Makefile.in ++++ b/cmd/zfs/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zinject/Makefile.in b/cmd/zinject/Makefile.in +index 77d8a10..5e6f90e 100644 +--- a/cmd/zinject/Makefile.in ++++ b/cmd/zinject/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zpios/Makefile.in b/cmd/zpios/Makefile.in +index 1374449..cf672f1 100644 +--- a/cmd/zpios/Makefile.in ++++ b/cmd/zpios/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zpool/Makefile.in b/cmd/zpool/Makefile.in +index df27c8c..b915006 100644 +--- a/cmd/zpool/Makefile.in ++++ b/cmd/zpool/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zpool_id/Makefile.in b/cmd/zpool_id/Makefile.in +index eefb09a..aadd124 100644 +--- a/cmd/zpool_id/Makefile.in ++++ b/cmd/zpool_id/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zpool_layout/Makefile.in b/cmd/zpool_layout/Makefile.in +index 9914ca1..e1b1643 100644 +--- a/cmd/zpool_layout/Makefile.in ++++ b/cmd/zpool_layout/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/ztest/Makefile.in b/cmd/ztest/Makefile.in +index 0ed7754..e99cc9e 100644 +--- a/cmd/ztest/Makefile.in ++++ b/cmd/ztest/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/cmd/zvol_id/Makefile.in b/cmd/zvol_id/Makefile.in +index 6b2af96..d6719fd 100644 +--- a/cmd/zvol_id/Makefile.in ++++ b/cmd/zvol_id/Makefile.in +@@ -71,6 +71,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/config/kernel-set-nlink.m4 b/config/kernel-set-nlink.m4 +new file mode 100644 +index 0000000..f7ffc0d +--- /dev/null ++++ b/config/kernel-set-nlink.m4 +@@ -0,0 +1,20 @@ ++dnl # ++dnl # Linux v3.2-rc1 API change ++dnl # SHA: bfe8684869601dacfcb2cd69ef8cfd9045f62170 ++dnl # ++AC_DEFUN([ZFS_AC_KERNEL_SET_NLINK], [ ++ AC_MSG_CHECKING([whether set_nlink() is available]) ++ ZFS_LINUX_TRY_COMPILE([ ++ #include ++ ],[ ++ struct inode node; ++ unsigned int link = 0; ++ (void) set_nlink(&node, link); ++ ],[ ++ AC_MSG_RESULT(yes) ++ AC_DEFINE(HAVE_SET_NLINK, 1, ++ [set_nlink() is available]) ++ ],[ ++ AC_MSG_RESULT(no) ++ ]) ++]) +diff --git a/config/kernel.m4 b/config/kernel.m4 +index 8cfbccf..63a3237 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -42,5 +42,6 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ + ZFS_AC_KERNEL_MOUNT_NODEV + ZFS_AC_KERNEL_BDI ++ ZFS_AC_KERNEL_SET_NLINK + + AS_IF([test "$LINUX_OBJ" != "$LINUX"], [ + KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" +diff --git a/configure b/configure +index 919a4dd..e9e2ec1 100755 +--- a/configure ++++ b/configure +@@ -15226,6 +15226,73 @@ fi + + + ++ { $as_echo "$as_me:$LINENO: checking whether set_nlink() is available" >&5 ++$as_echo_n "checking whether set_nlink() is available... " >&6; } ++ ++ ++cat confdefs.h - <<_ACEOF >conftest.c ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++ ++ #include ++ ++int ++main (void) ++{ ++ ++ struct inode node; ++ unsigned int link = 0; ++ (void) set_nlink(&node, link); ++ ++ ; ++ return 0; ++} ++ ++_ACEOF ++ ++ ++ rm -Rf build && mkdir -p build ++ echo "obj-m := conftest.o" >build/Makefile ++ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++ { $as_echo "$as_me:$LINENO: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_SET_NLINK 1 ++_ACEOF ++ ++ ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ ++ ++fi ++ ++ rm -Rf build ++ ++ ++ ++ + if test "$LINUX_OBJ" != "$LINUX"; then + + KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" +@@ -19996,6 +20063,73 @@ fi + + + ++ { $as_echo "$as_me:$LINENO: checking whether set_nlink() is available" >&5 ++$as_echo_n "checking whether set_nlink() is available... " >&6; } ++ ++ ++cat confdefs.h - <<_ACEOF >conftest.c ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++ ++ #include ++ ++int ++main (void) ++{ ++ ++ struct inode node; ++ unsigned int link = 0; ++ (void) set_nlink(&node, link); ++ ++ ; ++ return 0; ++} ++ ++_ACEOF ++ ++ ++ rm -Rf build && mkdir -p build ++ echo "obj-m := conftest.o" >build/Makefile ++ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ++ { $as_echo "$as_me:$LINENO: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_SET_NLINK 1 ++_ACEOF ++ ++ ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ { $as_echo "$as_me:$LINENO: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ ++ ++fi ++ ++ rm -Rf build ++ ++ ++ ++ + if test "$LINUX_OBJ" != "$LINUX"; then + + KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" +diff --git a/dracut/90zfs/Makefile.in b/dracut/90zfs/Makefile.in +index 07bf3f2..cc79618 100644 +--- a/dracut/90zfs/Makefile.in ++++ b/dracut/90zfs/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/dracut/Makefile.in b/dracut/Makefile.in +index b2769b1..1c6b3e6 100644 +--- a/dracut/Makefile.in ++++ b/dracut/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/etc/Makefile.in b/etc/Makefile.in +index 594db91..a2e3986 100644 +--- a/etc/Makefile.in ++++ b/etc/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/etc/init.d/Makefile.in b/etc/init.d/Makefile.in +index 31da3b6..9eb8ae7 100644 +--- a/etc/init.d/Makefile.in ++++ b/etc/init.d/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/etc/zfs/Makefile.in b/etc/zfs/Makefile.in +index 59c7b8e..6c81f5d 100644 +--- a/etc/zfs/Makefile.in ++++ b/etc/zfs/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/include/Makefile.in b/include/Makefile.in +index 9ea2e2f..f82fdb2 100644 +--- a/include/Makefile.in ++++ b/include/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/include/linux/Makefile.in b/include/linux/Makefile.in +index 5e04eb4..e50b89b 100644 +--- a/include/linux/Makefile.in ++++ b/include/linux/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h +index 825a7fd..371bbc1 100644 +--- a/include/linux/vfs_compat.h ++++ b/include/linux/vfs_compat.h +@@ -94,4 +94,19 @@ bdi_setup_and_register(struct backing_dev_info *bdi,char *name,unsigned int cap) + } + #endif /* HAVE_BDI && !HAVE_BDI_SETUP_AND_REGISTER */ + ++/* ++ * 3.2-rc1 API change, ++ * Add set_nlink() if it is not exported by the Linux kernel. ++ * ++ * i_nlink is read-only in Linux 3.2, but it can be set directly in ++ * earlier kernels. ++ */ ++#ifndef HAVE_SET_NLINK ++static inline void ++set_nlink(struct inode *inode, unsigned int nlink) ++{ ++ inode->i_nlink = nlink; ++} ++#endif /* HAVE_SET_NLINK */ ++ + #endif /* _ZFS_VFS_H */ +diff --git a/include/sys/Makefile.in b/include/sys/Makefile.in +index ad98df9..b17649b 100644 +--- a/include/sys/Makefile.in ++++ b/include/sys/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/include/sys/fm/Makefile.in b/include/sys/fm/Makefile.in +index b29c9f3..e3fd84c 100644 +--- a/include/sys/fm/Makefile.in ++++ b/include/sys/fm/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/include/sys/fm/fs/Makefile.in b/include/sys/fm/fs/Makefile.in +index 395e698..4095261 100644 +--- a/include/sys/fm/fs/Makefile.in ++++ b/include/sys/fm/fs/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/include/sys/fs/Makefile.in b/include/sys/fs/Makefile.in +index c6de71a..db73ab8 100644 +--- a/include/sys/fs/Makefile.in ++++ b/include/sys/fs/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/Makefile.in b/lib/Makefile.in +index e132c20..17f84a5 100644 +--- a/lib/Makefile.in ++++ b/lib/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libavl/Makefile.in b/lib/libavl/Makefile.in +index 38a8357..55bb04d 100644 +--- a/lib/libavl/Makefile.in ++++ b/lib/libavl/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libefi/Makefile.in b/lib/libefi/Makefile.in +index 9f23630..6e4a83b 100644 +--- a/lib/libefi/Makefile.in ++++ b/lib/libefi/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libnvpair/Makefile.in b/lib/libnvpair/Makefile.in +index 589938e..60439ae 100644 +--- a/lib/libnvpair/Makefile.in ++++ b/lib/libnvpair/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libshare/Makefile.in b/lib/libshare/Makefile.in +index c0c0786..94ea82e 100644 +--- a/lib/libshare/Makefile.in ++++ b/lib/libshare/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/Makefile.in b/lib/libspl/Makefile.in +index f0d3d76..194679a 100644 +--- a/lib/libspl/Makefile.in ++++ b/lib/libspl/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/asm-generic/Makefile.in b/lib/libspl/asm-generic/Makefile.in +index 2e29d93..a9ffb57 100644 +--- a/lib/libspl/asm-generic/Makefile.in ++++ b/lib/libspl/asm-generic/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/asm-i386/Makefile.in b/lib/libspl/asm-i386/Makefile.in +index d366650..ca65730 100644 +--- a/lib/libspl/asm-i386/Makefile.in ++++ b/lib/libspl/asm-i386/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/asm-x86_64/Makefile.in b/lib/libspl/asm-x86_64/Makefile.in +index b3b9042..2db49b3 100644 +--- a/lib/libspl/asm-x86_64/Makefile.in ++++ b/lib/libspl/asm-x86_64/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/Makefile.in b/lib/libspl/include/Makefile.in +index 4653fea..d7a8f52 100644 +--- a/lib/libspl/include/Makefile.in ++++ b/lib/libspl/include/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/ia32/Makefile.in b/lib/libspl/include/ia32/Makefile.in +index 3782302..b608928 100644 +--- a/lib/libspl/include/ia32/Makefile.in ++++ b/lib/libspl/include/ia32/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/ia32/sys/Makefile.in b/lib/libspl/include/ia32/sys/Makefile.in +index 9503ba6..3662996 100644 +--- a/lib/libspl/include/ia32/sys/Makefile.in ++++ b/lib/libspl/include/ia32/sys/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/rpc/Makefile.in b/lib/libspl/include/rpc/Makefile.in +index f3a7fd3..68e3c2f 100644 +--- a/lib/libspl/include/rpc/Makefile.in ++++ b/lib/libspl/include/rpc/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/sys/Makefile.in b/lib/libspl/include/sys/Makefile.in +index 8a69ebc..6851505 100644 +--- a/lib/libspl/include/sys/Makefile.in ++++ b/lib/libspl/include/sys/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/sys/dktp/Makefile.in b/lib/libspl/include/sys/dktp/Makefile.in +index 8cd6cbf..89c3285 100644 +--- a/lib/libspl/include/sys/dktp/Makefile.in ++++ b/lib/libspl/include/sys/dktp/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/sys/sysevent/Makefile.in b/lib/libspl/include/sys/sysevent/Makefile.in +index 2078025..de9db42 100644 +--- a/lib/libspl/include/sys/sysevent/Makefile.in ++++ b/lib/libspl/include/sys/sysevent/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libspl/include/util/Makefile.in b/lib/libspl/include/util/Makefile.in +index 91c91fa..d7cd17c 100644 +--- a/lib/libspl/include/util/Makefile.in ++++ b/lib/libspl/include/util/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libunicode/Makefile.in b/lib/libunicode/Makefile.in +index 932fb8a..f6c8690 100644 +--- a/lib/libunicode/Makefile.in ++++ b/lib/libunicode/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libuutil/Makefile.in b/lib/libuutil/Makefile.in +index c05c31c..d44bba2 100644 +--- a/lib/libuutil/Makefile.in ++++ b/lib/libuutil/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libzfs/Makefile.in b/lib/libzfs/Makefile.in +index 14db984..29642b1 100644 +--- a/lib/libzfs/Makefile.in ++++ b/lib/libzfs/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/lib/libzpool/Makefile.in b/lib/libzpool/Makefile.in +index 63297bc..0e46c15 100644 +--- a/lib/libzpool/Makefile.in ++++ b/lib/libzpool/Makefile.in +@@ -70,6 +70,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/man/Makefile.in b/man/Makefile.in +index e6a82e9..84c6c17 100644 +--- a/man/Makefile.in ++++ b/man/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/man/man8/Makefile.in b/man/man8/Makefile.in +index 98193db..be187c9 100644 +--- a/man/man8/Makefile.in ++++ b/man/man8/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c +index 1edbd7e..a35e3b5 100644 +--- a/module/zfs/zfs_znode.c ++++ b/module/zfs/zfs_znode.c +@@ -440,7 +440,7 @@ zfs_inode_update(znode_t *zp) + ip->i_generation = zp->z_gen; + ip->i_uid = zp->z_uid; + ip->i_gid = zp->z_gid; +- ip->i_nlink = zp->z_links; ++ set_nlink(ip, zp->z_links); + ip->i_mode = zp->z_mode; + ip->i_blkbits = SPA_MINBLOCKSHIFT; + dmu_object_size_from_db(sa_get_db(zp->z_sa_hdl), &blksize, +diff --git a/scripts/Makefile.in b/scripts/Makefile.in +index 966288d..5115a9e 100644 +--- a/scripts/Makefile.in ++++ b/scripts/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/scripts/zpios-profile/Makefile.in b/scripts/zpios-profile/Makefile.in +index a9ba3e7..1c59d74 100644 +--- a/scripts/zpios-profile/Makefile.in ++++ b/scripts/zpios-profile/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/scripts/zpios-test/Makefile.in b/scripts/zpios-test/Makefile.in +index e237411..fb11145 100644 +--- a/scripts/zpios-test/Makefile.in ++++ b/scripts/zpios-test/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/scripts/zpool-config/Makefile.in b/scripts/zpool-config/Makefile.in +index 1e887e6..2c4fcb9 100644 +--- a/scripts/zpool-config/Makefile.in ++++ b/scripts/zpool-config/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/scripts/zpool-layout/Makefile.in b/scripts/zpool-layout/Makefile.in +index 6106756..bebd47b 100644 +--- a/scripts/zpool-layout/Makefile.in ++++ b/scripts/zpool-layout/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/udev/Makefile.in b/udev/Makefile.in +index e1e5924..856d11a 100644 +--- a/udev/Makefile.in ++++ b/udev/Makefile.in +@@ -68,6 +68,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/udev/rules.d/Makefile.in b/udev/rules.d/Makefile.in +index dba7a45..37eb4c7 100644 +--- a/udev/rules.d/Makefile.in ++++ b/udev/rules.d/Makefile.in +@@ -69,6 +69,7 @@ am__aclocal_m4_deps = \ + $(top_srcdir)/config/kernel-rq-for-each_segment.m4 \ + $(top_srcdir)/config/kernel-rq-is_sync.m4 \ + $(top_srcdir)/config/kernel-security-inode-init.m4 \ ++ $(top_srcdir)/config/kernel-set-nlink.m4 \ + $(top_srcdir)/config/kernel-truncate-setsize.m4 \ + $(top_srcdir)/config/kernel-xattr-handler.m4 \ + $(top_srcdir)/config/kernel.m4 \ +diff --git a/zfs_config.h.in b/zfs_config.h.in +index 41d7ab1..e0f7467 100644 +--- a/zfs_config.h.in ++++ b/zfs_config.h.in +@@ -153,6 +153,9 @@ + /* rq_is_sync() is available */ + #undef HAVE_RQ_IS_SYNC + ++/* set_nlink() is available */ ++#undef HAVE_SET_NLINK ++ + /* Define to 1 if you have the header file. */ + #undef HAVE_STDINT_H + diff --git a/sys-fs/zfs/zfs-0.6.0_rc6-r1.ebuild b/sys-fs/zfs/zfs-0.6.0_rc6-r2.ebuild similarity index 94% rename from sys-fs/zfs/zfs-0.6.0_rc6-r1.ebuild rename to sys-fs/zfs/zfs-0.6.0_rc6-r2.ebuild index 7a3559e..5f42db4 100644 --- a/sys-fs/zfs/zfs-0.6.0_rc6-r1.ebuild +++ b/sys-fs/zfs/zfs-0.6.0_rc6-r2.ebuild @@ -42,6 +42,8 @@ src_prepare() { epatch "${FILESDIR}/${PN}-0.6.0-includedir.patch" # Pinkbyte: patch for kernel 3.1 compatibility epatch "${FILESDIR}/${PN}-0.6.0-kernel-3.1-compat.patch" + # Pinkbyte: patch for kernel 3.2 compatibility + epatch "${FILESDIR}/${PN}-0.6.0-kernel-3.2-compat.patch" # eautoreconf }