summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColeman Kane <ckane@colemankane.org>2021-11-16 00:10:35 -0500
committerTony Hutter <hutter2@llnl.gov>2021-12-06 12:22:38 -0800
commit12d27e71349bbbfe97686fa1e153e29d3355c926 (patch)
tree1bac5b641d305f1c5b3cc905ee968d217798ad96
parenta1a29bf8fcfc887673e1dd7a2bf9abdb0aa8fc8c (diff)
Linux 5.16: wait_on_page_bit() no longer available to modules
Instead, linux/pagemap.h offers a number of folio-specific functions to be called instead. In this case, module/os/linux/zfs/zfs_vnops_os.c wants to call wait_on_page_bit(pp, PG_writeback). This gets replaced with folio_wait_bit(folio_page(pp), PG_writeback). This change modifies the code to conditionally compile that if configure identifies th presence of the folio_wait_bit() function. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Coleman Kane <ckane@colemankane.org> Closes #12800
-rw-r--r--config/kernel-pagemap-folio_wait_bit.m426
-rw-r--r--config/kernel.m42
-rw-r--r--module/os/linux/zfs/zfs_vnops_os.c4
3 files changed, 32 insertions, 0 deletions
diff --git a/config/kernel-pagemap-folio_wait_bit.m4 b/config/kernel-pagemap-folio_wait_bit.m4
new file mode 100644
index 000000000..e0aaa4a57
--- /dev/null
+++ b/config/kernel-pagemap-folio_wait_bit.m4
@@ -0,0 +1,26 @@
+dnl #
+dnl # Linux 5.16 no longer allows directly calling wait_on_page_bit, and
+dnl # instead requires you to call folio-specific functions. In this case,
+dnl # wait_on_page_bit(pg, PG_writeback) becomes
+dnl # folio_wait_bit(pg, PG_writeback)
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT], [
+ ZFS_LINUX_TEST_SRC([pagemap_has_folio_wait_bit], [
+ #include <linux/pagemap.h>
+ ],[
+ static struct folio *f = NULL;
+
+ folio_wait_bit(f, PG_writeback);
+ ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT], [
+ AC_MSG_CHECKING([folio_wait_bit() exists])
+ ZFS_LINUX_TEST_RESULT([pagemap_has_folio_wait_bit], [
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_PAGEMAP_FOLIO_WAIT_BIT, 1,
+ [folio_wait_bit() exists])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+])
diff --git a/config/kernel.m4 b/config/kernel.m4
index 0b94f3bd9..bdd3caed2 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -134,6 +134,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
+ ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT
AC_MSG_CHECKING([for available kernel interfaces])
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
@@ -241,6 +242,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
ZFS_AC_KERNEL_SET_SPECIAL_STATE
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
+ ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
])
dnl #
diff --git a/module/os/linux/zfs/zfs_vnops_os.c b/module/os/linux/zfs/zfs_vnops_os.c
index ef99c4864..a1a0e44bb 100644
--- a/module/os/linux/zfs/zfs_vnops_os.c
+++ b/module/os/linux/zfs/zfs_vnops_os.c
@@ -3556,7 +3556,11 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc)
if (wbc->sync_mode != WB_SYNC_NONE) {
if (PageWriteback(pp))
+#ifdef HAVE_PAGEMAP_FOLIO_WAIT_BIT
+ folio_wait_bit(page_folio(pp), PG_writeback);
+#else
wait_on_page_bit(pp, PG_writeback);
+#endif
}
ZFS_EXIT(zfsvfs);