]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 5.18 compat: replace __set_page_dirty_nobuffers
authorSatadru Pramanik <satadru@gmail.com>
Wed, 27 Apr 2022 19:54:17 +0000 (15:54 -0400)
committerGitHub <noreply@github.com>
Wed, 27 Apr 2022 19:54:17 +0000 (12:54 -0700)
Replace __set_page_dirty_nobuffers with filemap_dirty_folio.

Upstream-commit: 6b1f86f8e9c7f9de7ca1cb987b2cf25e99b1ae3a
("Merge tag 'folio-5.18b' of
git://git.infradead.org/users/willy/pagecache ")

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Authored-by: Satadru Pramanik <satadru@gmail.com>
Signed-off-by: Satadru Pramanik <satadru@gmail.com>
Closes #13325
Closes #13380

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

diff --git a/config/kernel-vfs-filemap_dirty_folio.m4 b/config/kernel-vfs-filemap_dirty_folio.m4
new file mode 100644 (file)
index 0000000..8728790
--- /dev/null
@@ -0,0 +1,30 @@
+dnl #
+dnl # Linux 5.18 uses filemap_dirty_folio in lieu of
+dnl # ___set_page_dirty_nobuffers
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO], [
+       ZFS_LINUX_TEST_SRC([vfs_has_filemap_dirty_folio], [
+               #include <linux/pagemap.h>
+               #include <linux/writeback.h>
+
+               static const struct address_space_operations
+                   aops __attribute__ ((unused)) = {
+                       .dirty_folio    = filemap_dirty_folio,
+               };
+       ],[])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO], [
+       dnl #
+       dnl # Linux 5.18 uses filemap_dirty_folio in lieu of
+       dnl # ___set_page_dirty_nobuffers
+       dnl #
+       AC_MSG_CHECKING([filemap_dirty_folio exists])
+       ZFS_LINUX_TEST_RESULT([vfs_has_filemap_dirty_folio], [
+               AC_MSG_RESULT([yes])
+               AC_DEFINE(HAVE_VFS_FILEMAP_DIRTY_FOLIO, 1,
+                       [filemap_dirty_folio exists])
+       ],[
+               AC_MSG_RESULT([no])
+       ])
+])
index 43208940763e8662005db3bad0aebcdac38889dd..a70db91a83644d242af3d27022d40ab6e6df35e8 100644 (file)
@@ -101,6 +101,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
        ZFS_AC_KERNEL_SRC_SET_NLINK
        ZFS_AC_KERNEL_SRC_SGET
        ZFS_AC_KERNEL_SRC_LSEEK_EXECUTE
+       ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO
        ZFS_AC_KERNEL_SRC_VFS_GETATTR
        ZFS_AC_KERNEL_SRC_VFS_FSYNC_2ARGS
        ZFS_AC_KERNEL_SRC_VFS_ITERATE
@@ -217,6 +218,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
        ZFS_AC_KERNEL_SET_NLINK
        ZFS_AC_KERNEL_SGET
        ZFS_AC_KERNEL_LSEEK_EXECUTE
+       ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO
        ZFS_AC_KERNEL_VFS_GETATTR
        ZFS_AC_KERNEL_VFS_FSYNC_2ARGS
        ZFS_AC_KERNEL_VFS_ITERATE
index b65728f0d4c4f8ae7a941bf8e08e118793c68a66..2ba90d889369eaf9ad56e80dd979418d199d377c 100644 (file)
@@ -3556,7 +3556,11 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc)
                        dmu_tx_wait(tx);
 
                dmu_tx_abort(tx);
+#ifdef HAVE_VFS_FILEMAP_DIRTY_FOLIO
+               filemap_dirty_folio(page_mapping(pp), page_folio(pp));
+#else
                __set_page_dirty_nobuffers(pp);
+#endif
                ClearPageError(pp);
                end_page_writeback(pp);
                zfs_rangelock_exit(lr);
index 3307c9c3a2039531502516e1528efe7569cc2444..78cf7e7ef10ed54f3b8606c1955553d94ea105e9 100644 (file)
 #include <sys/zfs_vfsops.h>
 #include <sys/zfs_vnops.h>
 #include <sys/zfs_project.h>
-#ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
+#if defined(HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS) || \
+    defined(HAVE_VFS_FILEMAP_DIRTY_FOLIO)
 #include <linux/pagemap.h>
 #endif
+#ifdef HAVE_VFS_FILEMAP_DIRTY_FOLIO
+#include <linux/writeback.h>
+#endif
 
 /*
  * When using fallocate(2) to preallocate space, inflate the requested
@@ -1166,6 +1170,9 @@ const struct address_space_operations zpl_address_space_operations = {
 #ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
        .set_page_dirty = __set_page_dirty_nobuffers,
 #endif
+#ifdef HAVE_VFS_FILEMAP_DIRTY_FOLIO
+       .dirty_folio    = filemap_dirty_folio,
+#endif
 };
 
 const struct file_operations zpl_file_operations = {