Message ID | 20170502143247.13413-1-colin.king@canonical.com |
---|---|
State | New |
Headers | show |
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 > >
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 --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