]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 6.3 compat: writepage_t first arg struct folio*
authoryouzhongyang <youzhong@gmail.com>
Wed, 5 Apr 2023 17:01:38 +0000 (13:01 -0400)
committerGitHub <noreply@github.com>
Wed, 5 Apr 2023 17:01:38 +0000 (10:01 -0700)
The type def of writepage_t in kernel 6.3 is changed to take
struct folio* as the first argument. We need to detect this
change and pass correct function to write_cache_pages().

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Signed-off-by: Youzhong Yang <yyang@mathworks.com>
Closes #14699

config/kernel-writepage_t.m4 [new file with mode: 0644]
config/kernel.m4
module/os/linux/zfs/zpl_file.c

diff --git a/config/kernel-writepage_t.m4 b/config/kernel-writepage_t.m4
new file mode 100644 (file)
index 0000000..3a0cffd
--- /dev/null
@@ -0,0 +1,26 @@
+AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITEPAGE_T], [
+       dnl #
+       dnl # 6.3 API change
+       dnl # The writepage_t function type now has its first argument as
+       dnl # struct folio* instead of struct page*
+       dnl #
+       ZFS_LINUX_TEST_SRC([writepage_t_folio], [
+               #include <linux/writeback.h>
+               int putpage(struct folio *folio,
+                   struct writeback_control *wbc, void *data)
+               { return 0; }
+               writepage_t func = putpage;
+       ],[])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_WRITEPAGE_T], [
+       AC_MSG_CHECKING([whether int (*writepage_t)() takes struct folio*])
+       ZFS_LINUX_TEST_RESULT([writepage_t_folio], [
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_WRITEPAGE_T_FOLIO, 1,
+                  [int (*writepage_t)() takes struct folio*])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
index 4c7569841f3377072a334c86ae6dbc1bdb0c75d7..fb07f5004d3cd820e59480297d91c3226776e8cd 100644 (file)
@@ -151,6 +151,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
        ZFS_AC_KERNEL_SRC_IDMAP_MNT_API
        ZFS_AC_KERNEL_SRC_IATTR_VFSID
        ZFS_AC_KERNEL_SRC_FILEMAP
+       ZFS_AC_KERNEL_SRC_WRITEPAGE_T
        case "$host_cpu" in
                powerpc*)
                        ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
@@ -281,6 +282,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
        ZFS_AC_KERNEL_IDMAP_MNT_API
        ZFS_AC_KERNEL_IATTR_VFSID
        ZFS_AC_KERNEL_FILEMAP
+       ZFS_AC_KERNEL_WRITEPAGE_T
        case "$host_cpu" in
                powerpc*)
                        ZFS_AC_KERNEL_CPU_HAS_FEATURE
index 0a50f80ea68d9486147b3deab9468f4521a027a0..ce22e9a9e0e4c7866499d26d80f68d5304990dfe 100644 (file)
@@ -736,6 +736,29 @@ zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data)
        return (0);
 }
 
+#ifdef HAVE_WRITEPAGE_T_FOLIO
+static int
+zpl_putfolio(struct folio *pp, struct writeback_control *wbc, void *data)
+{
+       (void) zpl_putpage(&pp->page, wbc, data);
+       return (0);
+}
+#endif
+
+static inline int
+zpl_write_cache_pages(struct address_space *mapping,
+    struct writeback_control *wbc, void *data)
+{
+       int result;
+
+#ifdef HAVE_WRITEPAGE_T_FOLIO
+       result = write_cache_pages(mapping, wbc, zpl_putfolio, data);
+#else
+       result = write_cache_pages(mapping, wbc, zpl_putpage, data);
+#endif
+       return (result);
+}
+
 static int
 zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
 {
@@ -760,7 +783,7 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
         */
        boolean_t for_sync = (sync_mode == WB_SYNC_ALL);
        wbc->sync_mode = WB_SYNC_NONE;
-       result = write_cache_pages(mapping, wbc, zpl_putpage, &for_sync);
+       result = zpl_write_cache_pages(mapping, wbc, &for_sync);
        if (sync_mode != wbc->sync_mode) {
                if ((result = zpl_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
                        return (result);
@@ -776,8 +799,7 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
                 * details). That being said, this is a no-op in most cases.
                 */
                wbc->sync_mode = sync_mode;
-               result = write_cache_pages(mapping, wbc, zpl_putpage,
-                   &for_sync);
+               result = zpl_write_cache_pages(mapping, wbc, &for_sync);
        }
        return (result);
 }