]> granicus.if.org Git - zfs/commitdiff
Add compatibility layer for {kmap,kunmap}_atomic
authorChunwei Chen <tuxoko@gmail.com>
Mon, 11 May 2015 14:22:56 +0000 (22:22 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 24 Aug 2015 17:13:25 +0000 (10:13 -0700)
Starting from linux-2.6.37, {kmap,kunmap}_atomic takes 1 argument instead of 2.
We use zfs_{kmap,kunmap}_atomic as wrappers and always take 2 argument, but
ignore the 2nd for newer kernel.

Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
config/kernel-kmap-atomic-args.m4 [new file with mode: 0644]
config/kernel.m4
include/linux/Makefile.am
include/linux/kmap_compat.h [new file with mode: 0644]

diff --git a/config/kernel-kmap-atomic-args.m4 b/config/kernel-kmap-atomic-args.m4
new file mode 100644 (file)
index 0000000..beb1692
--- /dev/null
@@ -0,0 +1,20 @@
+dnl #
+dnl # 2.6.37 API change
+dnl # kmap_atomic changed from assigning hard-coded named slot to using
+dnl # push/pop based dynamical allocation.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_KMAP_ATOMIC_ARGS], [
+       AC_MSG_CHECKING([whether kmap_atomic wants 1 args])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/pagemap.h>
+       ],[
+               struct page page;
+               kmap_atomic(&page);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_1ARG_KMAP_ATOMIC, 1,
+                         [kmap_atomic wants 1 args])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index 8e8922ec7b887b68ff05a9ac1f4370e200b59bf8..380ca973f23f35546f9f821d451a7422212d9836 100644 (file)
@@ -100,6 +100,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_LSEEK_EXECUTE
        ZFS_AC_KERNEL_VFS_ITERATE
        ZFS_AC_KERNEL_VFS_RW_ITERATE
+       ZFS_AC_KERNEL_KMAP_ATOMIC_ARGS
 
        AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
                KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
index d00b1c8ad798c23b2642ce88be62555ccfb3bec7..595d1db01128d4176f8c2eb3869a66688e90b074 100644 (file)
@@ -5,7 +5,8 @@ KERNEL_H = \
        $(top_srcdir)/include/linux/xattr_compat.h \
        $(top_srcdir)/include/linux/vfs_compat.h \
        $(top_srcdir)/include/linux/blkdev_compat.h \
-       $(top_srcdir)/include/linux/utsname_compat.h
+       $(top_srcdir)/include/linux/utsname_compat.h \
+       $(top_srcdir)/include/linux/kmap_compat.h
 
 USER_H =
 
diff --git a/include/linux/kmap_compat.h b/include/linux/kmap_compat.h
new file mode 100644 (file)
index 0000000..59ae566
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2015 by Chunwei Chen. All rights reserved.
+ */
+
+#ifndef _ZFS_KMAP_H
+#define        _ZFS_KMAP_H
+
+#include <linux/highmem.h>
+
+#ifdef HAVE_1ARG_KMAP_ATOMIC
+/* 2.6.37 API change */
+#define        zfs_kmap_atomic(page, km_type)          kmap_atomic(page)
+#define        zfs_kunmap_atomic(addr, km_type)        kunmap_atomic(addr)
+#else
+#define        zfs_kmap_atomic(page, km_type)          kmap_atomic(page, km_type)
+#define        zfs_kunmap_atomic(addr, km_type)        kunmap_atomic(addr, km_type)
+#endif
+
+#endif /* _ZFS_KMAP_H */