diff mbox

[ZESTY] UBUNTU: SAUCE: (noup) Update spl to 0.6.5.9-1ubuntu1, zfs to 0.6.5.9-5ubuntu5

Message ID 20170502143247.13413-1-colin.king@canonical.com
State New
Headers show

Commit Message

Colin Ian King May 2, 2017, 2:32 p.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Add upstream SPL compat patches from upstream to build with 4.11 kernel:
 - 8d5feecacfdcca Linux 4.11 compat: set_task_state() removed
 - 94b1ab2ae01e9e Linux 4.11 compat: vfs_getattr() takes 4 args
 - 9a054d54fb6772 Linux 4.11 compat: add linux/sched/signal.h
 - bf8abea4dade11 Linux 4.11 compat: remove stub for __put_task_struct

Add upstream ZFS compat patches from upstream to build with 4.11 kernel:
 - a3478c07475261 Linux 4.11 compat: iops.getattr and friends
 - 4859fe796c5b03 Linux 4.11 compat: avoid refcount_t name conflict

Tested and verified against the Ubuntu ZFS autotest regression tests

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 spl/META                           |   2 +-
 spl/config/spl-build.m4            | 108 +++++---
 spl/configure                      | 514 +++++++++++++++++++++----------------
 spl/include/sys/signal.h           |   4 +
 spl/module/spl/spl-err.c           |   4 +-
 spl/module/spl/spl-generic.c       |  16 --
 spl/module/spl/spl-vnode.c         |  13 +-
 spl/spl_config.h.in                |  12 +-
 zfs/META                           |   2 +-
 zfs/Makefile.in                    |   1 +
 zfs/aclocal.m4                     |   1 +
 zfs/config/kernel-inode-getattr.m4 |  67 +++++
 zfs/config/kernel.m4               |   1 +
 zfs/configure                      | 300 ++++++++++++++++++++++
 zfs/include/Makefile.in            |   1 +
 zfs/include/linux/Makefile.in      |   1 +
 zfs/include/linux/vfs_compat.h     |  43 ++++
 zfs/include/sys/Makefile.in        |   1 +
 zfs/include/sys/fm/Makefile.in     |   1 +
 zfs/include/sys/fm/fs/Makefile.in  |   1 +
 zfs/include/sys/fs/Makefile.in     |   1 +
 zfs/include/sys/refcount.h         |  17 +-
 zfs/module/zfs/refcount.c          |   2 +-
 zfs/module/zfs/zpl_ctldir.c        |  35 +--
 zfs/module/zfs/zpl_inode.c         |  11 +-
 zfs/zfs_config.h.in                |   6 +
 26 files changed, 855 insertions(+), 310 deletions(-)
 create mode 100644 zfs/config/kernel-inode-getattr.m4

Comments

Colin Ian King May 2, 2017, 3:57 p.m. UTC | #1
As pointed out by Seth to me, this should be for ARTFUL and not Zesty.

Colin

On 02/05/17 15:32, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Add upstream SPL compat patches from upstream to build with 4.11 kernel:
>  - 8d5feecacfdcca Linux 4.11 compat: set_task_state() removed
>  - 94b1ab2ae01e9e Linux 4.11 compat: vfs_getattr() takes 4 args
>  - 9a054d54fb6772 Linux 4.11 compat: add linux/sched/signal.h
>  - bf8abea4dade11 Linux 4.11 compat: remove stub for __put_task_struct
> 
> Add upstream ZFS compat patches from upstream to build with 4.11 kernel:
>  - a3478c07475261 Linux 4.11 compat: iops.getattr and friends
>  - 4859fe796c5b03 Linux 4.11 compat: avoid refcount_t name conflict
> 
> Tested and verified against the Ubuntu ZFS autotest regression tests
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  spl/META                           |   2 +-
>  spl/config/spl-build.m4            | 108 +++++---
>  spl/configure                      | 514 +++++++++++++++++++++----------------
>  spl/include/sys/signal.h           |   4 +
>  spl/module/spl/spl-err.c           |   4 +-
>  spl/module/spl/spl-generic.c       |  16 --
>  spl/module/spl/spl-vnode.c         |  13 +-
>  spl/spl_config.h.in                |  12 +-
>  zfs/META                           |   2 +-
>  zfs/Makefile.in                    |   1 +
>  zfs/aclocal.m4                     |   1 +
>  zfs/config/kernel-inode-getattr.m4 |  67 +++++
>  zfs/config/kernel.m4               |   1 +
>  zfs/configure                      | 300 ++++++++++++++++++++++
>  zfs/include/Makefile.in            |   1 +
>  zfs/include/linux/Makefile.in      |   1 +
>  zfs/include/linux/vfs_compat.h     |  43 ++++
>  zfs/include/sys/Makefile.in        |   1 +
>  zfs/include/sys/fm/Makefile.in     |   1 +
>  zfs/include/sys/fm/fs/Makefile.in  |   1 +
>  zfs/include/sys/fs/Makefile.in     |   1 +
>  zfs/include/sys/refcount.h         |  17 +-
>  zfs/module/zfs/refcount.c          |   2 +-
>  zfs/module/zfs/zpl_ctldir.c        |  35 +--
>  zfs/module/zfs/zpl_inode.c         |  11 +-
>  zfs/zfs_config.h.in                |   6 +
>  26 files changed, 855 insertions(+), 310 deletions(-)
>  create mode 100644 zfs/config/kernel-inode-getattr.m4
> 
> diff --git a/spl/META b/spl/META
> index c7b69beebec5..70fb5812607a 100644
> --- a/spl/META
> +++ b/spl/META
> @@ -2,7 +2,7 @@ Meta:         1
>  Name:         spl
>  Branch:       1.0
>  Version:      0.6.5.9
> -Release:      1
> +Release:      1ubuntu1
>  Release-Tags: relext
>  License:      GPL
>  Author:       OpenZFS on Linux
> diff --git a/spl/config/spl-build.m4 b/spl/config/spl-build.m4
> index 5a2f1ded2534..d886ddf15a46 100644
> --- a/spl/config/spl-build.m4
> +++ b/spl/config/spl-build.m4
> @@ -33,7 +33,6 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
>  	SPL_AC_INODE_TRUNCATE_RANGE
>  	SPL_AC_FS_STRUCT_SPINLOCK
>  	SPL_AC_KUIDGID_T
> -	SPL_AC_PUT_TASK_STRUCT
>  	SPL_AC_KERNEL_FALLOCATE
>  	SPL_AC_CONFIG_ZLIB_INFLATE
>  	SPL_AC_CONFIG_ZLIB_DEFLATE
> @@ -43,6 +42,9 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
>  	SPL_AC_RWSEM_ACTIVITY
>  	SPL_AC_RWSEM_ATOMIC_LONG_COUNT
>  	SPL_AC_SCHED_RT_HEADER
> +	SPL_AC_SCHED_SIGNAL_HEADER
> +	SPL_AC_4ARGS_VFS_GETATTR
> +	SPL_AC_3ARGS_VFS_GETATTR
>  	SPL_AC_2ARGS_VFS_GETATTR
>  	SPL_AC_USLEEP_RANGE
>  	SPL_AC_KMEM_CACHE_ALLOCFLAGS
> @@ -1082,25 +1084,6 @@ AC_DEFUN([SPL_AC_KUIDGID_T], [
>  ])
>  
>  dnl #
> -dnl # 2.6.39 API change,
> -dnl # __put_task_struct() was exported by the mainline kernel.
> -dnl #
> -AC_DEFUN([SPL_AC_PUT_TASK_STRUCT],
> -	[AC_MSG_CHECKING([whether __put_task_struct() is available])
> -	SPL_LINUX_TRY_COMPILE_SYMBOL([
> -		#include <linux/sched.h>
> -	], [
> -		__put_task_struct(NULL);
> -	], [__put_task_struct], [], [
> -		AC_MSG_RESULT(yes)
> -		AC_DEFINE(HAVE_PUT_TASK_STRUCT, 1,
> -		          [__put_task_struct() is available])
> -	], [
> -		AC_MSG_RESULT(no)
> -	])
> -])
> -
> -dnl #
>  dnl # 2.6.35 API change,
>  dnl # Unused 'struct dentry *' removed from vfs_fsync() prototype.
>  dnl #
> @@ -1409,33 +1392,84 @@ AC_DEFUN([SPL_AC_SCHED_RT_HEADER],
>  ])
>  
>  dnl #
> -dnl # 3.9 API change,
> -dnl # vfs_getattr() uses 2 args
> -dnl # It takes struct path * instead of struct vfsmount * and struct dentry *
> +dnl # 4.11 API change,
> +dnl # Moved things from linux/sched.h to linux/sched/signal.h
> +dnl #
> +AC_DEFUN([SPL_AC_SCHED_SIGNAL_HEADER],
> +	[AC_MSG_CHECKING([whether header linux/sched/signal.h exists])
> +	SPL_LINUX_TRY_COMPILE([
> +		#include <linux/sched.h>
> +		#include <linux/sched/signal.h>
> +	],[
> +		return 0;
> +	],[
> +		AC_DEFINE(HAVE_SCHED_SIGNAL_HEADER, 1, [linux/sched/signal.h exists])
> +		AC_MSG_RESULT(yes)
> +	],[
> +		AC_MSG_RESULT(no)
> +	])
> +])
> +
> +dnl #
> +dnl # 4.11 API, a528d35e@torvalds/linux
> +dnl # vfs_getattr(const struct path *p, struct kstat *s, u32 m, unsigned int f)
> +dnl #
> +AC_DEFUN([SPL_AC_4ARGS_VFS_GETATTR], [
> +	AC_MSG_CHECKING([whether vfs_getattr() wants 4 args])
> +	SPL_LINUX_TRY_COMPILE([
> +		#include <linux/fs.h>
> +	],[
> +		vfs_getattr((const struct path *)NULL,
> +			(struct kstat *)NULL,
> +			(u32)0,
> +			(unsigned int)0);
> +	],[
> +		AC_MSG_RESULT(yes)
> +		AC_DEFINE(HAVE_4ARGS_VFS_GETATTR, 1,
> +		  [vfs_getattr wants 4 args])
> +	],[
> +		AC_MSG_RESULT(no)
> +	])
> +])
> +
> +dnl #
> +dnl # 3.9 API 
> +dnl # vfs_getattr(struct path *p, struct kstat *s)
>  dnl #
>  AC_DEFUN([SPL_AC_2ARGS_VFS_GETATTR], [
> -	AC_MSG_CHECKING([whether vfs_getattr() wants])
> +	AC_MSG_CHECKING([whether vfs_getattr() wants 2 args])
>  	SPL_LINUX_TRY_COMPILE([
>  		#include <linux/fs.h>
>  	],[
>  		vfs_getattr((struct path *) NULL,
>  			(struct kstat *)NULL);
>  	],[
> -		AC_MSG_RESULT(2 args)
> +		AC_MSG_RESULT(yes)
>  		AC_DEFINE(HAVE_2ARGS_VFS_GETATTR, 1,
> -		          [vfs_getattr wants 2 args])
> +			  [vfs_getattr wants 2 args])
>  	],[
> -		SPL_LINUX_TRY_COMPILE([
> -			#include <linux/fs.h>
> -		],[
> -			vfs_getattr((struct vfsmount *)NULL,
> -				(struct dentry *)NULL,
> -				(struct kstat *)NULL);
> -		],[
> -			AC_MSG_RESULT(3 args)
> -		],[
> -			AC_MSG_ERROR(unknown)
> -		])
> +		AC_MSG_RESULT(no)
> +	])
> +])
> +
> +dnl #
> +dnl # <3.9 API 
> +dnl # vfs_getattr(struct vfsmount *v, struct dentry *d, struct kstat *k)
> +dnl #
> +AC_DEFUN([SPL_AC_3ARGS_VFS_GETATTR], [
> +	AC_MSG_CHECKING([whether vfs_getattr() wants 3 args])
> +	SPL_LINUX_TRY_COMPILE([
> +		#include <linux/fs.h>
> +	],[
> +		vfs_getattr((struct vfsmount *)NULL,
> +			(struct dentry *)NULL,
> +			(struct kstat *)NULL);
> +	],[
> +		AC_MSG_RESULT(yes)
> +		AC_DEFINE(HAVE_3ARGS_VFS_GETATTR, 1,
> +		  [vfs_getattr wants 3 args])
> +	],[
> +		AC_MSG_RESULT(no)
>  	])
>  ])
>  
> diff --git a/spl/configure b/spl/configure
> index 5e323aeee320..9f493590abed 100755
> --- a/spl/configure
> +++ b/spl/configure
> @@ -14018,104 +14018,6 @@ fi
>  
>  
>  
> -	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __put_task_struct() is available" >&5
> -$as_echo_n "checking whether __put_task_struct() is available... " >&6; }
> -
> -
> -
> -cat confdefs.h - <<_ACEOF >conftest.c
> -
> -
> -		#include <linux/sched.h>
> -
> -int
> -main (void)
> -{
> -
> -		__put_task_struct(NULL);
> -
> -  ;
> -  return 0;
> -}
> -
> -_ACEOF
> -
> -
> -	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> -	echo "obj-m := conftest.o" >build/Makefile
> -	modpost_flag=''
> -	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> -	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 $modpost_flag'
> -  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> -  (eval $ac_try) 2>&5
> -  ac_status=$?
> -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> -  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> -  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> -  (eval $ac_try) 2>&5
> -  ac_status=$?
> -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> -  test $ac_status = 0; }; }; then :
> -  rc=0
> -else
> -  $as_echo "$as_me: failed program was:" >&5
> -sed 's/^/| /' conftest.$ac_ext >&5
> - rc=1
> -
> -
> -fi
> -	rm -Rf build
> -
> -
> -	if test $rc -ne 0; then :
> -
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> -$as_echo "no" >&6; }
> -
> -	else
> -		if test "x$enable_linux_builtin" != xyes; then
> -
> -	grep -q -E '[[:space:]]__put_task_struct[[:space:]]' \
> -		$LINUX_OBJ/Module*.symvers 2>/dev/null
> -	rc=$?
> -	if test $rc -ne 0; then
> -		export=0
> -		for file in ; do
> -			grep -q -E "EXPORT_SYMBOL.*(__put_task_struct)" \
> -				"$LINUX_OBJ/$file" 2>/dev/null
> -			rc=$?
> -			if test $rc -eq 0; then
> -				export=1
> -				break;
> -			fi
> -		done
> -		if test $export -eq 0; then :
> -			rc=1
> -		else :
> -			rc=0
> -		fi
> -	else :
> -		rc=0
> -	fi
> -
> -		fi
> -		if test $rc -ne 0; then :
> -
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> -$as_echo "no" >&6; }
> -
> -		else :
> -
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> -$as_echo "yes" >&6; }
> -
> -$as_echo "#define HAVE_PUT_TASK_STRUCT 1" >>confdefs.h
> -
> -
> -		fi
> -	fi
> -
> -
>  
>  
>  	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fops->fallocate() exists" >&5
> @@ -14793,9 +14695,68 @@ fi
>  
>  
>  
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether header linux/sched/signal.h exists" >&5
> +$as_echo_n "checking whether header linux/sched/signal.h exists... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/sched.h>
> +		#include <linux/sched/signal.h>
> +
> +int
> +main (void)
> +{
> +
> +		return 0;
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	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 $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +
> +$as_echo "#define HAVE_SCHED_SIGNAL_HEADER 1" >>confdefs.h
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
>  
> -	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants" >&5
> -$as_echo_n "checking whether vfs_getattr() wants... " >&6; }
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 4 args" >&5
> +$as_echo_n "checking whether vfs_getattr() wants 4 args... " >&6; }
>  
>  
>  cat confdefs.h - <<_ACEOF >conftest.c
> @@ -14807,8 +14768,10 @@ int
>  main (void)
>  {
>  
> -		vfs_getattr((struct path *) NULL,
> -			(struct kstat *)NULL);
> +		vfs_getattr((const struct path *)NULL,
> +			(struct kstat *)NULL,
> +			(u32)0,
> +			(unsigned int)0);
>  
>    ;
>    return 0;
> @@ -14833,30 +14796,43 @@ _ACEOF
>    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
>    test $ac_status = 0; }; }; then :
>  
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 2 args" >&5
> -$as_echo "2 args" >&6; }
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
>  
> -$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
> +$as_echo "#define HAVE_4ARGS_VFS_GETATTR 1" >>confdefs.h
>  
>  
>  else
>    $as_echo "$as_me: failed program was:" >&5
>  sed 's/^/| /' conftest.$ac_ext >&5
>  
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
> +
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 3 args" >&5
> +$as_echo_n "checking whether vfs_getattr() wants 3 args... " >&6; }
>  
>  
>  cat confdefs.h - <<_ACEOF >conftest.c
>  
>  
> -			#include <linux/fs.h>
> +		#include <linux/fs.h>
>  
>  int
>  main (void)
>  {
>  
> -			vfs_getattr((struct vfsmount *)NULL,
> -				(struct dentry *)NULL,
> -				(struct kstat *)NULL);
> +		vfs_getattr((struct vfsmount *)NULL,
> +			(struct dentry *)NULL,
> +			(struct kstat *)NULL);
>  
>    ;
>    return 0;
> @@ -14881,14 +14857,18 @@ _ACEOF
>    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
>    test $ac_status = 0; }; }; then :
>  
> -			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 3 args" >&5
> -$as_echo "3 args" >&6; }
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_3ARGS_VFS_GETATTR 1" >>confdefs.h
> +
>  
>  else
>    $as_echo "$as_me: failed program was:" >&5
>  sed 's/^/| /' conftest.$ac_ext >&5
>  
> -			as_fn_error $? "unknown" "$LINENO" 5
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
>  
>  
>  
> @@ -14898,6 +14878,59 @@ fi
>  
>  
>  
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 2 args" >&5
> +$as_echo_n "checking whether vfs_getattr() wants 2 args... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/fs.h>
> +
> +int
> +main (void)
> +{
> +
> +		vfs_getattr((struct path *) NULL,
> +			(struct kstat *)NULL);
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	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 $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
> +
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
>  
>  fi
>  	rm -Rf build
> @@ -16969,104 +17002,6 @@ fi
>  
>  
>  
> -	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __put_task_struct() is available" >&5
> -$as_echo_n "checking whether __put_task_struct() is available... " >&6; }
> -
> -
> -
> -cat confdefs.h - <<_ACEOF >conftest.c
> -
> -
> -		#include <linux/sched.h>
> -
> -int
> -main (void)
> -{
> -
> -		__put_task_struct(NULL);
> -
> -  ;
> -  return 0;
> -}
> -
> -_ACEOF
> -
> -
> -	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> -	echo "obj-m := conftest.o" >build/Makefile
> -	modpost_flag=''
> -	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> -	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 $modpost_flag'
> -  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> -  (eval $ac_try) 2>&5
> -  ac_status=$?
> -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> -  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> -  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> -  (eval $ac_try) 2>&5
> -  ac_status=$?
> -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> -  test $ac_status = 0; }; }; then :
> -  rc=0
> -else
> -  $as_echo "$as_me: failed program was:" >&5
> -sed 's/^/| /' conftest.$ac_ext >&5
> - rc=1
> -
> -
> -fi
> -	rm -Rf build
> -
> -
> -	if test $rc -ne 0; then :
> -
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> -$as_echo "no" >&6; }
> -
> -	else
> -		if test "x$enable_linux_builtin" != xyes; then
> -
> -	grep -q -E '[[:space:]]__put_task_struct[[:space:]]' \
> -		$LINUX_OBJ/Module*.symvers 2>/dev/null
> -	rc=$?
> -	if test $rc -ne 0; then
> -		export=0
> -		for file in ; do
> -			grep -q -E "EXPORT_SYMBOL.*(__put_task_struct)" \
> -				"$LINUX_OBJ/$file" 2>/dev/null
> -			rc=$?
> -			if test $rc -eq 0; then
> -				export=1
> -				break;
> -			fi
> -		done
> -		if test $export -eq 0; then :
> -			rc=1
> -		else :
> -			rc=0
> -		fi
> -	else :
> -		rc=0
> -	fi
> -
> -		fi
> -		if test $rc -ne 0; then :
> -
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> -$as_echo "no" >&6; }
> -
> -		else :
> -
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> -$as_echo "yes" >&6; }
> -
> -$as_echo "#define HAVE_PUT_TASK_STRUCT 1" >>confdefs.h
> -
> -
> -		fi
> -	fi
> -
> -
>  
>  
>  	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fops->fallocate() exists" >&5
> @@ -17744,9 +17679,68 @@ fi
>  
>  
>  
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether header linux/sched/signal.h exists" >&5
> +$as_echo_n "checking whether header linux/sched/signal.h exists... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/sched.h>
> +		#include <linux/sched/signal.h>
> +
> +int
> +main (void)
> +{
> +
> +		return 0;
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	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 $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +
> +$as_echo "#define HAVE_SCHED_SIGNAL_HEADER 1" >>confdefs.h
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
>  
> -	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants" >&5
> -$as_echo_n "checking whether vfs_getattr() wants... " >&6; }
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 4 args" >&5
> +$as_echo_n "checking whether vfs_getattr() wants 4 args... " >&6; }
>  
>  
>  cat confdefs.h - <<_ACEOF >conftest.c
> @@ -17758,8 +17752,10 @@ int
>  main (void)
>  {
>  
> -		vfs_getattr((struct path *) NULL,
> -			(struct kstat *)NULL);
> +		vfs_getattr((const struct path *)NULL,
> +			(struct kstat *)NULL,
> +			(u32)0,
> +			(unsigned int)0);
>  
>    ;
>    return 0;
> @@ -17784,30 +17780,43 @@ _ACEOF
>    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
>    test $ac_status = 0; }; }; then :
>  
> -		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 2 args" >&5
> -$as_echo "2 args" >&6; }
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
>  
> -$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
> +$as_echo "#define HAVE_4ARGS_VFS_GETATTR 1" >>confdefs.h
>  
>  
>  else
>    $as_echo "$as_me: failed program was:" >&5
>  sed 's/^/| /' conftest.$ac_ext >&5
>  
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
> +
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 3 args" >&5
> +$as_echo_n "checking whether vfs_getattr() wants 3 args... " >&6; }
>  
>  
>  cat confdefs.h - <<_ACEOF >conftest.c
>  
>  
> -			#include <linux/fs.h>
> +		#include <linux/fs.h>
>  
>  int
>  main (void)
>  {
>  
> -			vfs_getattr((struct vfsmount *)NULL,
> -				(struct dentry *)NULL,
> -				(struct kstat *)NULL);
> +		vfs_getattr((struct vfsmount *)NULL,
> +			(struct dentry *)NULL,
> +			(struct kstat *)NULL);
>  
>    ;
>    return 0;
> @@ -17832,14 +17841,18 @@ _ACEOF
>    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
>    test $ac_status = 0; }; }; then :
>  
> -			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 3 args" >&5
> -$as_echo "3 args" >&6; }
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_3ARGS_VFS_GETATTR 1" >>confdefs.h
> +
>  
>  else
>    $as_echo "$as_me: failed program was:" >&5
>  sed 's/^/| /' conftest.$ac_ext >&5
>  
> -			as_fn_error $? "unknown" "$LINENO" 5
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
>  
>  
>  
> @@ -17849,6 +17862,59 @@ fi
>  
>  
>  
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 2 args" >&5
> +$as_echo_n "checking whether vfs_getattr() wants 2 args... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/fs.h>
> +
> +int
> +main (void)
> +{
> +
> +		vfs_getattr((struct path *) NULL,
> +			(struct kstat *)NULL);
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	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 $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
> +
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
>  
>  fi
>  	rm -Rf build
> diff --git a/spl/include/sys/signal.h b/spl/include/sys/signal.h
> index 823fea32912e..77cc2d3c2fb5 100644
> --- a/spl/include/sys/signal.h
> +++ b/spl/include/sys/signal.h
> @@ -27,6 +27,10 @@
>  
>  #include <linux/sched.h>
>  
> +#ifdef HAVE_SCHED_SIGNAL_HEADER
> +#include <linux/sched/signal.h>
> +#endif
> +
>  #define	FORREAL		0	/* Usual side-effects */
>  #define	JUSTLOOKING	1	/* Don't stop the process */
>  
> diff --git a/spl/module/spl/spl-err.c b/spl/module/spl/spl-err.c
> index 14ff8a3373f5..cf9f096b11cb 100644
> --- a/spl/module/spl/spl-err.c
> +++ b/spl/module/spl/spl-err.c
> @@ -65,7 +65,7 @@ spl_panic(const char *file, const char *func, int line, const char *fmt, ...) {
>  	spl_dumpstack();
>  
>  	/* Halt the thread to facilitate further debugging */
> -	set_task_state(current, TASK_UNINTERRUPTIBLE);
> +	set_current_state(TASK_UNINTERRUPTIBLE);
>  	while (1)
>  		schedule();
>  
> @@ -98,7 +98,7 @@ vcmn_err(int ce, const char *fmt, va_list ap)
>  		spl_dumpstack();
>  
>  		/* Halt the thread to facilitate further debugging */
> -		set_task_state(current, TASK_UNINTERRUPTIBLE);
> +		set_current_state(TASK_UNINTERRUPTIBLE);
>  		while (1)
>  			schedule();
>  	}
> diff --git a/spl/module/spl/spl-generic.c b/spl/module/spl/spl-generic.c
> index c01a646a4d5d..b2bd1b837a9f 100644
> --- a/spl/module/spl/spl-generic.c
> +++ b/spl/module/spl/spl-generic.c
> @@ -351,22 +351,6 @@ ddi_copyout(const void *from, void *to, size_t len, int flags)
>  }
>  EXPORT_SYMBOL(ddi_copyout);
>  
> -#ifndef HAVE_PUT_TASK_STRUCT
> -/*
> - * This is only a stub function which should never be used.  The SPL should
> - * never be putting away the last reference on a task structure so this will
> - * not be called.  However, we still need to define it so the module does not
> - * have undefined symbol at load time.  That all said if this impossible
> - * thing does somehow happen PANIC immediately so we know about it.
> - */
> -void
> -__put_task_struct(struct task_struct *t)
> -{
> -	PANIC("Unexpectly put last reference on task %d\n", (int)t->pid);
> -}
> -EXPORT_SYMBOL(__put_task_struct);
> -#endif /* HAVE_PUT_TASK_STRUCT */
> -
>  /*
>   * Read the unique system identifier from the /etc/hostid file.
>   *
> diff --git a/spl/module/spl/spl-vnode.c b/spl/module/spl/spl-vnode.c
> index f1ebcd2d63c7..a548d37f7acb 100644
> --- a/spl/module/spl/spl-vnode.c
> +++ b/spl/module/spl/spl-vnode.c
> @@ -156,7 +156,9 @@ vn_open(const char *path, uio_seg_t seg, int flags, int mode,
>  	if (IS_ERR(fp))
>  		return (-PTR_ERR(fp));
>  
> -#ifdef HAVE_2ARGS_VFS_GETATTR
> +#if defined(HAVE_4ARGS_VFS_GETATTR)
> +	rc = vfs_getattr(&fp->f_path, &stat, STATX_TYPE, AT_STATX_SYNC_AS_STAT);
> +#elif defined(HAVE_2ARGS_VFS_GETATTR)
>  	rc = vfs_getattr(&fp->f_path, &stat);
>  #else
>  	rc = vfs_getattr(fp->f_path.mnt, fp->f_dentry, &stat);
> @@ -514,7 +516,10 @@ vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4)
>  
>  	fp = vp->v_file;
>  
> -#ifdef HAVE_2ARGS_VFS_GETATTR
> +#if defined(HAVE_4ARGS_VFS_GETATTR)
> +	rc = vfs_getattr(&fp->f_path, &stat, STATX_BASIC_STATS,
> +	    AT_STATX_SYNC_AS_STAT);
> +#elif defined(HAVE_2ARGS_VFS_GETATTR)
>  	rc = vfs_getattr(&fp->f_path, &stat);
>  #else
>  	rc = vfs_getattr(fp->f_path.mnt, fp->f_dentry, &stat);
> @@ -684,7 +689,9 @@ vn_getf(int fd)
>  	if (vp == NULL)
>  		goto out_fget;
>  
> -#ifdef HAVE_2ARGS_VFS_GETATTR
> +#if defined(HAVE_4ARGS_VFS_GETATTR)
> +	rc = vfs_getattr(&lfp->f_path, &stat, STATX_TYPE, AT_STATX_SYNC_AS_STAT);
> +#elif defined(HAVE_2ARGS_VFS_GETATTR)
>  	rc = vfs_getattr(&lfp->f_path, &stat);
>  #else
>  	rc = vfs_getattr(lfp->f_path.mnt, lfp->f_dentry, &stat);
> diff --git a/spl/spl_config.h.in b/spl/spl_config.h.in
> index 463c5f98f5a8..7cd020be1151 100644
> --- a/spl/spl_config.h.in
> +++ b/spl/spl_config.h.in
> @@ -30,9 +30,15 @@
>  /* old shrinker callback wants 3 args */
>  #undef HAVE_3ARGS_SHRINKER_CALLBACK
>  
> +/* vfs_getattr wants 3 args */
> +#undef HAVE_3ARGS_VFS_GETATTR
> +
>  /* vfs_unlink() wants 3 args */
>  #undef HAVE_3ARGS_VFS_UNLINK
>  
> +/* vfs_getattr wants 4 args */
> +#undef HAVE_4ARGS_VFS_GETATTR
> +
>  /* vfs_rename() wants 4 args */
>  #undef HAVE_4ARGS_VFS_RENAME
>  
> @@ -90,9 +96,6 @@
>  /* yes */
>  #undef HAVE_PDE_DATA
>  
> -/* __put_task_struct() is available */
> -#undef HAVE_PUT_TASK_STRUCT
> -
>  /* struct rw_semaphore has member activity */
>  #undef HAVE_RWSEM_ACTIVITY
>  
> @@ -102,6 +105,9 @@
>  /* linux/sched/rt.h exists */
>  #undef HAVE_SCHED_RT_HEADER
>  
> +/* linux/sched/signal.h exists */
> +#undef HAVE_SCHED_SIGNAL_HEADER
> +
>  /* set_fs_pwd() needs const path * */
>  #undef HAVE_SET_FS_PWD_WITH_CONST
>  
> diff --git a/zfs/META b/zfs/META
> index e5c868850eeb..9719514df84b 100644
> --- a/zfs/META
> +++ b/zfs/META
> @@ -2,7 +2,7 @@ Meta:         1
>  Name:         zfs
>  Branch:       1.0
>  Version:      0.6.5.9
> -Release:      2
> +Release:      5ubuntu5
>  Release-Tags: relext
>  License:      CDDL
>  Author:       OpenZFS on Linux
> diff --git a/zfs/Makefile.in b/zfs/Makefile.in
> index 3147144bb35e..76d341c30e1a 100644
> --- a/zfs/Makefile.in
> +++ b/zfs/Makefile.in
> @@ -147,6 +147,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/aclocal.m4 b/zfs/aclocal.m4
> index 51a5d6fd9317..95ba8522e75b 100644
> --- a/zfs/aclocal.m4
> +++ b/zfs/aclocal.m4
> @@ -1254,6 +1254,7 @@ m4_include([config/kernel-generic_readlink.m4])
>  m4_include([config/kernel-get-disk-ro.m4])
>  m4_include([config/kernel-get-gendisk.m4])
>  m4_include([config/kernel-get-link.m4])
> +m4_include([config/kernel-inode-getattr.m4])
>  m4_include([config/kernel-insert-inode-locked.m4])
>  m4_include([config/kernel-invalidate-bdev-args.m4])
>  m4_include([config/kernel-is_owner_or_cap.m4])
> diff --git a/zfs/config/kernel-inode-getattr.m4 b/zfs/config/kernel-inode-getattr.m4
> new file mode 100644
> index 000000000000..f10e0b251085
> --- /dev/null
> +++ b/zfs/config/kernel-inode-getattr.m4
> @@ -0,0 +1,67 @@
> +dnl #
> +dnl # Linux 4.11 API
> +dnl # See torvalds/linux@a528d35
> +dnl #
> +AC_DEFUN([ZFS_AC_PATH_KERNEL_IOPS_GETATTR], [
> +	AC_MSG_CHECKING([whether iops->getattr() takes a path])
> +	ZFS_LINUX_TRY_COMPILE([
> +		#include <linux/fs.h>
> +
> +		int test_getattr(
> +		    const struct path *p, struct kstat *k,
> +		    u32 request_mask, unsigned int query_flags)
> +		    { return 0; }
> +
> +		static const struct inode_operations
> +		    iops __attribute__ ((unused)) = {
> +			.getattr = test_getattr,
> +		};
> +	],[
> +	],[
> +		AC_MSG_RESULT(yes)
> +		AC_DEFINE(HAVE_PATH_IOPS_GETATTR, 1,
> +		    [iops->getattr() takes a path])
> +	],[
> +		AC_MSG_RESULT(no)
> +	])
> +])
> +
> +
> +
> +dnl #
> +dnl # Linux 3.9 - 4.10 API
> +dnl #
> +AC_DEFUN([ZFS_AC_VFSMOUNT_KERNEL_IOPS_GETATTR], [
> +	AC_MSG_CHECKING([whether iops->getattr() takes a vfsmount])
> +	ZFS_LINUX_TRY_COMPILE([
> +		#include <linux/fs.h>
> +
> +		int test_getattr(
> +		    struct vfsmount *mnt, struct dentry *d,
> +		    struct kstat *k)
> +		    { return 0; }
> +
> +		static const struct inode_operations
> +		    iops __attribute__ ((unused)) = {
> +			.getattr = test_getattr,
> +		};
> +	],[
> +	],[
> +		AC_MSG_RESULT(yes)
> +		AC_DEFINE(HAVE_VFSMOUNT_IOPS_GETATTR, 1,
> +		    [iops->getattr() takes a vfsmount])
> +	],[
> +		AC_MSG_RESULT(no)
> +	])
> +])
> +
> +
> +dnl #
> +dnl # The interface of the getattr callback from the inode_operations
> +dnl # structure changed.  Also, the interface of the simple_getattr()
> +dnl # function provided by the kernel changed.
> +dnl #
> +AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR], [
> +	ZFS_AC_PATH_KERNEL_IOPS_GETATTR
> +	ZFS_AC_VFSMOUNT_KERNEL_IOPS_GETATTR
> +])
> diff --git a/zfs/config/kernel.m4 b/zfs/config/kernel.m4
> index 5b8abf75160b..9ca48a2c94b8 100644
> --- a/zfs/config/kernel.m4
> +++ b/zfs/config/kernel.m4
> @@ -58,6 +58,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
>  	ZFS_AC_KERNEL_INODE_OPERATIONS_CHECK_ACL_WITH_FLAGS
>  	ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL
>  	ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
> +	ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR
>  	ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
>  	ZFS_AC_KERNEL_SHOW_OPTIONS
>  	ZFS_AC_KERNEL_FILE_INODE
> diff --git a/zfs/configure b/zfs/configure
> index 984208cf9cbf..48e8e3277e79 100755
> --- a/zfs/configure
> +++ b/zfs/configure
> @@ -19349,6 +19349,156 @@ fi
>  
>  
>  
> +
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a path" >&5
> +$as_echo_n "checking whether iops->getattr() takes a path... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/fs.h>
> +
> +		int test_getattr(
> +		    const struct path *p, struct kstat *k,
> +		    u32 request_mask, unsigned int query_flags)
> +		    { return 0; }
> +
> +		static const struct inode_operations
> +		    iops __attribute__ ((unused)) = {
> +			.getattr = test_getattr,
> +		};
> +
> +int
> +main (void)
> +{
> +
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +
> +cat - <<_ACEOF >conftest.h
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_PATH_IOPS_GETATTR 1" >>confdefs.h
> +
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
> +
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a vfsmount" >&5
> +$as_echo_n "checking whether iops->getattr() takes a vfsmount... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/fs.h>
> +
> +		int test_getattr(
> +		    struct vfsmount *mnt, struct dentry *d,
> +		    struct kstat *k)
> +		    { return 0; }
> +
> +		static const struct inode_operations
> +		    iops __attribute__ ((unused)) = {
> +			.getattr = test_getattr,
> +		};
> +
> +int
> +main (void)
> +{
> +
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +
> +cat - <<_ACEOF >conftest.h
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_VFSMOUNT_IOPS_GETATTR 1" >>confdefs.h
> +
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
> +
> +
>  	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uncached_acl_sentinel() exists" >&5
>  $as_echo_n "checking whether uncached_acl_sentinel() exists... " >&6; }
>  
> @@ -30223,6 +30373,156 @@ fi
>  
>  
>  
> +
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a path" >&5
> +$as_echo_n "checking whether iops->getattr() takes a path... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/fs.h>
> +
> +		int test_getattr(
> +		    const struct path *p, struct kstat *k,
> +		    u32 request_mask, unsigned int query_flags)
> +		    { return 0; }
> +
> +		static const struct inode_operations
> +		    iops __attribute__ ((unused)) = {
> +			.getattr = test_getattr,
> +		};
> +
> +int
> +main (void)
> +{
> +
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +
> +cat - <<_ACEOF >conftest.h
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_PATH_IOPS_GETATTR 1" >>confdefs.h
> +
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
> +
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a vfsmount" >&5
> +$as_echo_n "checking whether iops->getattr() takes a vfsmount... " >&6; }
> +
> +
> +cat confdefs.h - <<_ACEOF >conftest.c
> +
> +
> +		#include <linux/fs.h>
> +
> +		int test_getattr(
> +		    struct vfsmount *mnt, struct dentry *d,
> +		    struct kstat *k)
> +		    { return 0; }
> +
> +		static const struct inode_operations
> +		    iops __attribute__ ((unused)) = {
> +			.getattr = test_getattr,
> +		};
> +
> +int
> +main (void)
> +{
> +
> +
> +  ;
> +  return 0;
> +}
> +
> +_ACEOF
> +
> +
> +
> +cat - <<_ACEOF >conftest.h
> +
> +_ACEOF
> +
> +
> +	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
> +	echo "obj-m := conftest.o" >build/Makefile
> +	modpost_flag=''
> +	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
> +	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then :
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
> +$as_echo "yes" >&6; }
> +
> +$as_echo "#define HAVE_VFSMOUNT_IOPS_GETATTR 1" >>confdefs.h
> +
> +
> +else
> +  $as_echo "$as_me: failed program was:" >&5
> +sed 's/^/| /' conftest.$ac_ext >&5
> +
> +		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
> +$as_echo "no" >&6; }
> +
> +
> +
> +fi
> +	rm -Rf build
> +
> +
> +
> +
> +
>  	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uncached_acl_sentinel() exists" >&5
>  $as_echo_n "checking whether uncached_acl_sentinel() exists... " >&6; }
>  
> diff --git a/zfs/include/Makefile.in b/zfs/include/Makefile.in
> index b0e96d4c829c..565636026926 100644
> --- a/zfs/include/Makefile.in
> +++ b/zfs/include/Makefile.in
> @@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/include/linux/Makefile.in b/zfs/include/linux/Makefile.in
> index f0596c30912c..5190f79a8f82 100644
> --- a/zfs/include/linux/Makefile.in
> +++ b/zfs/include/linux/Makefile.in
> @@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/include/linux/vfs_compat.h b/zfs/include/linux/vfs_compat.h
> index 2350fa506c6d..a0475070b405 100644
> --- a/zfs/include/linux/vfs_compat.h
> +++ b/zfs/include/linux/vfs_compat.h
> @@ -368,4 +368,47 @@ setattr_prepare(struct dentry *dentry, struct iattr *ia)
>  }
>  #endif
>  
> +/*
> + * 4.11 API change
> + * These macros are defined by kernel 4.11.  We define them so that the same
> + * code builds under kernels < 4.11 and >= 4.11.  The macros are set to 0 so
> + * that it will create obvious failures if they are accidentally used when built
> + * against a kernel >= 4.11.
> + */
> +
> +#ifndef STATX_BASIC_STATS
> +#define	STATX_BASIC_STATS	0
> +#endif
> +
> +#ifndef AT_STATX_SYNC_AS_STAT
> +#define	AT_STATX_SYNC_AS_STAT	0
> +#endif
> +
> +/*
> + * 4.11 API change
> + * 4.11 takes struct path *, < 4.11 takes vfsmount *
> + */
> +
> +#ifdef HAVE_VFSMOUNT_IOPS_GETATTR
> +#define	ZPL_GETATTR_WRAPPER(func)					\
> +static int								\
> +func(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)	\
> +{									\
> +	struct path path = { .mnt = mnt, .dentry = dentry };		\
> +	return func##_impl(&path, stat, STATX_BASIC_STATS,		\
> +	    AT_STATX_SYNC_AS_STAT);					\
> +}
> +#elif defined(HAVE_PATH_IOPS_GETATTR)
> +#define	ZPL_GETATTR_WRAPPER(func)					\
> +static int								\
> +func(const struct path *path, struct kstat *stat, u32 request_mask,	\
> +    unsigned int query_flags)						\
> +{									\
> +	return (func##_impl(path, stat, request_mask, query_flags));	\
> +}
> +#else
> +#error
> +#endif
> +
> +
>  #endif /* _ZFS_VFS_H */
> diff --git a/zfs/include/sys/Makefile.in b/zfs/include/sys/Makefile.in
> index e305be7794fb..31ec15631522 100644
> --- a/zfs/include/sys/Makefile.in
> +++ b/zfs/include/sys/Makefile.in
> @@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/include/sys/fm/Makefile.in b/zfs/include/sys/fm/Makefile.in
> index a84032301bed..1a591251029f 100644
> --- a/zfs/include/sys/fm/Makefile.in
> +++ b/zfs/include/sys/fm/Makefile.in
> @@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/include/sys/fm/fs/Makefile.in b/zfs/include/sys/fm/fs/Makefile.in
> index 345979146e57..13ebf8e6f24c 100644
> --- a/zfs/include/sys/fm/fs/Makefile.in
> +++ b/zfs/include/sys/fm/fs/Makefile.in
> @@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/include/sys/fs/Makefile.in b/zfs/include/sys/fs/Makefile.in
> index b7d24cb97181..66ca4e2678bb 100644
> --- a/zfs/include/sys/fs/Makefile.in
> +++ b/zfs/include/sys/fs/Makefile.in
> @@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
>  	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
>  	$(top_srcdir)/config/kernel-get-gendisk.m4 \
>  	$(top_srcdir)/config/kernel-get-link.m4 \
> +	$(top_srcdir)/config/kernel-inode-getattr.m4 \
>  	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
>  	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
>  	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
> diff --git a/zfs/include/sys/refcount.h b/zfs/include/sys/refcount.h
> index e767a2389dab..1d74187d4039 100644
> --- a/zfs/include/sys/refcount.h
> +++ b/zfs/include/sys/refcount.h
> @@ -40,6 +40,17 @@ extern "C" {
>   */
>  #define	FTAG ((char *)__func__)
>  
> +/*
> + * Starting with 4.11, torvalds/linux@f405df5, the linux kernel defines a
> + * refcount_t type of its own.  The macro below effectively changes references
> + * in the ZFS code from refcount_t to zfs_refcount_t at compile time, so that
> + * existing code need not be altered, reducing conflicts when landing openZFS
> + * patches.
> + */
> +
> +#define	refcount_t	zfs_refcount_t
> +#define	refcount_add	zfs_refcount_add
> +
>  #ifdef	ZFS_DEBUG
>  typedef struct reference {
>  	list_node_t ref_link;
> @@ -55,7 +66,7 @@ typedef struct refcount {
>  	list_t rc_removed;
>  	int64_t rc_count;
>  	int64_t rc_removed_count;
> -} refcount_t;
> +} zfs_refcount_t;
>  
>  /* Note: refcount_t must be initialized with refcount_create[_untracked]() */
>  
> @@ -65,7 +76,7 @@ void refcount_destroy(refcount_t *rc);
>  void refcount_destroy_many(refcount_t *rc, uint64_t number);
>  int refcount_is_zero(refcount_t *rc);
>  int64_t refcount_count(refcount_t *rc);
> -int64_t refcount_add(refcount_t *rc, void *holder_tag);
> +int64_t zfs_refcount_add(refcount_t *rc, void *holder_tag);
>  int64_t refcount_remove(refcount_t *rc, void *holder_tag);
>  int64_t refcount_add_many(refcount_t *rc, uint64_t number, void *holder_tag);
>  int64_t refcount_remove_many(refcount_t *rc, uint64_t number, void *holder_tag);
> @@ -86,7 +97,7 @@ typedef struct refcount {
>  #define	refcount_destroy_many(rc, number) ((rc)->rc_count = 0)
>  #define	refcount_is_zero(rc) ((rc)->rc_count == 0)
>  #define	refcount_count(rc) ((rc)->rc_count)
> -#define	refcount_add(rc, holder) atomic_add_64_nv(&(rc)->rc_count, 1)
> +#define	zfs_refcount_add(rc, holder) atomic_add_64_nv(&(rc)->rc_count, 1)
>  #define	refcount_remove(rc, holder) atomic_add_64_nv(&(rc)->rc_count, -1)
>  #define	refcount_add_many(rc, number, holder) \
>  	atomic_add_64_nv(&(rc)->rc_count, number)
> diff --git a/zfs/module/zfs/refcount.c b/zfs/module/zfs/refcount.c
> index 4c460a200967..25875243bad9 100644
> --- a/zfs/module/zfs/refcount.c
> +++ b/zfs/module/zfs/refcount.c
> @@ -137,7 +137,7 @@ refcount_add_many(refcount_t *rc, uint64_t number, void *holder)
>  }
>  
>  int64_t
> -refcount_add(refcount_t *rc, void *holder)
> +zfs_refcount_add(refcount_t *rc, void *holder)
>  {
>  	return (refcount_add_many(rc, 1, holder));
>  }
> diff --git a/zfs/module/zfs/zpl_ctldir.c b/zfs/module/zfs/zpl_ctldir.c
> index d691f670b44d..10ef4d369982 100644
> --- a/zfs/module/zfs/zpl_ctldir.c
> +++ b/zfs/module/zfs/zpl_ctldir.c
> @@ -100,16 +100,15 @@ zpl_root_readdir(struct file *filp, void *dirent, filldir_t filldir)
>   */
>  /* ARGSUSED */
>  static int
> -zpl_root_getattr(struct vfsmount *mnt, struct dentry *dentry,
> -    struct kstat *stat)
> +zpl_root_getattr_impl(const struct path *path, struct kstat *stat,
> +    u32 request_mask, unsigned int query_flags)
>  {
> -	int error;
> -
> -	error = simple_getattr(mnt, dentry, stat);
> +	generic_fillattr(path->dentry->d_inode, stat);
>  	stat->atime = CURRENT_TIME;
>  
> -	return (error);
> +	return (0);
>  }
> +ZPL_GETATTR_WRAPPER(zpl_root_getattr);
>  
>  static struct dentry *
>  #ifdef HAVE_LOOKUP_NAMEIDATA
> @@ -375,21 +374,22 @@ zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, zpl_umode_t mode)
>   */
>  /* ARGSUSED */
>  static int
> -zpl_snapdir_getattr(struct vfsmount *mnt, struct dentry *dentry,
> -    struct kstat *stat)
> +zpl_snapdir_getattr_impl(const struct path *path, struct kstat *stat,
> +    u32 request_mask, unsigned int query_flags)
>  {
> -	zfs_sb_t *zsb = ITOZSB(dentry->d_inode);
> -	int error;
> +	zfs_sb_t *zsb = ITOZSB(path->dentry->d_inode);
>  
>  	ZFS_ENTER(zsb);
> -	error = simple_getattr(mnt, dentry, stat);
> +	generic_fillattr(path->dentry->d_inode, stat);
> +
>  	stat->nlink = stat->size = 2;
>  	stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zsb->z_os);
>  	stat->atime = CURRENT_TIME;
>  	ZFS_EXIT(zsb);
>  
> -	return (error);
> +	return (0);
>  }
> +ZPL_GETATTR_WRAPPER(zpl_snapdir_getattr);
>  
>  /*
>   * The '.zfs/snapshot' directory file operations.  These mainly control
> @@ -509,10 +509,10 @@ zpl_shares_readdir(struct file *filp, void *dirent, filldir_t filldir)
>  
>  /* ARGSUSED */
>  static int
> -zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
> -    struct kstat *stat)
> +zpl_shares_getattr_impl(const struct path *path, struct kstat *stat,
> +    u32 request_mask, unsigned int query_flags)
>  {
> -	struct inode *ip = dentry->d_inode;
> +	struct inode *ip = path->dentry->d_inode;
>  	zfs_sb_t *zsb = ITOZSB(ip);
>  	znode_t *dzp;
>  	int error;
> @@ -520,11 +520,11 @@ zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
>  	ZFS_ENTER(zsb);
>  
>  	if (zsb->z_shares_dir == 0) {
> -		error = simple_getattr(mnt, dentry, stat);
> +		generic_fillattr(path->dentry->d_inode, stat);
>  		stat->nlink = stat->size = 2;
>  		stat->atime = CURRENT_TIME;
>  		ZFS_EXIT(zsb);
> -		return (error);
> +		return (0);
>  	}
>  
>  	error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp);
> @@ -538,6 +538,7 @@ zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
>  
>  	return (error);
>  }
> +ZPL_GETATTR_WRAPPER(zpl_shares_getattr);
>  
>  /*
>   * The '.zfs/shares' directory file operations.
> diff --git a/zfs/module/zfs/zpl_inode.c b/zfs/module/zfs/zpl_inode.c
> index 1714aa22bbd1..7aded9df2732 100644
> --- a/zfs/module/zfs/zpl_inode.c
> +++ b/zfs/module/zfs/zpl_inode.c
> @@ -302,18 +302,25 @@ zpl_rmdir(struct inode * dir, struct dentry *dentry)
>  }
>  
>  static int
> -zpl_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
> +zpl_getattr_impl(const struct path *path, struct kstat *stat, u32 request_mask,
> +    unsigned int query_flags)
>  {
>  	int error;
>  	fstrans_cookie_t cookie;
>  
>  	cookie = spl_fstrans_mark();
> -	error = -zfs_getattr_fast(dentry->d_inode, stat);
> +
> +	/*
> +	 * XXX request_mask and query_flags currently ignored.
> +	 */
> +
> +	error = -zfs_getattr_fast(path->dentry->d_inode, stat);
>  	spl_fstrans_unmark(cookie);
>  	ASSERT3S(error, <=, 0);
>  
>  	return (error);
>  }
> +ZPL_GETATTR_WRAPPER(zpl_getattr);
>  
>  static int
>  zpl_setattr(struct dentry *dentry, struct iattr *ia)
> diff --git a/zfs/zfs_config.h.in b/zfs/zfs_config.h.in
> index 7b9a0e21c66e..3e11dd51e766 100644
> --- a/zfs/zfs_config.h.in
> +++ b/zfs/zfs_config.h.in
> @@ -291,6 +291,9 @@
>  /* open_bdev_exclusive() is available */
>  #undef HAVE_OPEN_BDEV_EXCLUSIVE
>  
> +/* iops->getattr() takes a path */
> +#undef HAVE_PATH_IOPS_GETATTR
> +
>  /* iops->permission() exists */
>  #undef HAVE_PERMISSION
>  
> @@ -387,6 +390,9 @@
>  /* Define to 1 if you have the <unistd.h> header file. */
>  #undef HAVE_UNISTD_H
>  
> +/* iops->getattr() takes a vfsmount */
> +#undef HAVE_VFSMOUNT_IOPS_GETATTR
> +
>  /* fops->iterate() is available */
>  #undef HAVE_VFS_ITERATE
>  
>
Seth Forshee May 2, 2017, 7:29 p.m. UTC | #2
On Tue, May 02, 2017 at 03:32:47PM +0100, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Add upstream SPL compat patches from upstream to build with 4.11 kernel:
>  - 8d5feecacfdcca Linux 4.11 compat: set_task_state() removed
>  - 94b1ab2ae01e9e Linux 4.11 compat: vfs_getattr() takes 4 args
>  - 9a054d54fb6772 Linux 4.11 compat: add linux/sched/signal.h
>  - bf8abea4dade11 Linux 4.11 compat: remove stub for __put_task_struct
> 
> Add upstream ZFS compat patches from upstream to build with 4.11 kernel:
>  - a3478c07475261 Linux 4.11 compat: iops.getattr and friends
>  - 4859fe796c5b03 Linux 4.11 compat: avoid refcount_t name conflict
> 
> Tested and verified against the Ubuntu ZFS autotest regression tests
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>

Applied to artful master-next. Thanks!
diff mbox

Patch

diff --git a/spl/META b/spl/META
index c7b69beebec5..70fb5812607a 100644
--- a/spl/META
+++ b/spl/META
@@ -2,7 +2,7 @@  Meta:         1
 Name:         spl
 Branch:       1.0
 Version:      0.6.5.9
-Release:      1
+Release:      1ubuntu1
 Release-Tags: relext
 License:      GPL
 Author:       OpenZFS on Linux
diff --git a/spl/config/spl-build.m4 b/spl/config/spl-build.m4
index 5a2f1ded2534..d886ddf15a46 100644
--- a/spl/config/spl-build.m4
+++ b/spl/config/spl-build.m4
@@ -33,7 +33,6 @@  AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
 	SPL_AC_INODE_TRUNCATE_RANGE
 	SPL_AC_FS_STRUCT_SPINLOCK
 	SPL_AC_KUIDGID_T
-	SPL_AC_PUT_TASK_STRUCT
 	SPL_AC_KERNEL_FALLOCATE
 	SPL_AC_CONFIG_ZLIB_INFLATE
 	SPL_AC_CONFIG_ZLIB_DEFLATE
@@ -43,6 +42,9 @@  AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
 	SPL_AC_RWSEM_ACTIVITY
 	SPL_AC_RWSEM_ATOMIC_LONG_COUNT
 	SPL_AC_SCHED_RT_HEADER
+	SPL_AC_SCHED_SIGNAL_HEADER
+	SPL_AC_4ARGS_VFS_GETATTR
+	SPL_AC_3ARGS_VFS_GETATTR
 	SPL_AC_2ARGS_VFS_GETATTR
 	SPL_AC_USLEEP_RANGE
 	SPL_AC_KMEM_CACHE_ALLOCFLAGS
@@ -1082,25 +1084,6 @@  AC_DEFUN([SPL_AC_KUIDGID_T], [
 ])
 
 dnl #
-dnl # 2.6.39 API change,
-dnl # __put_task_struct() was exported by the mainline kernel.
-dnl #
-AC_DEFUN([SPL_AC_PUT_TASK_STRUCT],
-	[AC_MSG_CHECKING([whether __put_task_struct() is available])
-	SPL_LINUX_TRY_COMPILE_SYMBOL([
-		#include <linux/sched.h>
-	], [
-		__put_task_struct(NULL);
-	], [__put_task_struct], [], [
-		AC_MSG_RESULT(yes)
-		AC_DEFINE(HAVE_PUT_TASK_STRUCT, 1,
-		          [__put_task_struct() is available])
-	], [
-		AC_MSG_RESULT(no)
-	])
-])
-
-dnl #
 dnl # 2.6.35 API change,
 dnl # Unused 'struct dentry *' removed from vfs_fsync() prototype.
 dnl #
@@ -1409,33 +1392,84 @@  AC_DEFUN([SPL_AC_SCHED_RT_HEADER],
 ])
 
 dnl #
-dnl # 3.9 API change,
-dnl # vfs_getattr() uses 2 args
-dnl # It takes struct path * instead of struct vfsmount * and struct dentry *
+dnl # 4.11 API change,
+dnl # Moved things from linux/sched.h to linux/sched/signal.h
+dnl #
+AC_DEFUN([SPL_AC_SCHED_SIGNAL_HEADER],
+	[AC_MSG_CHECKING([whether header linux/sched/signal.h exists])
+	SPL_LINUX_TRY_COMPILE([
+		#include <linux/sched.h>
+		#include <linux/sched/signal.h>
+	],[
+		return 0;
+	],[
+		AC_DEFINE(HAVE_SCHED_SIGNAL_HEADER, 1, [linux/sched/signal.h exists])
+		AC_MSG_RESULT(yes)
+	],[
+		AC_MSG_RESULT(no)
+	])
+])
+
+dnl #
+dnl # 4.11 API, a528d35e@torvalds/linux
+dnl # vfs_getattr(const struct path *p, struct kstat *s, u32 m, unsigned int f)
+dnl #
+AC_DEFUN([SPL_AC_4ARGS_VFS_GETATTR], [
+	AC_MSG_CHECKING([whether vfs_getattr() wants 4 args])
+	SPL_LINUX_TRY_COMPILE([
+		#include <linux/fs.h>
+	],[
+		vfs_getattr((const struct path *)NULL,
+			(struct kstat *)NULL,
+			(u32)0,
+			(unsigned int)0);
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_4ARGS_VFS_GETATTR, 1,
+		  [vfs_getattr wants 4 args])
+	],[
+		AC_MSG_RESULT(no)
+	])
+])
+
+dnl #
+dnl # 3.9 API 
+dnl # vfs_getattr(struct path *p, struct kstat *s)
 dnl #
 AC_DEFUN([SPL_AC_2ARGS_VFS_GETATTR], [
-	AC_MSG_CHECKING([whether vfs_getattr() wants])
+	AC_MSG_CHECKING([whether vfs_getattr() wants 2 args])
 	SPL_LINUX_TRY_COMPILE([
 		#include <linux/fs.h>
 	],[
 		vfs_getattr((struct path *) NULL,
 			(struct kstat *)NULL);
 	],[
-		AC_MSG_RESULT(2 args)
+		AC_MSG_RESULT(yes)
 		AC_DEFINE(HAVE_2ARGS_VFS_GETATTR, 1,
-		          [vfs_getattr wants 2 args])
+			  [vfs_getattr wants 2 args])
 	],[
-		SPL_LINUX_TRY_COMPILE([
-			#include <linux/fs.h>
-		],[
-			vfs_getattr((struct vfsmount *)NULL,
-				(struct dentry *)NULL,
-				(struct kstat *)NULL);
-		],[
-			AC_MSG_RESULT(3 args)
-		],[
-			AC_MSG_ERROR(unknown)
-		])
+		AC_MSG_RESULT(no)
+	])
+])
+
+dnl #
+dnl # <3.9 API 
+dnl # vfs_getattr(struct vfsmount *v, struct dentry *d, struct kstat *k)
+dnl #
+AC_DEFUN([SPL_AC_3ARGS_VFS_GETATTR], [
+	AC_MSG_CHECKING([whether vfs_getattr() wants 3 args])
+	SPL_LINUX_TRY_COMPILE([
+		#include <linux/fs.h>
+	],[
+		vfs_getattr((struct vfsmount *)NULL,
+			(struct dentry *)NULL,
+			(struct kstat *)NULL);
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_3ARGS_VFS_GETATTR, 1,
+		  [vfs_getattr wants 3 args])
+	],[
+		AC_MSG_RESULT(no)
 	])
 ])
 
diff --git a/spl/configure b/spl/configure
index 5e323aeee320..9f493590abed 100755
--- a/spl/configure
+++ b/spl/configure
@@ -14018,104 +14018,6 @@  fi
 
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __put_task_struct() is available" >&5
-$as_echo_n "checking whether __put_task_struct() is available... " >&6; }
-
-
-
-cat confdefs.h - <<_ACEOF >conftest.c
-
-
-		#include <linux/sched.h>
-
-int
-main (void)
-{
-
-		__put_task_struct(NULL);
-
-  ;
-  return 0;
-}
-
-_ACEOF
-
-
-	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
-	echo "obj-m := conftest.o" >build/Makefile
-	modpost_flag=''
-	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
-	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 $modpost_flag'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  rc=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
- rc=1
-
-
-fi
-	rm -Rf build
-
-
-	if test $rc -ne 0; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-	else
-		if test "x$enable_linux_builtin" != xyes; then
-
-	grep -q -E '[[:space:]]__put_task_struct[[:space:]]' \
-		$LINUX_OBJ/Module*.symvers 2>/dev/null
-	rc=$?
-	if test $rc -ne 0; then
-		export=0
-		for file in ; do
-			grep -q -E "EXPORT_SYMBOL.*(__put_task_struct)" \
-				"$LINUX_OBJ/$file" 2>/dev/null
-			rc=$?
-			if test $rc -eq 0; then
-				export=1
-				break;
-			fi
-		done
-		if test $export -eq 0; then :
-			rc=1
-		else :
-			rc=0
-		fi
-	else :
-		rc=0
-	fi
-
-		fi
-		if test $rc -ne 0; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-		else :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define HAVE_PUT_TASK_STRUCT 1" >>confdefs.h
-
-
-		fi
-	fi
-
-
 
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fops->fallocate() exists" >&5
@@ -14793,9 +14695,68 @@  fi
 
 
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether header linux/sched/signal.h exists" >&5
+$as_echo_n "checking whether header linux/sched/signal.h exists... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/sched.h>
+		#include <linux/sched/signal.h>
+
+int
+main (void)
+{
+
+		return 0;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	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 $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+
+$as_echo "#define HAVE_SCHED_SIGNAL_HEADER 1" >>confdefs.h
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants" >&5
-$as_echo_n "checking whether vfs_getattr() wants... " >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 4 args" >&5
+$as_echo_n "checking whether vfs_getattr() wants 4 args... " >&6; }
 
 
 cat confdefs.h - <<_ACEOF >conftest.c
@@ -14807,8 +14768,10 @@  int
 main (void)
 {
 
-		vfs_getattr((struct path *) NULL,
-			(struct kstat *)NULL);
+		vfs_getattr((const struct path *)NULL,
+			(struct kstat *)NULL,
+			(u32)0,
+			(unsigned int)0);
 
   ;
   return 0;
@@ -14833,30 +14796,43 @@  _ACEOF
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then :
 
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 2 args" >&5
-$as_echo "2 args" >&6; }
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
-$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
+$as_echo "#define HAVE_4ARGS_VFS_GETATTR 1" >>confdefs.h
 
 
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 3 args" >&5
+$as_echo_n "checking whether vfs_getattr() wants 3 args... " >&6; }
 
 
 cat confdefs.h - <<_ACEOF >conftest.c
 
 
-			#include <linux/fs.h>
+		#include <linux/fs.h>
 
 int
 main (void)
 {
 
-			vfs_getattr((struct vfsmount *)NULL,
-				(struct dentry *)NULL,
-				(struct kstat *)NULL);
+		vfs_getattr((struct vfsmount *)NULL,
+			(struct dentry *)NULL,
+			(struct kstat *)NULL);
 
   ;
   return 0;
@@ -14881,14 +14857,18 @@  _ACEOF
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then :
 
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 3 args" >&5
-$as_echo "3 args" >&6; }
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_3ARGS_VFS_GETATTR 1" >>confdefs.h
+
 
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-			as_fn_error $? "unknown" "$LINENO" 5
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 
 
 
@@ -14898,6 +14878,59 @@  fi
 
 
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 2 args" >&5
+$as_echo_n "checking whether vfs_getattr() wants 2 args... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/fs.h>
+
+int
+main (void)
+{
+
+		vfs_getattr((struct path *) NULL,
+			(struct kstat *)NULL);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	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 $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
 
 fi
 	rm -Rf build
@@ -16969,104 +17002,6 @@  fi
 
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __put_task_struct() is available" >&5
-$as_echo_n "checking whether __put_task_struct() is available... " >&6; }
-
-
-
-cat confdefs.h - <<_ACEOF >conftest.c
-
-
-		#include <linux/sched.h>
-
-int
-main (void)
-{
-
-		__put_task_struct(NULL);
-
-  ;
-  return 0;
-}
-
-_ACEOF
-
-
-	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
-	echo "obj-m := conftest.o" >build/Makefile
-	modpost_flag=''
-	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
-	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 $modpost_flag'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  rc=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
- rc=1
-
-
-fi
-	rm -Rf build
-
-
-	if test $rc -ne 0; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-	else
-		if test "x$enable_linux_builtin" != xyes; then
-
-	grep -q -E '[[:space:]]__put_task_struct[[:space:]]' \
-		$LINUX_OBJ/Module*.symvers 2>/dev/null
-	rc=$?
-	if test $rc -ne 0; then
-		export=0
-		for file in ; do
-			grep -q -E "EXPORT_SYMBOL.*(__put_task_struct)" \
-				"$LINUX_OBJ/$file" 2>/dev/null
-			rc=$?
-			if test $rc -eq 0; then
-				export=1
-				break;
-			fi
-		done
-		if test $export -eq 0; then :
-			rc=1
-		else :
-			rc=0
-		fi
-	else :
-		rc=0
-	fi
-
-		fi
-		if test $rc -ne 0; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-		else :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define HAVE_PUT_TASK_STRUCT 1" >>confdefs.h
-
-
-		fi
-	fi
-
-
 
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fops->fallocate() exists" >&5
@@ -17744,9 +17679,68 @@  fi
 
 
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether header linux/sched/signal.h exists" >&5
+$as_echo_n "checking whether header linux/sched/signal.h exists... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/sched.h>
+		#include <linux/sched/signal.h>
+
+int
+main (void)
+{
+
+		return 0;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	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 $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+
+$as_echo "#define HAVE_SCHED_SIGNAL_HEADER 1" >>confdefs.h
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants" >&5
-$as_echo_n "checking whether vfs_getattr() wants... " >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 4 args" >&5
+$as_echo_n "checking whether vfs_getattr() wants 4 args... " >&6; }
 
 
 cat confdefs.h - <<_ACEOF >conftest.c
@@ -17758,8 +17752,10 @@  int
 main (void)
 {
 
-		vfs_getattr((struct path *) NULL,
-			(struct kstat *)NULL);
+		vfs_getattr((const struct path *)NULL,
+			(struct kstat *)NULL,
+			(u32)0,
+			(unsigned int)0);
 
   ;
   return 0;
@@ -17784,30 +17780,43 @@  _ACEOF
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then :
 
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 2 args" >&5
-$as_echo "2 args" >&6; }
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
-$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
+$as_echo "#define HAVE_4ARGS_VFS_GETATTR 1" >>confdefs.h
 
 
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 3 args" >&5
+$as_echo_n "checking whether vfs_getattr() wants 3 args... " >&6; }
 
 
 cat confdefs.h - <<_ACEOF >conftest.c
 
 
-			#include <linux/fs.h>
+		#include <linux/fs.h>
 
 int
 main (void)
 {
 
-			vfs_getattr((struct vfsmount *)NULL,
-				(struct dentry *)NULL,
-				(struct kstat *)NULL);
+		vfs_getattr((struct vfsmount *)NULL,
+			(struct dentry *)NULL,
+			(struct kstat *)NULL);
 
   ;
   return 0;
@@ -17832,14 +17841,18 @@  _ACEOF
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then :
 
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 3 args" >&5
-$as_echo "3 args" >&6; }
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_3ARGS_VFS_GETATTR 1" >>confdefs.h
+
 
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-			as_fn_error $? "unknown" "$LINENO" 5
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 
 
 
@@ -17849,6 +17862,59 @@  fi
 
 
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vfs_getattr() wants 2 args" >&5
+$as_echo_n "checking whether vfs_getattr() wants 2 args... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/fs.h>
+
+int
+main (void)
+{
+
+		vfs_getattr((struct path *) NULL,
+			(struct kstat *)NULL);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	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 $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_2ARGS_VFS_GETATTR 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
 
 fi
 	rm -Rf build
diff --git a/spl/include/sys/signal.h b/spl/include/sys/signal.h
index 823fea32912e..77cc2d3c2fb5 100644
--- a/spl/include/sys/signal.h
+++ b/spl/include/sys/signal.h
@@ -27,6 +27,10 @@ 
 
 #include <linux/sched.h>
 
+#ifdef HAVE_SCHED_SIGNAL_HEADER
+#include <linux/sched/signal.h>
+#endif
+
 #define	FORREAL		0	/* Usual side-effects */
 #define	JUSTLOOKING	1	/* Don't stop the process */
 
diff --git a/spl/module/spl/spl-err.c b/spl/module/spl/spl-err.c
index 14ff8a3373f5..cf9f096b11cb 100644
--- a/spl/module/spl/spl-err.c
+++ b/spl/module/spl/spl-err.c
@@ -65,7 +65,7 @@  spl_panic(const char *file, const char *func, int line, const char *fmt, ...) {
 	spl_dumpstack();
 
 	/* Halt the thread to facilitate further debugging */
-	set_task_state(current, TASK_UNINTERRUPTIBLE);
+	set_current_state(TASK_UNINTERRUPTIBLE);
 	while (1)
 		schedule();
 
@@ -98,7 +98,7 @@  vcmn_err(int ce, const char *fmt, va_list ap)
 		spl_dumpstack();
 
 		/* Halt the thread to facilitate further debugging */
-		set_task_state(current, TASK_UNINTERRUPTIBLE);
+		set_current_state(TASK_UNINTERRUPTIBLE);
 		while (1)
 			schedule();
 	}
diff --git a/spl/module/spl/spl-generic.c b/spl/module/spl/spl-generic.c
index c01a646a4d5d..b2bd1b837a9f 100644
--- a/spl/module/spl/spl-generic.c
+++ b/spl/module/spl/spl-generic.c
@@ -351,22 +351,6 @@  ddi_copyout(const void *from, void *to, size_t len, int flags)
 }
 EXPORT_SYMBOL(ddi_copyout);
 
-#ifndef HAVE_PUT_TASK_STRUCT
-/*
- * This is only a stub function which should never be used.  The SPL should
- * never be putting away the last reference on a task structure so this will
- * not be called.  However, we still need to define it so the module does not
- * have undefined symbol at load time.  That all said if this impossible
- * thing does somehow happen PANIC immediately so we know about it.
- */
-void
-__put_task_struct(struct task_struct *t)
-{
-	PANIC("Unexpectly put last reference on task %d\n", (int)t->pid);
-}
-EXPORT_SYMBOL(__put_task_struct);
-#endif /* HAVE_PUT_TASK_STRUCT */
-
 /*
  * Read the unique system identifier from the /etc/hostid file.
  *
diff --git a/spl/module/spl/spl-vnode.c b/spl/module/spl/spl-vnode.c
index f1ebcd2d63c7..a548d37f7acb 100644
--- a/spl/module/spl/spl-vnode.c
+++ b/spl/module/spl/spl-vnode.c
@@ -156,7 +156,9 @@  vn_open(const char *path, uio_seg_t seg, int flags, int mode,
 	if (IS_ERR(fp))
 		return (-PTR_ERR(fp));
 
-#ifdef HAVE_2ARGS_VFS_GETATTR
+#if defined(HAVE_4ARGS_VFS_GETATTR)
+	rc = vfs_getattr(&fp->f_path, &stat, STATX_TYPE, AT_STATX_SYNC_AS_STAT);
+#elif defined(HAVE_2ARGS_VFS_GETATTR)
 	rc = vfs_getattr(&fp->f_path, &stat);
 #else
 	rc = vfs_getattr(fp->f_path.mnt, fp->f_dentry, &stat);
@@ -514,7 +516,10 @@  vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4)
 
 	fp = vp->v_file;
 
-#ifdef HAVE_2ARGS_VFS_GETATTR
+#if defined(HAVE_4ARGS_VFS_GETATTR)
+	rc = vfs_getattr(&fp->f_path, &stat, STATX_BASIC_STATS,
+	    AT_STATX_SYNC_AS_STAT);
+#elif defined(HAVE_2ARGS_VFS_GETATTR)
 	rc = vfs_getattr(&fp->f_path, &stat);
 #else
 	rc = vfs_getattr(fp->f_path.mnt, fp->f_dentry, &stat);
@@ -684,7 +689,9 @@  vn_getf(int fd)
 	if (vp == NULL)
 		goto out_fget;
 
-#ifdef HAVE_2ARGS_VFS_GETATTR
+#if defined(HAVE_4ARGS_VFS_GETATTR)
+	rc = vfs_getattr(&lfp->f_path, &stat, STATX_TYPE, AT_STATX_SYNC_AS_STAT);
+#elif defined(HAVE_2ARGS_VFS_GETATTR)
 	rc = vfs_getattr(&lfp->f_path, &stat);
 #else
 	rc = vfs_getattr(lfp->f_path.mnt, lfp->f_dentry, &stat);
diff --git a/spl/spl_config.h.in b/spl/spl_config.h.in
index 463c5f98f5a8..7cd020be1151 100644
--- a/spl/spl_config.h.in
+++ b/spl/spl_config.h.in
@@ -30,9 +30,15 @@ 
 /* old shrinker callback wants 3 args */
 #undef HAVE_3ARGS_SHRINKER_CALLBACK
 
+/* vfs_getattr wants 3 args */
+#undef HAVE_3ARGS_VFS_GETATTR
+
 /* vfs_unlink() wants 3 args */
 #undef HAVE_3ARGS_VFS_UNLINK
 
+/* vfs_getattr wants 4 args */
+#undef HAVE_4ARGS_VFS_GETATTR
+
 /* vfs_rename() wants 4 args */
 #undef HAVE_4ARGS_VFS_RENAME
 
@@ -90,9 +96,6 @@ 
 /* yes */
 #undef HAVE_PDE_DATA
 
-/* __put_task_struct() is available */
-#undef HAVE_PUT_TASK_STRUCT
-
 /* struct rw_semaphore has member activity */
 #undef HAVE_RWSEM_ACTIVITY
 
@@ -102,6 +105,9 @@ 
 /* linux/sched/rt.h exists */
 #undef HAVE_SCHED_RT_HEADER
 
+/* linux/sched/signal.h exists */
+#undef HAVE_SCHED_SIGNAL_HEADER
+
 /* set_fs_pwd() needs const path * */
 #undef HAVE_SET_FS_PWD_WITH_CONST
 
diff --git a/zfs/META b/zfs/META
index e5c868850eeb..9719514df84b 100644
--- a/zfs/META
+++ b/zfs/META
@@ -2,7 +2,7 @@  Meta:         1
 Name:         zfs
 Branch:       1.0
 Version:      0.6.5.9
-Release:      2
+Release:      5ubuntu5
 Release-Tags: relext
 License:      CDDL
 Author:       OpenZFS on Linux
diff --git a/zfs/Makefile.in b/zfs/Makefile.in
index 3147144bb35e..76d341c30e1a 100644
--- a/zfs/Makefile.in
+++ b/zfs/Makefile.in
@@ -147,6 +147,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/aclocal.m4 b/zfs/aclocal.m4
index 51a5d6fd9317..95ba8522e75b 100644
--- a/zfs/aclocal.m4
+++ b/zfs/aclocal.m4
@@ -1254,6 +1254,7 @@  m4_include([config/kernel-generic_readlink.m4])
 m4_include([config/kernel-get-disk-ro.m4])
 m4_include([config/kernel-get-gendisk.m4])
 m4_include([config/kernel-get-link.m4])
+m4_include([config/kernel-inode-getattr.m4])
 m4_include([config/kernel-insert-inode-locked.m4])
 m4_include([config/kernel-invalidate-bdev-args.m4])
 m4_include([config/kernel-is_owner_or_cap.m4])
diff --git a/zfs/config/kernel-inode-getattr.m4 b/zfs/config/kernel-inode-getattr.m4
new file mode 100644
index 000000000000..f10e0b251085
--- /dev/null
+++ b/zfs/config/kernel-inode-getattr.m4
@@ -0,0 +1,67 @@ 
+dnl #
+dnl # Linux 4.11 API
+dnl # See torvalds/linux@a528d35
+dnl #
+AC_DEFUN([ZFS_AC_PATH_KERNEL_IOPS_GETATTR], [
+	AC_MSG_CHECKING([whether iops->getattr() takes a path])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/fs.h>
+
+		int test_getattr(
+		    const struct path *p, struct kstat *k,
+		    u32 request_mask, unsigned int query_flags)
+		    { return 0; }
+
+		static const struct inode_operations
+		    iops __attribute__ ((unused)) = {
+			.getattr = test_getattr,
+		};
+	],[
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_PATH_IOPS_GETATTR, 1,
+		    [iops->getattr() takes a path])
+	],[
+		AC_MSG_RESULT(no)
+	])
+])
+
+
+
+dnl #
+dnl # Linux 3.9 - 4.10 API
+dnl #
+AC_DEFUN([ZFS_AC_VFSMOUNT_KERNEL_IOPS_GETATTR], [
+	AC_MSG_CHECKING([whether iops->getattr() takes a vfsmount])
+	ZFS_LINUX_TRY_COMPILE([
+		#include <linux/fs.h>
+
+		int test_getattr(
+		    struct vfsmount *mnt, struct dentry *d,
+		    struct kstat *k)
+		    { return 0; }
+
+		static const struct inode_operations
+		    iops __attribute__ ((unused)) = {
+			.getattr = test_getattr,
+		};
+	],[
+	],[
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_VFSMOUNT_IOPS_GETATTR, 1,
+		    [iops->getattr() takes a vfsmount])
+	],[
+		AC_MSG_RESULT(no)
+	])
+])
+
+
+dnl #
+dnl # The interface of the getattr callback from the inode_operations
+dnl # structure changed.  Also, the interface of the simple_getattr()
+dnl # function provided by the kernel changed.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR], [
+	ZFS_AC_PATH_KERNEL_IOPS_GETATTR
+	ZFS_AC_VFSMOUNT_KERNEL_IOPS_GETATTR
+])
diff --git a/zfs/config/kernel.m4 b/zfs/config/kernel.m4
index 5b8abf75160b..9ca48a2c94b8 100644
--- a/zfs/config/kernel.m4
+++ b/zfs/config/kernel.m4
@@ -58,6 +58,7 @@  AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
 	ZFS_AC_KERNEL_INODE_OPERATIONS_CHECK_ACL_WITH_FLAGS
 	ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL
 	ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
+	ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR
 	ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
 	ZFS_AC_KERNEL_SHOW_OPTIONS
 	ZFS_AC_KERNEL_FILE_INODE
diff --git a/zfs/configure b/zfs/configure
index 984208cf9cbf..48e8e3277e79 100755
--- a/zfs/configure
+++ b/zfs/configure
@@ -19349,6 +19349,156 @@  fi
 
 
 
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a path" >&5
+$as_echo_n "checking whether iops->getattr() takes a path... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/fs.h>
+
+		int test_getattr(
+		    const struct path *p, struct kstat *k,
+		    u32 request_mask, unsigned int query_flags)
+		    { return 0; }
+
+		static const struct inode_operations
+		    iops __attribute__ ((unused)) = {
+			.getattr = test_getattr,
+		};
+
+int
+main (void)
+{
+
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+
+cat - <<_ACEOF >conftest.h
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_PATH_IOPS_GETATTR 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a vfsmount" >&5
+$as_echo_n "checking whether iops->getattr() takes a vfsmount... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/fs.h>
+
+		int test_getattr(
+		    struct vfsmount *mnt, struct dentry *d,
+		    struct kstat *k)
+		    { return 0; }
+
+		static const struct inode_operations
+		    iops __attribute__ ((unused)) = {
+			.getattr = test_getattr,
+		};
+
+int
+main (void)
+{
+
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+
+cat - <<_ACEOF >conftest.h
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_VFSMOUNT_IOPS_GETATTR 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
+
+
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uncached_acl_sentinel() exists" >&5
 $as_echo_n "checking whether uncached_acl_sentinel() exists... " >&6; }
 
@@ -30223,6 +30373,156 @@  fi
 
 
 
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a path" >&5
+$as_echo_n "checking whether iops->getattr() takes a path... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/fs.h>
+
+		int test_getattr(
+		    const struct path *p, struct kstat *k,
+		    u32 request_mask, unsigned int query_flags)
+		    { return 0; }
+
+		static const struct inode_operations
+		    iops __attribute__ ((unused)) = {
+			.getattr = test_getattr,
+		};
+
+int
+main (void)
+{
+
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+
+cat - <<_ACEOF >conftest.h
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_PATH_IOPS_GETATTR 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether iops->getattr() takes a vfsmount" >&5
+$as_echo_n "checking whether iops->getattr() takes a vfsmount... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+		#include <linux/fs.h>
+
+		int test_getattr(
+		    struct vfsmount *mnt, struct dentry *d,
+		    struct kstat *k)
+		    { return 0; }
+
+		static const struct inode_operations
+		    iops __attribute__ ((unused)) = {
+			.getattr = test_getattr,
+		};
+
+int
+main (void)
+{
+
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+
+cat - <<_ACEOF >conftest.h
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_VFSMOUNT_IOPS_GETATTR 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+
+
+
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether uncached_acl_sentinel() exists" >&5
 $as_echo_n "checking whether uncached_acl_sentinel() exists... " >&6; }
 
diff --git a/zfs/include/Makefile.in b/zfs/include/Makefile.in
index b0e96d4c829c..565636026926 100644
--- a/zfs/include/Makefile.in
+++ b/zfs/include/Makefile.in
@@ -139,6 +139,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/include/linux/Makefile.in b/zfs/include/linux/Makefile.in
index f0596c30912c..5190f79a8f82 100644
--- a/zfs/include/linux/Makefile.in
+++ b/zfs/include/linux/Makefile.in
@@ -139,6 +139,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/include/linux/vfs_compat.h b/zfs/include/linux/vfs_compat.h
index 2350fa506c6d..a0475070b405 100644
--- a/zfs/include/linux/vfs_compat.h
+++ b/zfs/include/linux/vfs_compat.h
@@ -368,4 +368,47 @@  setattr_prepare(struct dentry *dentry, struct iattr *ia)
 }
 #endif
 
+/*
+ * 4.11 API change
+ * These macros are defined by kernel 4.11.  We define them so that the same
+ * code builds under kernels < 4.11 and >= 4.11.  The macros are set to 0 so
+ * that it will create obvious failures if they are accidentally used when built
+ * against a kernel >= 4.11.
+ */
+
+#ifndef STATX_BASIC_STATS
+#define	STATX_BASIC_STATS	0
+#endif
+
+#ifndef AT_STATX_SYNC_AS_STAT
+#define	AT_STATX_SYNC_AS_STAT	0
+#endif
+
+/*
+ * 4.11 API change
+ * 4.11 takes struct path *, < 4.11 takes vfsmount *
+ */
+
+#ifdef HAVE_VFSMOUNT_IOPS_GETATTR
+#define	ZPL_GETATTR_WRAPPER(func)					\
+static int								\
+func(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)	\
+{									\
+	struct path path = { .mnt = mnt, .dentry = dentry };		\
+	return func##_impl(&path, stat, STATX_BASIC_STATS,		\
+	    AT_STATX_SYNC_AS_STAT);					\
+}
+#elif defined(HAVE_PATH_IOPS_GETATTR)
+#define	ZPL_GETATTR_WRAPPER(func)					\
+static int								\
+func(const struct path *path, struct kstat *stat, u32 request_mask,	\
+    unsigned int query_flags)						\
+{									\
+	return (func##_impl(path, stat, request_mask, query_flags));	\
+}
+#else
+#error
+#endif
+
+
 #endif /* _ZFS_VFS_H */
diff --git a/zfs/include/sys/Makefile.in b/zfs/include/sys/Makefile.in
index e305be7794fb..31ec15631522 100644
--- a/zfs/include/sys/Makefile.in
+++ b/zfs/include/sys/Makefile.in
@@ -139,6 +139,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/include/sys/fm/Makefile.in b/zfs/include/sys/fm/Makefile.in
index a84032301bed..1a591251029f 100644
--- a/zfs/include/sys/fm/Makefile.in
+++ b/zfs/include/sys/fm/Makefile.in
@@ -139,6 +139,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/include/sys/fm/fs/Makefile.in b/zfs/include/sys/fm/fs/Makefile.in
index 345979146e57..13ebf8e6f24c 100644
--- a/zfs/include/sys/fm/fs/Makefile.in
+++ b/zfs/include/sys/fm/fs/Makefile.in
@@ -139,6 +139,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/include/sys/fs/Makefile.in b/zfs/include/sys/fs/Makefile.in
index b7d24cb97181..66ca4e2678bb 100644
--- a/zfs/include/sys/fs/Makefile.in
+++ b/zfs/include/sys/fs/Makefile.in
@@ -139,6 +139,7 @@  am__aclocal_m4_deps = $(top_srcdir)/config/always-no-bool-compare.m4 \
 	$(top_srcdir)/config/kernel-get-disk-ro.m4 \
 	$(top_srcdir)/config/kernel-get-gendisk.m4 \
 	$(top_srcdir)/config/kernel-get-link.m4 \
+	$(top_srcdir)/config/kernel-inode-getattr.m4 \
 	$(top_srcdir)/config/kernel-insert-inode-locked.m4 \
 	$(top_srcdir)/config/kernel-invalidate-bdev-args.m4 \
 	$(top_srcdir)/config/kernel-is_owner_or_cap.m4 \
diff --git a/zfs/include/sys/refcount.h b/zfs/include/sys/refcount.h
index e767a2389dab..1d74187d4039 100644
--- a/zfs/include/sys/refcount.h
+++ b/zfs/include/sys/refcount.h
@@ -40,6 +40,17 @@  extern "C" {
  */
 #define	FTAG ((char *)__func__)
 
+/*
+ * Starting with 4.11, torvalds/linux@f405df5, the linux kernel defines a
+ * refcount_t type of its own.  The macro below effectively changes references
+ * in the ZFS code from refcount_t to zfs_refcount_t at compile time, so that
+ * existing code need not be altered, reducing conflicts when landing openZFS
+ * patches.
+ */
+
+#define	refcount_t	zfs_refcount_t
+#define	refcount_add	zfs_refcount_add
+
 #ifdef	ZFS_DEBUG
 typedef struct reference {
 	list_node_t ref_link;
@@ -55,7 +66,7 @@  typedef struct refcount {
 	list_t rc_removed;
 	int64_t rc_count;
 	int64_t rc_removed_count;
-} refcount_t;
+} zfs_refcount_t;
 
 /* Note: refcount_t must be initialized with refcount_create[_untracked]() */
 
@@ -65,7 +76,7 @@  void refcount_destroy(refcount_t *rc);
 void refcount_destroy_many(refcount_t *rc, uint64_t number);
 int refcount_is_zero(refcount_t *rc);
 int64_t refcount_count(refcount_t *rc);
-int64_t refcount_add(refcount_t *rc, void *holder_tag);
+int64_t zfs_refcount_add(refcount_t *rc, void *holder_tag);
 int64_t refcount_remove(refcount_t *rc, void *holder_tag);
 int64_t refcount_add_many(refcount_t *rc, uint64_t number, void *holder_tag);
 int64_t refcount_remove_many(refcount_t *rc, uint64_t number, void *holder_tag);
@@ -86,7 +97,7 @@  typedef struct refcount {
 #define	refcount_destroy_many(rc, number) ((rc)->rc_count = 0)
 #define	refcount_is_zero(rc) ((rc)->rc_count == 0)
 #define	refcount_count(rc) ((rc)->rc_count)
-#define	refcount_add(rc, holder) atomic_add_64_nv(&(rc)->rc_count, 1)
+#define	zfs_refcount_add(rc, holder) atomic_add_64_nv(&(rc)->rc_count, 1)
 #define	refcount_remove(rc, holder) atomic_add_64_nv(&(rc)->rc_count, -1)
 #define	refcount_add_many(rc, number, holder) \
 	atomic_add_64_nv(&(rc)->rc_count, number)
diff --git a/zfs/module/zfs/refcount.c b/zfs/module/zfs/refcount.c
index 4c460a200967..25875243bad9 100644
--- a/zfs/module/zfs/refcount.c
+++ b/zfs/module/zfs/refcount.c
@@ -137,7 +137,7 @@  refcount_add_many(refcount_t *rc, uint64_t number, void *holder)
 }
 
 int64_t
-refcount_add(refcount_t *rc, void *holder)
+zfs_refcount_add(refcount_t *rc, void *holder)
 {
 	return (refcount_add_many(rc, 1, holder));
 }
diff --git a/zfs/module/zfs/zpl_ctldir.c b/zfs/module/zfs/zpl_ctldir.c
index d691f670b44d..10ef4d369982 100644
--- a/zfs/module/zfs/zpl_ctldir.c
+++ b/zfs/module/zfs/zpl_ctldir.c
@@ -100,16 +100,15 @@  zpl_root_readdir(struct file *filp, void *dirent, filldir_t filldir)
  */
 /* ARGSUSED */
 static int
-zpl_root_getattr(struct vfsmount *mnt, struct dentry *dentry,
-    struct kstat *stat)
+zpl_root_getattr_impl(const struct path *path, struct kstat *stat,
+    u32 request_mask, unsigned int query_flags)
 {
-	int error;
-
-	error = simple_getattr(mnt, dentry, stat);
+	generic_fillattr(path->dentry->d_inode, stat);
 	stat->atime = CURRENT_TIME;
 
-	return (error);
+	return (0);
 }
+ZPL_GETATTR_WRAPPER(zpl_root_getattr);
 
 static struct dentry *
 #ifdef HAVE_LOOKUP_NAMEIDATA
@@ -375,21 +374,22 @@  zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, zpl_umode_t mode)
  */
 /* ARGSUSED */
 static int
-zpl_snapdir_getattr(struct vfsmount *mnt, struct dentry *dentry,
-    struct kstat *stat)
+zpl_snapdir_getattr_impl(const struct path *path, struct kstat *stat,
+    u32 request_mask, unsigned int query_flags)
 {
-	zfs_sb_t *zsb = ITOZSB(dentry->d_inode);
-	int error;
+	zfs_sb_t *zsb = ITOZSB(path->dentry->d_inode);
 
 	ZFS_ENTER(zsb);
-	error = simple_getattr(mnt, dentry, stat);
+	generic_fillattr(path->dentry->d_inode, stat);
+
 	stat->nlink = stat->size = 2;
 	stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zsb->z_os);
 	stat->atime = CURRENT_TIME;
 	ZFS_EXIT(zsb);
 
-	return (error);
+	return (0);
 }
+ZPL_GETATTR_WRAPPER(zpl_snapdir_getattr);
 
 /*
  * The '.zfs/snapshot' directory file operations.  These mainly control
@@ -509,10 +509,10 @@  zpl_shares_readdir(struct file *filp, void *dirent, filldir_t filldir)
 
 /* ARGSUSED */
 static int
-zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
-    struct kstat *stat)
+zpl_shares_getattr_impl(const struct path *path, struct kstat *stat,
+    u32 request_mask, unsigned int query_flags)
 {
-	struct inode *ip = dentry->d_inode;
+	struct inode *ip = path->dentry->d_inode;
 	zfs_sb_t *zsb = ITOZSB(ip);
 	znode_t *dzp;
 	int error;
@@ -520,11 +520,11 @@  zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
 	ZFS_ENTER(zsb);
 
 	if (zsb->z_shares_dir == 0) {
-		error = simple_getattr(mnt, dentry, stat);
+		generic_fillattr(path->dentry->d_inode, stat);
 		stat->nlink = stat->size = 2;
 		stat->atime = CURRENT_TIME;
 		ZFS_EXIT(zsb);
-		return (error);
+		return (0);
 	}
 
 	error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp);
@@ -538,6 +538,7 @@  zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
 
 	return (error);
 }
+ZPL_GETATTR_WRAPPER(zpl_shares_getattr);
 
 /*
  * The '.zfs/shares' directory file operations.
diff --git a/zfs/module/zfs/zpl_inode.c b/zfs/module/zfs/zpl_inode.c
index 1714aa22bbd1..7aded9df2732 100644
--- a/zfs/module/zfs/zpl_inode.c
+++ b/zfs/module/zfs/zpl_inode.c
@@ -302,18 +302,25 @@  zpl_rmdir(struct inode * dir, struct dentry *dentry)
 }
 
 static int
-zpl_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
+zpl_getattr_impl(const struct path *path, struct kstat *stat, u32 request_mask,
+    unsigned int query_flags)
 {
 	int error;
 	fstrans_cookie_t cookie;
 
 	cookie = spl_fstrans_mark();
-	error = -zfs_getattr_fast(dentry->d_inode, stat);
+
+	/*
+	 * XXX request_mask and query_flags currently ignored.
+	 */
+
+	error = -zfs_getattr_fast(path->dentry->d_inode, stat);
 	spl_fstrans_unmark(cookie);
 	ASSERT3S(error, <=, 0);
 
 	return (error);
 }
+ZPL_GETATTR_WRAPPER(zpl_getattr);
 
 static int
 zpl_setattr(struct dentry *dentry, struct iattr *ia)
diff --git a/zfs/zfs_config.h.in b/zfs/zfs_config.h.in
index 7b9a0e21c66e..3e11dd51e766 100644
--- a/zfs/zfs_config.h.in
+++ b/zfs/zfs_config.h.in
@@ -291,6 +291,9 @@ 
 /* open_bdev_exclusive() is available */
 #undef HAVE_OPEN_BDEV_EXCLUSIVE
 
+/* iops->getattr() takes a path */
+#undef HAVE_PATH_IOPS_GETATTR
+
 /* iops->permission() exists */
 #undef HAVE_PERMISSION
 
@@ -387,6 +390,9 @@ 
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* iops->getattr() takes a vfsmount */
+#undef HAVE_VFSMOUNT_IOPS_GETATTR
+
 /* fops->iterate() is available */
 #undef HAVE_VFS_ITERATE