]> git.proxmox.com Git - mirror_spl-debian.git/blobdiff - config/spl-build.m4
Imported Upstream version 0.6.3+git20140731
[mirror_spl-debian.git] / config / spl-build.m4
index 83cefabd422ffcf42bcc688b18c1c97f7cea2b99..eef52334fb10532d00351607990534e50be0777e 100644 (file)
@@ -27,12 +27,13 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_TYPE_ATOMIC64_XCHG
        SPL_AC_TYPE_UINTPTR_T
        SPL_AC_2ARGS_REGISTER_SYSCTL
-       SPL_AC_SET_SHRINKER
-       SPL_AC_3ARGS_SHRINKER_CALLBACK
+       SPL_AC_SHRINKER_CALLBACK
        SPL_AC_PATH_IN_NAMEIDATA
        SPL_AC_TASK_CURR
        SPL_AC_CTL_UNNUMBERED
        SPL_AC_CTL_NAME
+       SPL_AC_VMALLOC_INFO
+       SPL_AC_PDE_DATA
        SPL_AC_FLS64
        SPL_AC_DEVICE_CREATE
        SPL_AC_5ARGS_DEVICE_CREATE
@@ -63,7 +64,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_GET_ZONE_COUNTS
        SPL_AC_USER_PATH_DIR
        SPL_AC_SET_FS_PWD
-       SPL_AC_2ARGS_SET_FS_PWD
+       SPL_AC_SET_FS_PWD_WITH_CONST
        SPL_AC_2ARGS_VFS_UNLINK
        SPL_AC_4ARGS_VFS_RENAME
        SPL_AC_VFS_FSYNC
@@ -71,6 +72,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_INODE_TRUNCATE_RANGE
        SPL_AC_FS_STRUCT_SPINLOCK
        SPL_AC_CRED_STRUCT
+       SPL_AC_KUIDGID_T
        SPL_AC_GROUPS_SEARCH
        SPL_AC_PUT_TASK_STRUCT
        SPL_AC_5ARGS_PROC_HANDLER
@@ -90,6 +92,8 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_RWSEM_SPINLOCK_IS_RAW
        SPL_AC_SCHED_RT_HEADER
        SPL_AC_2ARGS_VFS_GETATTR
+       SPL_AC_USLEEP_RANGE
+       SPL_AC_KMEM_CACHE_ALLOCFLAGS
 ])
 
 AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@@ -105,7 +109,7 @@ AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
                if ! test -f "$LINUX_OBJ/$LINUX_SYMBOLS"; then
                        AC_MSG_ERROR([
        *** Please make sure the kernel devel package for your distribution
-       *** is installed.  If your building with a custom kernel make sure the
+       *** is installed.  If you are building with a custom kernel, make sure the
        *** kernel is configured, built, and the '--with-linux=PATH' configure
        *** option refers to the location of the kernel source.])
                fi
@@ -156,7 +160,7 @@ AC_DEFUN([SPL_AC_KERNEL], [
        if test ! -d "$kernelsrc"; then
                AC_MSG_ERROR([
        *** Please make sure the kernel devel package for your distribution
-       *** is installed then try again.  If that fails you can specify the
+       *** is installed and then try again.  If that fails, you can specify the
        *** location of the kernel source with the '--with-linux=PATH' option.])
        fi
 
@@ -229,9 +233,14 @@ AC_DEFUN([SPL_AC_CONFIG_USER], [])
 
 dnl #
 dnl # Check for rpm+rpmbuild to build RPM packages.  If these tools
-dnl # are missing it is non-fatal but you will not be able to build
+dnl # are missing, it is non-fatal, but you will not be able to build
 dnl # RPM packages and will be warned if you try too.
 dnl #
+dnl # By default, the generic spec file will be used because it requires
+dnl # minimal dependencies.  Distribution specific spec files can be
+dnl # placed under the 'rpm/<distribution>' directory and enabled using
+dnl # the --with-spec=<distribution> configure option.
+dnl #
 AC_DEFUN([SPL_AC_RPM], [
        RPM=rpm
        RPMBUILD=rpmbuild
@@ -256,6 +265,25 @@ AC_DEFUN([SPL_AC_RPM], [
                AC_MSG_RESULT([$HAVE_RPMBUILD])
        ])
 
+       RPM_DEFINE_COMMON='--define "$(DEBUG_SPL) 1" --define "$(DEBUG_LOG) 1" --define "$(DEBUG_KMEM) 1" --define "$(DEBUG_KMEM_TRACKING) 1"'
+       RPM_DEFINE_UTIL=
+       RPM_DEFINE_KMOD='--define "kernels $(LINUX_VERSION)"'
+       RPM_DEFINE_DKMS=
+
+       SRPM_DEFINE_COMMON='--define "build_src_rpm 1"'
+       SRPM_DEFINE_UTIL=
+       SRPM_DEFINE_KMOD=
+       SRPM_DEFINE_DKMS=
+
+       RPM_SPEC_DIR="rpm/generic"
+       AC_ARG_WITH([spec],
+               AS_HELP_STRING([--with-spec=SPEC],
+               [Spec files 'generic|fedora']),
+               [RPM_SPEC_DIR="rpm/$withval"])
+
+       AC_MSG_CHECKING([whether spec files are available])
+       AC_MSG_RESULT([yes ($RPM_SPEC_DIR/*.spec.in)])
+
        AC_SUBST(HAVE_RPM)
        AC_SUBST(RPM)
        AC_SUBST(RPM_VERSION)
@@ -263,6 +291,16 @@ AC_DEFUN([SPL_AC_RPM], [
        AC_SUBST(HAVE_RPMBUILD)
        AC_SUBST(RPMBUILD)
        AC_SUBST(RPMBUILD_VERSION)
+
+       AC_SUBST(RPM_SPEC_DIR)
+       AC_SUBST(RPM_DEFINE_UTIL)
+       AC_SUBST(RPM_DEFINE_KMOD)
+       AC_SUBST(RPM_DEFINE_DKMS)
+       AC_SUBST(RPM_DEFINE_COMMON)
+       AC_SUBST(SRPM_DEFINE_UTIL)
+       AC_SUBST(SRPM_DEFINE_KMOD)
+       AC_SUBST(SRPM_DEFINE_DKMS)
+       AC_SUBST(SRPM_DEFINE_COMMON)
 ])
 
 dnl #
@@ -847,37 +885,18 @@ AC_DEFUN([SPL_AC_2ARGS_REGISTER_SYSCTL],
        ])
 ])
 
-dnl #
-dnl # 2.6.23 API change
-dnl # Old set_shrinker API replaced with register_shrinker
-dnl #
-AC_DEFUN([SPL_AC_SET_SHRINKER], [
-       AC_MSG_CHECKING([whether set_shrinker() available])
-       SPL_LINUX_TRY_COMPILE([
-               #include <linux/mm.h>
-       ],[
-               return set_shrinker(DEFAULT_SEEKS, NULL);
-       ],[
-               AC_MSG_RESULT([yes])
-               AC_DEFINE(HAVE_SET_SHRINKER, 1,
-                         [set_shrinker() available])
-       ],[
-               AC_MSG_RESULT([no])
-       ])
-])
-
-dnl #
-dnl # 2.6.35 API change,
-dnl # Add context to shrinker callback
-dnl #
-AC_DEFUN([SPL_AC_3ARGS_SHRINKER_CALLBACK],
-       [AC_MSG_CHECKING([whether shrinker callback wants 3 args])
+AC_DEFUN([SPL_AC_SHRINKER_CALLBACK],[
        tmp_flags="$EXTRA_KCFLAGS"
        EXTRA_KCFLAGS="-Werror"
+       dnl #
+       dnl # 2.6.23 to 2.6.34 API change
+       dnl # ->shrink(int nr_to_scan, gfp_t gfp_mask)
+       dnl #
+       AC_MSG_CHECKING([whether old 2-argument shrinker exists])
        SPL_LINUX_TRY_COMPILE([
                #include <linux/mm.h>
 
-               int shrinker_cb(struct shrinker *, int, unsigned int);
+               int shrinker_cb(int nr_to_scan, gfp_t gfp_mask);
        ],[
                struct shrinker cache_shrinker = {
                        .shrink = shrinker_cb,
@@ -886,10 +905,86 @@ AC_DEFUN([SPL_AC_3ARGS_SHRINKER_CALLBACK],
                register_shrinker(&cache_shrinker);
        ],[
                AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_3ARGS_SHRINKER_CALLBACK, 1,
-                         [shrinker callback wants 3 args])
+               AC_DEFINE(HAVE_2ARGS_OLD_SHRINKER_CALLBACK, 1,
+                       [old shrinker callback wants 2 args])
        ],[
                AC_MSG_RESULT(no)
+               dnl #
+               dnl # 2.6.35 - 2.6.39 API change
+               dnl # ->shrink(struct shrinker *,
+               dnl #          int nr_to_scan, gfp_t gfp_mask)
+               dnl #
+               AC_MSG_CHECKING([whether old 3-argument shrinker exists])
+               SPL_LINUX_TRY_COMPILE([
+                       #include <linux/mm.h>
+
+                       int shrinker_cb(struct shrinker *, int nr_to_scan,
+                                       gfp_t gfp_mask);
+               ],[
+                       struct shrinker cache_shrinker = {
+                               .shrink = shrinker_cb,
+                               .seeks = DEFAULT_SEEKS,
+                       };
+                       register_shrinker(&cache_shrinker);
+               ],[
+                       AC_MSG_RESULT(yes)
+                       AC_DEFINE(HAVE_3ARGS_SHRINKER_CALLBACK, 1,
+                               [old shrinker callback wants 3 args])
+               ],[
+                       AC_MSG_RESULT(no)
+                       dnl #
+                       dnl # 3.0 - 3.11 API change
+                       dnl # ->shrink(struct shrinker *,
+                       dnl #          struct shrink_control *sc)
+                       dnl #
+                       AC_MSG_CHECKING(
+                               [whether new 2-argument shrinker exists])
+                       SPL_LINUX_TRY_COMPILE([
+                               #include <linux/mm.h>
+
+                               int shrinker_cb(struct shrinker *,
+                                               struct shrink_control *sc);
+                       ],[
+                               struct shrinker cache_shrinker = {
+                                       .shrink = shrinker_cb,
+                                       .seeks = DEFAULT_SEEKS,
+                               };
+                               register_shrinker(&cache_shrinker);
+                       ],[
+                               AC_MSG_RESULT(yes)
+                               AC_DEFINE(HAVE_2ARGS_NEW_SHRINKER_CALLBACK, 1,
+                                       [new shrinker callback wants 2 args])
+                       ],[
+                               AC_MSG_RESULT(no)
+                               dnl #
+                               dnl # 3.12 API change,
+                               dnl # ->shrink() is logically split in to
+                               dnl # ->count_objects() and ->scan_objects()
+                               dnl #
+                               AC_MSG_CHECKING(
+                                   [whether ->count_objects callback exists])
+                               SPL_LINUX_TRY_COMPILE([
+                                       #include <linux/mm.h>
+
+                                       unsigned long shrinker_cb(
+                                               struct shrinker *,
+                                               struct shrink_control *sc);
+                               ],[
+                                       struct shrinker cache_shrinker = {
+                                               .count_objects = shrinker_cb,
+                                               .scan_objects = shrinker_cb,
+                                               .seeks = DEFAULT_SEEKS,
+                                       };
+                                       register_shrinker(&cache_shrinker);
+                               ],[
+                                       AC_MSG_RESULT(yes)
+                                       AC_DEFINE(HAVE_SPLIT_SHRINKER_CALLBACK,
+                                               1, [->count_objects exists])
+                               ],[
+                                       AC_MSG_ERROR(error)
+                               ])
+                       ])
+               ])
        ])
        EXTRA_KCFLAGS="$tmp_flags"
 ])
@@ -1323,6 +1418,43 @@ AC_DEFUN([SPL_AC_GET_VMALLOC_INFO],
        ])
 ])
 
+dnl #
+dnl # 3.10 API change,
+dnl # struct vmalloc_info is now declared in linux/vmalloc.h
+dnl #
+AC_DEFUN([SPL_AC_VMALLOC_INFO], [
+       AC_MSG_CHECKING([whether struct vmalloc_info is declared])
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/vmalloc.h>
+               struct vmalloc_info { void *a; };
+       ],[
+               return 0;
+       ],[
+               AC_MSG_RESULT(no)
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_VMALLOC_INFO, 1, [yes])
+       ])
+])
+
+dnl #
+dnl # 3.10 API change,
+dnl # PDE is replaced by PDE_DATA
+dnl #
+AC_DEFUN([SPL_AC_PDE_DATA], [
+       AC_MSG_CHECKING([whether PDE_DATA() is available])
+       SPL_LINUX_TRY_COMPILE_SYMBOL([
+               #include <linux/proc_fs.h>
+       ], [
+               PDE_DATA(NULL);
+       ], [PDE_DATA], [], [
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_PDE_DATA, 1, [yes])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
 dnl #
 dnl # 2.6.17 API change
 dnl # The helper functions first_online_pgdat(), next_online_pgdat(), and
@@ -1672,60 +1804,133 @@ AC_DEFUN([SPL_AC_SET_FS_PWD],
 ])
 
 dnl #
-dnl # 2.6.25 API change,
-dnl # Simplied API by replacing mnt+dentry args with a single path arg.
+dnl # 3.9 API change
+dnl # set_fs_pwd takes const struct path *
 dnl #
-AC_DEFUN([SPL_AC_2ARGS_SET_FS_PWD],
-       [AC_MSG_CHECKING([whether set_fs_pwd() wants 2 args])
+AC_DEFUN([SPL_AC_SET_FS_PWD_WITH_CONST],
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Werror"
+       [AC_MSG_CHECKING([whether set_fs_pwd() requires const struct path *])
        SPL_LINUX_TRY_COMPILE([
-               #include <linux/sched.h>
+               #include <linux/spinlock.h>
                #include <linux/fs_struct.h>
+               #include <linux/path.h>
+               void (*const set_fs_pwd_func)
+                       (struct fs_struct *, const struct path *)
+                       = set_fs_pwd;
        ],[
-               set_fs_pwd(NULL, NULL);
+               return 0;
        ],[
                AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_2ARGS_SET_FS_PWD, 1,
-                         [set_fs_pwd() wants 2 args])
+               AC_DEFINE(HAVE_SET_FS_PWD_WITH_CONST, 1,
+                       [set_fs_pwd() needs const path *])
        ],[
-               AC_MSG_RESULT(no)
+               SPL_LINUX_TRY_COMPILE([
+                       #include <linux/spinlock.h>
+                       #include <linux/fs_struct.h>
+                       #include <linux/path.h>
+                       void (*const set_fs_pwd_func)
+                               (struct fs_struct *, struct path *)
+                               = set_fs_pwd;
+               ],[
+                       return 0;
+               ],[
+                       AC_MSG_RESULT(no)
+               ],[
+                       AC_MSG_ERROR(unknown)
+               ])
        ])
+       EXTRA_KCFLAGS="$tmp_flags"
 ])
 
-dnl #
-dnl # SLES API change, never adopted in mainline,
-dnl # Third 'struct vfsmount *' argument removed.
-dnl #
 AC_DEFUN([SPL_AC_2ARGS_VFS_UNLINK],
        [AC_MSG_CHECKING([whether vfs_unlink() wants 2 args])
        SPL_LINUX_TRY_COMPILE([
                #include <linux/fs.h>
        ],[
-               vfs_unlink(NULL, NULL);
+               vfs_unlink((struct inode *) NULL, (struct dentry *) NULL);
        ],[
                AC_MSG_RESULT(yes)
                AC_DEFINE(HAVE_2ARGS_VFS_UNLINK, 1,
                          [vfs_unlink() wants 2 args])
        ],[
                AC_MSG_RESULT(no)
+               dnl #
+               dnl # Linux 3.13 API change
+               dnl # Added delegated inode
+               dnl #
+               AC_MSG_CHECKING([whether vfs_unlink() wants 3 args])
+               SPL_LINUX_TRY_COMPILE([
+                       #include <linux/fs.h>
+               ],[
+                       vfs_unlink((struct inode *) NULL,
+                               (struct dentry *) NULL,
+                               (struct inode **) NULL);
+               ],[
+                       AC_MSG_RESULT(yes)
+                       AC_DEFINE(HAVE_3ARGS_VFS_UNLINK, 1,
+                                 [vfs_unlink() wants 3 args])
+               ],[
+                       AC_MSG_ERROR(no)
+               ])
+
        ])
 ])
 
-dnl #
-dnl # SLES API change, never adopted in mainline,
-dnl # Third and sixth 'struct vfsmount *' argument removed.
-dnl #
 AC_DEFUN([SPL_AC_4ARGS_VFS_RENAME],
        [AC_MSG_CHECKING([whether vfs_rename() wants 4 args])
        SPL_LINUX_TRY_COMPILE([
                #include <linux/fs.h>
        ],[
-               vfs_rename(NULL, NULL, NULL, NULL);
+               vfs_rename((struct inode *) NULL, (struct dentry *) NULL,
+                       (struct inode *) NULL, (struct dentry *) NULL);
        ],[
                AC_MSG_RESULT(yes)
                AC_DEFINE(HAVE_4ARGS_VFS_RENAME, 1,
                          [vfs_rename() wants 4 args])
        ],[
                AC_MSG_RESULT(no)
+               dnl #
+               dnl # Linux 3.13 API change
+               dnl # Added delegated inode
+               dnl #
+               AC_MSG_CHECKING([whether vfs_rename() wants 5 args])
+               SPL_LINUX_TRY_COMPILE([
+                       #include <linux/fs.h>
+               ],[
+                       vfs_rename((struct inode *) NULL,
+                               (struct dentry *) NULL,
+                               (struct inode *) NULL,
+                               (struct dentry *) NULL,
+                               (struct inode **) NULL);
+               ],[
+                       AC_MSG_RESULT(yes)
+                       AC_DEFINE(HAVE_5ARGS_VFS_RENAME, 1,
+                                 [vfs_rename() wants 5 args])
+               ],[
+                       AC_MSG_RESULT(no)
+                       dnl #
+                       dnl # Linux 3.15 API change
+                       dnl # Added flags
+                       dnl #
+                       AC_MSG_CHECKING([whether vfs_rename() wants 6 args])
+                       SPL_LINUX_TRY_COMPILE([
+                               #include <linux/fs.h>
+                       ],[
+                               vfs_rename((struct inode *) NULL,
+                                       (struct dentry *) NULL,
+                                       (struct inode *) NULL,
+                                       (struct dentry *) NULL,
+                                       (struct inode **) NULL,
+                                       (unsigned int) 0);
+                       ],[
+                               AC_MSG_RESULT(yes)
+                               AC_DEFINE(HAVE_6ARGS_VFS_RENAME, 1,
+                                         [vfs_rename() wants 6 args])
+                       ],[
+                               AC_MSG_ERROR(no)
+                       ])
+               ])
        ])
 ])
 
@@ -1773,6 +1978,36 @@ AC_DEFUN([SPL_AC_CRED_STRUCT], [
        ])
 ])
 
+
+dnl #
+dnl # User namespaces, use kuid_t in place of uid_t
+dnl # where available. Not strictly a user namespaces thing
+dnl # but it should prevent surprises
+dnl #
+AC_DEFUN([SPL_AC_KUIDGID_T], [
+       AC_MSG_CHECKING([whether kuid_t/kgid_t is available])
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/uidgid.h>
+       ], [
+               kuid_t userid = KUIDT_INIT(0);
+               kgid_t groupid = KGIDT_INIT(0);
+       ],[
+               SPL_LINUX_TRY_COMPILE([
+                       #include <linux/uidgid.h>
+               ], [
+                       kuid_t userid = 0;
+                       kgid_t groupid = 0;
+               ],[
+                       AC_MSG_RESULT(yes; optional)
+               ],[
+                       AC_MSG_RESULT(yes; mandatory)
+                       AC_DEFINE(HAVE_KUIDGID_T, 1, [kuid_t/kgid_t in use])
+               ])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
 dnl #
 dnl # Custom SPL patch may export this symbol.
 dnl #
@@ -1780,8 +2015,15 @@ AC_DEFUN([SPL_AC_GROUPS_SEARCH],
        [AC_MSG_CHECKING([whether groups_search() is available])
        SPL_LINUX_TRY_COMPILE_SYMBOL([
                #include <linux/cred.h>
+               #ifdef HAVE_KUIDGID_T
+               #include <linux/uidgid.h>
+               #endif
        ], [
+               #ifdef HAVE_KUIDGID_T
+               groups_search(NULL, KGIDT_INIT(0));
+               #else
                groups_search(NULL, 0);
+               #endif
        ], [groups_search], [], [
                AC_MSG_RESULT(yes)
                AC_DEFINE(HAVE_GROUPS_SEARCH, 1, [groups_search() is available])
@@ -2269,3 +2511,62 @@ AC_DEFUN([SPL_AC_2ARGS_VFS_GETATTR], [
                ])
        ])
 ])
+
+dnl #
+dnl # 2.6.36 API compatibility.
+dnl # Added usleep_range timer.
+dnl # usleep_range is a finer precision implementation of msleep
+dnl # designed to be a drop-in replacement for udelay where a precise
+dnl # sleep / busy-wait is unnecessary.
+dnl #
+AC_DEFUN([SPL_AC_USLEEP_RANGE], [
+       AC_MSG_CHECKING([whether usleep_range() is available])
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/delay.h>
+       ],[
+               usleep_range(0, 0);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_USLEEP_RANGE, 1,
+                         [usleep_range is available])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
+dnl #
+dnl # 2.6.35 API change,
+dnl # The cachep->gfpflags member was renamed cachep->allocflags.  These are
+dnl # private allocation flags which are applied when allocating a new slab
+dnl # in kmem_getpages().  Unfortunately there is no public API for setting
+dnl # non-default flags.
+dnl #
+AC_DEFUN([SPL_AC_KMEM_CACHE_ALLOCFLAGS], [
+       AC_MSG_CHECKING([whether struct kmem_cache has allocflags])
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/slab.h>
+       ],[
+               struct kmem_cache cachep __attribute__ ((unused));
+               cachep.allocflags = GFP_KERNEL;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_KMEM_CACHE_ALLOCFLAGS, 1,
+                       [struct kmem_cache has allocflags])
+       ],[
+               AC_MSG_RESULT(no)
+
+               AC_MSG_CHECKING([whether struct kmem_cache has gfpflags])
+               SPL_LINUX_TRY_COMPILE([
+                       #include <linux/slab.h>
+               ],[
+                       struct kmem_cache cachep __attribute__ ((unused));
+                       cachep.gfpflags = GFP_KERNEL;
+               ],[
+                       AC_MSG_RESULT(yes)
+                       AC_DEFINE(HAVE_KMEM_CACHE_GFPFLAGS, 1,
+                               [struct kmem_cache has gfpflags])
+               ],[
+                       AC_MSG_RESULT(no)
+               ])
+       ])
+])