]> git.pld-linux.org Git - packages/zfs.git/commitdiff
- fix building witk kernel 5.0 auto/th/zfs-0.8.0-0.rc3.2
authorJan Rękorajski <baggins@pld-linux.org>
Mon, 11 Mar 2019 09:50:23 +0000 (10:50 +0100)
committerJan Rękorajski <baggins@pld-linux.org>
Mon, 11 Mar 2019 09:50:23 +0000 (10:50 +0100)
- rel 2

kernel-5.0.patch [new file with mode: 0644]
zfs.spec

diff --git a/kernel-5.0.patch b/kernel-5.0.patch
new file mode 100644 (file)
index 0000000..87a2e36
--- /dev/null
@@ -0,0 +1,993 @@
+From 5cb46f6a664db913f0ef2bf8e929c3f8d8cbfc5b Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2@llnl.gov>
+Date: Wed, 9 Jan 2019 13:16:39 -0800
+Subject: [PATCH] Linux 4.18 compat: Use ktime_get_coarse_real_ts64()
+
+Newer kernels remove current_kernel_time64().  Use
+ktime_get_coarse_real_ts64() in its place.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Tony Hutter <hutter2@llnl.gov>
+Closes #8258
+---
+ config/kernel-ktime_get_coarse_real_ts64.m4 | 18 ++++++++++++++++++
+ config/kernel.m4                            |  1 +
+ include/spl/sys/time.h                      | 12 ++++++++++++
+ 3 files changed, 31 insertions(+)
+ create mode 100644 config/kernel-ktime_get_coarse_real_ts64.m4
+
+diff --git a/config/kernel-ktime_get_coarse_real_ts64.m4 b/config/kernel-ktime_get_coarse_real_ts64.m4
+new file mode 100644
+index 00000000000..d6be8c4185a
+--- /dev/null
++++ b/config/kernel-ktime_get_coarse_real_ts64.m4
+@@ -0,0 +1,18 @@
++dnl #
++dnl # 4.18: ktime_get_coarse_real_ts64() added.  Use it in place of
++dnl # current_kernel_time64().
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64],
++      [AC_MSG_CHECKING([whether ktime_get_coarse_real_ts64() exists])
++      ZFS_LINUX_TRY_COMPILE([
++              #include <linux/mm.h>
++      ], [
++              struct timespec64 ts;
++              ktime_get_coarse_real_ts64(&ts);
++      ], [
++              AC_MSG_RESULT(yes)
++              AC_DEFINE(HAVE_KTIME_GET_COARSE_REAL_TS64, 1, [ktime_get_coarse_real_ts64() exists])
++      ], [
++              AC_MSG_RESULT(no)
++      ])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 7330c00e1bd..098c4370073 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -161,6 +161,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+       ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
+       ZFS_AC_KERNEL_USERNS_CAPABILITIES
+       ZFS_AC_KERNEL_IN_COMPAT_SYSCALL
++      ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64
+       AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
+               KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ"
+diff --git a/include/spl/sys/time.h b/include/spl/sys/time.h
+index 1a986c9b97c..312415b7bc8 100644
+--- a/include/spl/sys/time.h
++++ b/include/spl/sys/time.h
+@@ -73,7 +73,13 @@ static inline void
+ gethrestime(inode_timespec_t *ts)
+ {
+ #if defined(HAVE_INODE_TIMESPEC64_TIMES)
++
++#if defined(HAVE_KTIME_GET_COARSE_REAL_TS64)
++      ktime_get_coarse_real_ts64(ts);
++#else
+       *ts = current_kernel_time64();
++#endif /* HAVE_KTIME_GET_COARSE_REAL_TS64 */
++
+ #else
+       *ts = current_kernel_time();
+ #endif
+@@ -83,7 +89,13 @@ static inline time_t
+ gethrestime_sec(void)
+ {
+ #if defined(HAVE_INODE_TIMESPEC64_TIMES)
++#if defined(HAVE_KTIME_GET_COARSE_REAL_TS64)
++      inode_timespec_t ts;
++      ktime_get_coarse_real_ts64(&ts);
++#else
+       inode_timespec_t ts = current_kernel_time64();
++#endif  /* HAVE_KTIME_GET_COARSE_REAL_TS64 */
++
+ #else
+       inode_timespec_t ts = current_kernel_time();
+ #endif
+From 77e50c3070a0009c4ed8b50dbb7cf0df48bdda90 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2@llnl.gov>
+Date: Thu, 10 Jan 2019 11:03:40 -0800
+Subject: [PATCH] Linux 5.0 compat: access_ok() drops 'type' parameter
+
+access_ok no longer needs a 'type' parameter in the 5.0 kernel.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Tony Hutter <hutter2@llnl.gov>
+Closes #8261
+---
+ config/kernel-access-ok-type.m4 | 21 +++++++++++++++++++++
+ config/kernel.m4                |  1 +
+ include/linux/kmap_compat.h     |  8 ++++++++
+ module/zcommon/zfs_uio.c        |  3 +--
+ 4 files changed, 31 insertions(+), 2 deletions(-)
+ create mode 100644 config/kernel-access-ok-type.m4
+
+diff --git a/config/kernel-access-ok-type.m4 b/config/kernel-access-ok-type.m4
+new file mode 100644
+index 00000000000..3b2878a55cb
+--- /dev/null
++++ b/config/kernel-access-ok-type.m4
+@@ -0,0 +1,21 @@
++dnl #
++dnl # Linux 5.0: access_ok() drops 'type' parameter:
++dnl #
++dnl # - access_ok(type, addr, size)
++dnl # + access_ok(addr, size)
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_ACCESS_OK_TYPE], [
++      AC_MSG_CHECKING([whether access_ok() has 'type' parameter])
++      ZFS_LINUX_TRY_COMPILE([
++              #include <linux/uaccess.h>
++      ],[
++              const void __user __attribute__((unused)) *addr = (void *) 0xdeadbeef;
++              unsigned long __attribute__((unused)) size = 1;
++              int error __attribute__((unused)) = access_ok(0, addr, size);
++      ],[
++              AC_MSG_RESULT(yes)
++              AC_DEFINE(HAVE_ACCESS_OK_TYPE, 1, [kernel has access_ok with 'type' parameter])
++      ],[
++              AC_MSG_RESULT(no)
++      ])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 098c4370073..ea04d85b6cd 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -4,6 +4,7 @@ dnl #
+ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+       ZFS_AC_KERNEL
+       ZFS_AC_QAT
++      ZFS_AC_KERNEL_ACCESS_OK_TYPE
+       ZFS_AC_TEST_MODULE
+       ZFS_AC_KERNEL_MISC_MINOR
+       ZFS_AC_KERNEL_OBJTOOL
+diff --git a/include/linux/kmap_compat.h b/include/linux/kmap_compat.h
+index 59ae566ce9d..b9c7f5bcc9d 100644
+--- a/include/linux/kmap_compat.h
++++ b/include/linux/kmap_compat.h
+@@ -27,6 +27,7 @@
+ #define       _ZFS_KMAP_H
+ #include <linux/highmem.h>
++#include <linux/uaccess.h>
+ #ifdef HAVE_1ARG_KMAP_ATOMIC
+ /* 2.6.37 API change */
+@@ -37,4 +38,11 @@
+ #define       zfs_kunmap_atomic(addr, km_type)        kunmap_atomic(addr, km_type)
+ #endif
++/* 5.0 API change - no more 'type' argument for access_ok() */
++#ifdef HAVE_ACCESS_OK_TYPE
++#define       zfs_access_ok(type, addr, size) access_ok(type, addr, size)
++#else
++#define       zfs_access_ok(type, addr, size) access_ok(addr, size)
++#endif
++
+ #endif        /* _ZFS_KMAP_H */
+diff --git a/module/zcommon/zfs_uio.c b/module/zcommon/zfs_uio.c
+index a2c1b5c3aaf..c1e31f51be0 100644
+--- a/module/zcommon/zfs_uio.c
++++ b/module/zcommon/zfs_uio.c
+@@ -81,11 +81,10 @@ uiomove_iov(void *p, size_t n, enum uio_rw rw, struct uio *uio)
+                                       return (EFAULT);
+                       } else {
+                               if (uio->uio_fault_disable) {
+-                                      if (!access_ok(VERIFY_READ,
++                                      if (!zfs_access_ok(VERIFY_READ,
+                                           (iov->iov_base + skip), cnt)) {
+                                               return (EFAULT);
+                                       }
+-
+                                       pagefault_disable();
+                                       if (__copy_from_user_inatomic(p,
+                                           (iov->iov_base + skip), cnt)) {
+From 031cea17a3db1dae3b6968a8c71bcfb678a03235 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2@llnl.gov>
+Date: Thu, 10 Jan 2019 14:28:10 -0800
+Subject: [PATCH] Linux 5.0 compat: Use totalram_pages()
+
+totalram_pages() was converted to an atomic variable in 5.0:
+
+https://patchwork.kernel.org/patch/10652795/
+
+Its value should now be read though the totalram_pages() helper
+function.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Tony Hutter <hutter2@llnl.gov>
+Closes #8263
+---
+ config/kernel-totalram-pages-func.m4 | 18 ++++++++++++++++++
+ config/kernel.m4                     |  1 +
+ include/spl/sys/vmsystm.h            |  8 +++++++-
+ module/zfs/arc.c                     |  4 ++--
+ 4 files changed, 28 insertions(+), 3 deletions(-)
+ create mode 100644 config/kernel-totalram-pages-func.m4
+
+diff --git a/config/kernel-totalram-pages-func.m4 b/config/kernel-totalram-pages-func.m4
+new file mode 100644
+index 00000000000..a6eac645431
+--- /dev/null
++++ b/config/kernel-totalram-pages-func.m4
+@@ -0,0 +1,18 @@
++dnl #
++dnl # Linux 5.0: totalram_pages is no longer a global variable, and must be
++dnl # read via the totalram_pages() helper function.
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC], [
++      AC_MSG_CHECKING([whether totalram_pages() exists])
++      ZFS_LINUX_TRY_COMPILE([
++              #include <linux/mm.h>
++      ],[
++              unsigned long pages __attribute__ ((unused));
++              pages = totalram_pages();
++      ],[
++              AC_MSG_RESULT(yes)
++              AC_DEFINE(HAVE_TOTALRAM_PAGES_FUNC, 1, [kernel has totalram_pages()])
++      ],[
++              AC_MSG_RESULT(no)
++      ])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index ea04d85b6cd..e4d0e3393b6 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -163,6 +163,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+       ZFS_AC_KERNEL_USERNS_CAPABILITIES
+       ZFS_AC_KERNEL_IN_COMPAT_SYSCALL
+       ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64
++      ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC
+       AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
+               KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ"
+diff --git a/include/spl/sys/vmsystm.h b/include/spl/sys/vmsystm.h
+index 2b48fe0e369..6bdfc852ac0 100644
+--- a/include/spl/sys/vmsystm.h
++++ b/include/spl/sys/vmsystm.h
+@@ -33,8 +33,14 @@
+ #include <sys/types.h>
+ #include <asm/uaccess.h>
++#ifdef HAVE_TOTALRAM_PAGES_FUNC
++#define       zfs_totalram_pages      totalram_pages()
++#else
++#define       zfs_totalram_pages      totalram_pages
++#endif
++
+ #define       membar_producer()               smp_wmb()
+-#define       physmem                         totalram_pages
++#define       physmem                         zfs_totalram_pages
+ #define       freemem                 (nr_free_pages() + \
+                               global_page_state(NR_INACTIVE_FILE) + \
+                               global_page_state(NR_INACTIVE_ANON) + \
+diff --git a/module/zfs/arc.c b/module/zfs/arc.c
+index 7e09633345d..f5d94cbf90a 100644
+--- a/module/zfs/arc.c
++++ b/module/zfs/arc.c
+@@ -4821,9 +4821,9 @@ arc_all_memory(void)
+ {
+ #ifdef _KERNEL
+ #ifdef CONFIG_HIGHMEM
+-      return (ptob(totalram_pages - totalhigh_pages));
++      return (ptob(zfs_totalram_pages - totalhigh_pages));
+ #else
+-      return (ptob(totalram_pages));
++      return (ptob(zfs_totalram_pages));
+ #endif /* CONFIG_HIGHMEM */
+ #else
+       return (ptob(physmem) / 2);
+From 05805494dd7ea3b2fbb34ac031c338a8bc0bab62 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2@llnl.gov>
+Date: Thu, 10 Jan 2019 15:28:44 -0800
+Subject: [PATCH] Linux 5.0 compat: Convert MS_* macros to SB_*
+
+In the 5.0 kernel, only the mount namespace code should use the MS_*
+macos. Filesystems should use the SB_* ones.
+
+https://patchwork.kernel.org/patch/10552493/
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Tony Hutter <hutter2@llnl.gov>
+Closes #8264
+---
+ module/zfs/vdev_disk.c  |  3 ++-
+ module/zfs/zfs_vfsops.c | 23 ++++++++++++-----------
+ 2 files changed, 14 insertions(+), 12 deletions(-)
+
+diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
+index d13f365dd05..c53a0aa0fcb 100644
+--- a/module/zfs/vdev_disk.c
++++ b/module/zfs/vdev_disk.c
+@@ -35,6 +35,7 @@
+ #include <sys/zio.h>
+ #include <linux/mod_compat.h>
+ #include <linux/msdos_fs.h>
++#include <linux/vfs_compat.h>
+ char *zfs_vdev_scheduler = VDEV_SCHEDULER;
+ static void *zfs_vdev_holder = VDEV_HOLDER;
+@@ -79,7 +80,7 @@ vdev_bdev_mode(int smode)
+       ASSERT3S(smode & (FREAD | FWRITE), !=, 0);
+       if ((smode & FREAD) && !(smode & FWRITE))
+-              mode = MS_RDONLY;
++              mode = SB_RDONLY;
+       return (mode);
+ }
+diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c
+index c9e314caa22..766cbab7436 100644
+--- a/module/zfs/zfs_vfsops.c
++++ b/module/zfs/zfs_vfsops.c
+@@ -56,6 +56,7 @@
+ #include <sys/dmu_objset.h>
+ #include <sys/spa_boot.h>
+ #include <sys/zpl.h>
++#include <linux/vfs_compat.h>
+ #include "zfs_comutil.h"
+ enum {
+@@ -249,7 +250,7 @@ zfsvfs_parse_options(char *mntopts, vfs_t **vfsp)
+ boolean_t
+ zfs_is_readonly(zfsvfs_t *zfsvfs)
+ {
+-      return (!!(zfsvfs->z_sb->s_flags & MS_RDONLY));
++      return (!!(zfsvfs->z_sb->s_flags & SB_RDONLY));
+ }
+ /*ARGSUSED*/
+@@ -336,15 +337,15 @@ acltype_changed_cb(void *arg, uint64_t newval)
+       switch (newval) {
+       case ZFS_ACLTYPE_OFF:
+               zfsvfs->z_acl_type = ZFS_ACLTYPE_OFF;
+-              zfsvfs->z_sb->s_flags &= ~MS_POSIXACL;
++              zfsvfs->z_sb->s_flags &= ~SB_POSIXACL;
+               break;
+       case ZFS_ACLTYPE_POSIXACL:
+ #ifdef CONFIG_FS_POSIX_ACL
+               zfsvfs->z_acl_type = ZFS_ACLTYPE_POSIXACL;
+-              zfsvfs->z_sb->s_flags |= MS_POSIXACL;
++              zfsvfs->z_sb->s_flags |= SB_POSIXACL;
+ #else
+               zfsvfs->z_acl_type = ZFS_ACLTYPE_OFF;
+-              zfsvfs->z_sb->s_flags &= ~MS_POSIXACL;
++              zfsvfs->z_sb->s_flags &= ~SB_POSIXACL;
+ #endif /* CONFIG_FS_POSIX_ACL */
+               break;
+       default:
+@@ -373,9 +374,9 @@ readonly_changed_cb(void *arg, uint64_t newval)
+               return;
+       if (newval)
+-              sb->s_flags |= MS_RDONLY;
++              sb->s_flags |= SB_RDONLY;
+       else
+-              sb->s_flags &= ~MS_RDONLY;
++              sb->s_flags &= ~SB_RDONLY;
+ }
+ static void
+@@ -403,9 +404,9 @@ nbmand_changed_cb(void *arg, uint64_t newval)
+               return;
+       if (newval == TRUE)
+-              sb->s_flags |= MS_MANDLOCK;
++              sb->s_flags |= SB_MANDLOCK;
+       else
+-              sb->s_flags &= ~MS_MANDLOCK;
++              sb->s_flags &= ~SB_MANDLOCK;
+ }
+ static void
+@@ -1954,8 +1955,8 @@ zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm)
+       int error;
+       if ((issnap || !spa_writeable(dmu_objset_spa(zfsvfs->z_os))) &&
+-          !(*flags & MS_RDONLY)) {
+-              *flags |= MS_RDONLY;
++          !(*flags & SB_RDONLY)) {
++              *flags |= SB_RDONLY;
+               return (EROFS);
+       }
+@@ -1963,7 +1964,7 @@ zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm)
+       if (error)
+               return (error);
+-      if (!zfs_is_readonly(zfsvfs) && (*flags & MS_RDONLY))
++      if (!zfs_is_readonly(zfsvfs) && (*flags & SB_RDONLY))
+               txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
+       zfs_unregister_callbacks(zfsvfs);
+From ed158b19b1dddf26f2bbebb4d0fd21f04fdd5d38 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2@llnl.gov>
+Date: Thu, 10 Jan 2019 17:07:05 -0800
+Subject: [PATCH] Linux 5.0 compat: Fix SUBDIRs
+
+SUBDIRs has been deprecated for a long time, and was finally removed in
+the 5.0 kernel.  Use "M=" instead.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Tony Hutter <hutter2@llnl.gov>
+Closes #8257
+---
+ module/Makefile.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/module/Makefile.in b/module/Makefile.in
+index 82d155dd31a..935bd266306 100644
+--- a/module/Makefile.in
++++ b/module/Makefile.in
+@@ -29,12 +29,12 @@ modules:
+       list='$(SUBDIR_TARGETS)'; for targetdir in $$list; do \
+               $(MAKE) -C $$targetdir; \
+       done
+-      $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNEL_MAKE@ CONFIG_ZFS=m $@
++      $(MAKE) -C @LINUX_OBJ@ M=`pwd` @KERNEL_MAKE@ CONFIG_ZFS=m $@
+ clean:
+       @# Only cleanup the kernel build directories when CONFIG_KERNEL
+       @# is defined.  This indicates that kernel modules should be built.
+-@CONFIG_KERNEL_TRUE@  $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNEL_MAKE@ $@
++@CONFIG_KERNEL_TRUE@  $(MAKE) -C @LINUX_OBJ@ M=`pwd` @KERNEL_MAKE@ $@
+       if [ -f @LINUX_SYMBOLS@ ]; then $(RM) @LINUX_SYMBOLS@; fi
+       if [ -f Module.markers ]; then $(RM) Module.markers; fi
+@@ -43,7 +43,7 @@ clean:
+ modules_install:
+       @# Install the kernel modules
+-      $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` $@ \
++      $(MAKE) -C @LINUX_OBJ@ M=`pwd` $@ \
+               INSTALL_MOD_PATH=$(DESTDIR)$(INSTALL_MOD_PATH) \
+               INSTALL_MOD_DIR=$(INSTALL_MOD_DIR) \
+               KERNELRELEASE=@LINUX_VERSION@
+From 0c593296e98e3ac95f14704e4cee6cedb2134990 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2@llnl.gov>
+Date: Fri, 11 Jan 2019 18:01:28 -0800
+Subject: [PATCH] Linux 5.0 compat: Disable vector instructions on 5.0+ kernels
+
+The 5.0 kernel no longer exports the functions we need to do vector
+(SSE/SSE2/SSE3/AVX...) instructions.  Disable vector-based checksum
+algorithms when building against those kernels.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Tony Hutter <hutter2@llnl.gov>
+Closes #8259
+---
+ config/kernel-fpu.m4     |  41 ++++++++---
+ include/linux/simd_x86.h | 142 ++++++++++++++++++++++++++++++---------
+ 2 files changed, 144 insertions(+), 39 deletions(-)
+
+diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4
+index 1c5690969d4..671fe7ea54e 100644
+--- a/config/kernel-fpu.m4
++++ b/config/kernel-fpu.m4
+@@ -1,18 +1,41 @@
++dnl # 
++dnl # Handle differences in kernel FPU code.
+ dnl #
+-dnl # 4.2 API change
+-dnl # asm/i387.h is replaced by asm/fpu/api.h
++dnl # Kernel
++dnl # 5.0:    All kernel fpu functions are GPL only, so we can't use them.
++dnl #         (nothing defined)
++dnl #
++dnl # 4.2:    Use __kernel_fpu_{begin,end}()
++dnl #         HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
++dnl #
++dnl # Pre-4.2:        Use kernel_fpu_{begin,end}()
++dnl #         HAVE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
+ dnl #
+ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
+-      AC_MSG_CHECKING([whether asm/fpu/api.h exists])
++      AC_MSG_CHECKING([which kernel_fpu function to use])
+       ZFS_LINUX_TRY_COMPILE([
+-              #include <linux/kernel.h>
+-              #include <asm/fpu/api.h>
++              #include <asm/i387.h>
++              #include <asm/xcr.h>
+       ],[
+-              __kernel_fpu_begin();
++              kernel_fpu_begin();
++              kernel_fpu_end();
+       ],[
+-              AC_MSG_RESULT(yes)
+-              AC_DEFINE(HAVE_FPU_API_H, 1, [kernel has <asm/fpu/api.h> interface])
++              AC_MSG_RESULT(kernel_fpu_*)
++              AC_DEFINE(HAVE_KERNEL_FPU, 1, [kernel has kernel_fpu_* functions])
++              AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions])
+       ],[
+-              AC_MSG_RESULT(no)
++              ZFS_LINUX_TRY_COMPILE([
++                      #include <linux/kernel.h>
++                      #include <asm/fpu/api.h>
++              ],[
++                      __kernel_fpu_begin();
++                      __kernel_fpu_end();
++              ],[
++                      AC_MSG_RESULT(__kernel_fpu_*)
++                      AC_DEFINE(HAVE_UNDERSCORE_KERNEL_FPU, 1, [kernel has __kernel_fpu_* functions])
++                      AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions])
++              ],[
++                      AC_MSG_RESULT(not exported)
++              ])
+       ])
+ ])
+diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
+index 10ce02e3746..5d6fbed35b9 100644
+--- a/include/linux/simd_x86.h
++++ b/include/linux/simd_x86.h
+@@ -81,7 +81,7 @@
+ #endif
+ #if defined(_KERNEL)
+-#if defined(HAVE_FPU_API_H)
++#if defined(HAVE_UNDERSCORE_KERNEL_FPU)
+ #include <asm/fpu/api.h>
+ #include <asm/fpu/internal.h>
+ #define       kfpu_begin()            \
+@@ -94,12 +94,18 @@
+       __kernel_fpu_end();             \
+       preempt_enable();               \
+ }
+-#else
++#elif defined(HAVE_KERNEL_FPU)
+ #include <asm/i387.h>
+ #include <asm/xcr.h>
+ #define       kfpu_begin()    kernel_fpu_begin()
+ #define       kfpu_end()              kernel_fpu_end()
+-#endif /* defined(HAVE_FPU_API_H) */
++#else
++/* Kernel doesn't export any kernel_fpu_* functions */
++#include <asm/fpu/internal.h> /* For kernel xgetbv() */
++#define       kfpu_begin()    panic("This code should never run")
++#define       kfpu_end()      panic("This code should never run")
++#endif /* defined(HAVE_KERNEL_FPU) */
++
+ #else
+ /*
+  * fpu dummy methods for userspace
+@@ -286,11 +292,13 @@ __simd_state_enabled(const uint64_t state)
+       boolean_t has_osxsave;
+       uint64_t xcr0;
+-#if defined(_KERNEL) && defined(X86_FEATURE_OSXSAVE)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_OSXSAVE) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE);
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_OSXSAVE)
+-      has_osxsave = B_FALSE;
+ #else
++      has_osxsave = B_FALSE;
++#endif
++#elif !defined(_KERNEL)
+       has_osxsave = __cpuid_has_osxsave();
+ #endif
+@@ -315,8 +323,12 @@ static inline boolean_t
+ zfs_sse_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_XMM));
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_sse());
+ #endif
+ }
+@@ -328,8 +340,12 @@ static inline boolean_t
+ zfs_sse2_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_XMM2));
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_sse2());
+ #endif
+ }
+@@ -341,8 +357,12 @@ static inline boolean_t
+ zfs_sse3_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_XMM3));
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_sse3());
+ #endif
+ }
+@@ -354,8 +374,12 @@ static inline boolean_t
+ zfs_ssse3_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_SSSE3));
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_ssse3());
+ #endif
+ }
+@@ -367,8 +391,12 @@ static inline boolean_t
+ zfs_sse4_1_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_XMM4_1));
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_sse4_1());
+ #endif
+ }
+@@ -380,8 +408,12 @@ static inline boolean_t
+ zfs_sse4_2_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_XMM4_2));
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_sse4_2());
+ #endif
+ }
+@@ -394,8 +426,12 @@ zfs_avx_available(void)
+ {
+       boolean_t has_avx;
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx = !!boot_cpu_has(X86_FEATURE_AVX);
+ #else
++      has_avx = B_FALSE;
++#endif
++#elif !defined(_KERNEL)
+       has_avx = __cpuid_has_avx();
+ #endif
+@@ -409,11 +445,13 @@ static inline boolean_t
+ zfs_avx2_available(void)
+ {
+       boolean_t has_avx2;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX2)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX2) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx2 = !!boot_cpu_has(X86_FEATURE_AVX2);
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_AVX2)
+-      has_avx2 = B_FALSE;
+ #else
++      has_avx2 = B_FALSE;
++#endif
++#elif !defined(_KERNEL)
+       has_avx2 = __cpuid_has_avx2();
+ #endif
+@@ -426,11 +464,13 @@ zfs_avx2_available(void)
+ static inline boolean_t
+ zfs_bmi1_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_BMI1)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_BMI1) && defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_BMI1));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_BMI1)
+-      return (B_FALSE);
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_bmi1());
+ #endif
+ }
+@@ -441,11 +481,13 @@ zfs_bmi1_available(void)
+ static inline boolean_t
+ zfs_bmi2_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_BMI2)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_BMI2) && defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_BMI2));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_BMI2)
+-      return (B_FALSE);
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_bmi2());
+ #endif
+ }
+@@ -456,11 +498,13 @@ zfs_bmi2_available(void)
+ static inline boolean_t
+ zfs_aes_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_AES)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AES) && defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_AES));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_AES)
+-      return (B_FALSE);
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_aes());
+ #endif
+ }
+@@ -471,11 +515,13 @@ zfs_aes_available(void)
+ static inline boolean_t
+ zfs_pclmulqdq_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_PCLMULQDQ)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_PCLMULQDQ) && defined(KERNEL_EXPORTS_X86_FPU)
+       return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_PCLMULQDQ)
+-      return (B_FALSE);
+ #else
++      return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+       return (__cpuid_has_pclmulqdq());
+ #endif
+ }
+@@ -503,8 +549,12 @@ zfs_avx512f_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512F)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512F) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512f();
+ #endif
+@@ -518,9 +568,13 @@ zfs_avx512cd_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512CD)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512CD) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512CD);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512cd();
+ #endif
+@@ -534,9 +588,13 @@ zfs_avx512er_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512ER)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512ER) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512ER);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512er();
+ #endif
+@@ -550,9 +608,13 @@ zfs_avx512pf_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512PF)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512PF) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512PF);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512pf();
+ #endif
+@@ -566,9 +628,13 @@ zfs_avx512bw_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512BW)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512BW) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512BW);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512bw();
+ #endif
+@@ -582,9 +648,13 @@ zfs_avx512dq_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512DQ)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512DQ) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512DQ);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512dq();
+ #endif
+@@ -598,9 +668,13 @@ zfs_avx512vl_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512VL)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512VL) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512VL);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512vl();
+ #endif
+@@ -614,9 +688,13 @@ zfs_avx512ifma_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512IFMA)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512IFMA) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512IFMA);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512ifma();
+ #endif
+@@ -630,9 +708,13 @@ zfs_avx512vbmi_available(void)
+ {
+       boolean_t has_avx512 = B_FALSE;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512VBMI)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512VBMI) && defined(KERNEL_EXPORTS_X86_FPU)
+       has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+           boot_cpu_has(X86_FEATURE_AVX512VBMI);
++#else
++      has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+       has_avx512 = __cpuid_has_avx512f() &&
+           __cpuid_has_avx512vbmi();
+From 26a856594f731db62446cf537659f9360261fe97 Mon Sep 17 00:00:00 2001
+From: Brian Behlendorf <behlendorf1@llnl.gov>
+Date: Wed, 16 Jan 2019 10:39:19 -0800
+Subject: [PATCH] Linux 5.0 compat: Fix bio_set_dev()
+
+The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
+GPL-only bio_associate_blkg() symbol thus inadvertently converting
+the entire macro.  Provide a minimal version which always assigns the
+request queue's root_blkg to the bio.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Closes #8287
+---
+ config/kernel-bio_set_dev.m4 | 35 +++++++++++++++++++++++++++++++++--
+ module/zfs/vdev_disk.c       | 29 +++++++++++++++++++++++++++--
+ 2 files changed, 60 insertions(+), 4 deletions(-)
+
+diff --git a/config/kernel-bio_set_dev.m4 b/config/kernel-bio_set_dev.m4
+index 6be873c5615..71d47a89309 100644
+--- a/config/kernel-bio_set_dev.m4
++++ b/config/kernel-bio_set_dev.m4
+@@ -1,10 +1,10 @@
+ dnl #
+ dnl # Linux 4.14 API,
+ dnl #
+-dnl # The bio_set_dev() helper was introduced as part of the transition
++dnl # The bio_set_dev() helper macro was introduced as part of the transition
+ dnl # to have struct gendisk in struct bio. 
+ dnl #
+-AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
++AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV_MACRO], [
+       AC_MSG_CHECKING([whether bio_set_dev() exists])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/bio.h>
+@@ -20,3 +20,34 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
+               AC_MSG_RESULT(no)
+       ])
+ ])
++
++dnl #
++dnl # Linux 5.0 API,
++dnl #
++dnl # The bio_set_dev() helper macro was updated to internally depend on
++dnl # bio_associate_blkg() symbol which is exported GPL-only.
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV_GPL_ONLY], [
++      AC_MSG_CHECKING([whether bio_set_dev() is GPL-only])
++      ZFS_LINUX_TRY_COMPILE([
++              #include <linux/module.h>
++              #include <linux/bio.h>
++              #include <linux/fs.h>
++              MODULE_LICENSE("$ZFS_META_LICENSE");
++      ],[
++              struct block_device *bdev = NULL;
++              struct bio *bio = NULL;
++              bio_set_dev(bio, bdev);
++      ],[
++              AC_MSG_RESULT(no)
++      ],[
++              AC_MSG_RESULT(yes)
++              AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1,
++                  [bio_set_dev() GPL-only])
++      ])
++])
++
++AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
++      ZFS_AC_KERNEL_BIO_SET_DEV_MACRO
++      ZFS_AC_KERNEL_BIO_SET_DEV_GPL_ONLY
++])
+diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
+index c53a0aa0fcb..db765c57bb3 100644
+--- a/module/zfs/vdev_disk.c
++++ b/module/zfs/vdev_disk.c
+@@ -513,13 +513,38 @@ vdev_submit_bio_impl(struct bio *bio)
+ #endif
+ }
+-#ifndef HAVE_BIO_SET_DEV
++#ifdef HAVE_BIO_SET_DEV
++#if defined(CONFIG_BLK_CGROUP) && defined(HAVE_BIO_SET_DEV_GPL_ONLY)
++/*
++ * The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
++ * GPL-only bio_associate_blkg() symbol thus inadvertently converting
++ * the entire macro.  Provide a minimal version which always assigns the
++ * request queue's root_blkg to the bio.
++ */
++static inline void
++vdev_bio_associate_blkg(struct bio *bio)
++{
++      struct request_queue *q = bio->bi_disk->queue;
++
++      ASSERT3P(q, !=, NULL);
++      ASSERT3P(q->root_blkg, !=, NULL);
++      ASSERT3P(bio->bi_blkg, ==, NULL);
++
++      if (blkg_tryget(q->root_blkg))
++              bio->bi_blkg = q->root_blkg;
++}
++#define       bio_associate_blkg vdev_bio_associate_blkg
++#endif
++#else
++/*
++ * Provide a bio_set_dev() helper macro for pre-Linux 4.14 kernels.
++ */
+ static inline void
+ bio_set_dev(struct bio *bio, struct block_device *bdev)
+ {
+       bio->bi_bdev = bdev;
+ }
+-#endif /* !HAVE_BIO_SET_DEV */
++#endif /* HAVE_BIO_SET_DEV */
+ static inline void
+ vdev_submit_bio(struct bio *bio)
index b39c81534403668d50824d08f61441253ca6a9e5..0e9816e84ed8668702cb937cf67fb40bda37b8df 100644 (file)
--- a/zfs.spec
+++ b/zfs.spec
@@ -29,7 +29,7 @@ exit 1
 %define                _duplicate_files_terminate_build        0
 
 %define        _rc     rc3
-%define        rel     0.%{_rc}.1
+%define        rel     0.%{_rc}.2
 %define        pname   zfs
 Summary:       Native Linux port of the ZFS filesystem
 Summary(pl.UTF-8):     Natywny linuksowy port systemu plików ZFS
@@ -43,6 +43,7 @@ Source0:      https://github.com/zfsonlinux/zfs/archive/zfs-%{version}-%{_rc}/%{pname
 # Source0-md5: 430cd26a1d246029017e9250eb00f8f2
 Patch0:                x32.patch
 Patch1:                am.patch
+Patch2:                kernel-5.0.patch
 URL:           http://zfsonlinux.org/
 BuildRequires: autoconf >= 2.50
 BuildRequires: automake
@@ -256,6 +257,7 @@ p=`pwd`\
 %setup -q -n %{pname}-zfs-%{version}-%{_rc}
 %patch0 -p1
 %patch1 -p1
+%patch2 -p1
 
 %build
 %{__libtoolize}
This page took 0.299692 seconds and 4 git commands to generate.