]> git.proxmox.com Git - mirror_zfs.git/blobdiff - config/spl-build.m4
Add support for recent kmem_cache_create_usercopy
[mirror_zfs.git] / config / spl-build.m4
index 3ed0e8fd0d629c04119ceda6b56ddcea6eaa9c44..8d0e8aba3ccd2b85c726a61da9f985081068d5cf 100644 (file)
@@ -49,6 +49,8 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_WAIT_ON_BIT
        SPL_AC_MUTEX_OWNER
        SPL_AC_INODE_LOCK
+       SPL_AC_GROUP_INFO_GID
+       SPL_AC_KMEM_CACHE_CREATE_USERCOPY
 ])
 
 AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@@ -1537,6 +1539,7 @@ AC_DEFUN([SPL_AC_MUTEX_OWNER], [
        EXTRA_KCFLAGS="-Werror"
        SPL_LINUX_TRY_COMPILE([
                #include <linux/mutex.h>
+               #include <linux/spinlock.h>
        ],[
                DEFINE_MUTEX(m);
                struct task_struct *t __attribute__ ((unused));
@@ -1573,3 +1576,61 @@ AC_DEFUN([SPL_AC_INODE_LOCK], [
        ])
        EXTRA_KCFLAGS="$tmp_flags"
 ])
+
+dnl #
+dnl # 4.9 API change
+dnl # group_info changed from 2d array via >blocks to 1d array via ->gid
+dnl #
+AC_DEFUN([SPL_AC_GROUP_INFO_GID], [
+       AC_MSG_CHECKING([whether group_info->gid exists])
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Werror"
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/cred.h>
+       ],[
+               struct group_info *gi = groups_alloc(1);
+               gi->gid[0] = KGIDT_INIT(0);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_GROUP_INFO_GID, 1, [group_info->gid exists])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+       EXTRA_KCFLAGS="$tmp_flags"
+])
+
+dnl #
+dnl # grsecurity API change,
+dnl # kmem_cache_create() with SLAB_USERCOPY flag replaced by
+dnl # kmem_cache_create_usercopy().
+dnl #
+AC_DEFUN([SPL_AC_KMEM_CACHE_CREATE_USERCOPY], [
+       AC_MSG_CHECKING([whether kmem_cache_create_usercopy() exists])
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Werror"
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/slab.h>
+               static void ctor(void *foo)
+               {
+                       // fake ctor
+               }
+       ],[
+               struct kmem_cache *skc_linux_cache;
+               const char *name = "test";
+               size_t size = 4096;
+               size_t align = 8;
+               unsigned long flags = 0;
+               size_t useroffset = 0;
+               size_t usersize = size - useroffset;
+
+               skc_linux_cache = kmem_cache_create_usercopy(
+                       name, size, align, flags, useroffset, usersize, ctor);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_KMEM_CACHE_CREATE_USERCOPY, 1,
+                               [kmem_cache_create_usercopy() exists])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+       EXTRA_KCFLAGS="$tmp_flags"
+])