File e5435c9.diff of Package openafs
From e5435c917b50c2756ce89998c990f981e1560da0 Mon Sep 17 00:00:00 2001
From: Cheyenne Wills <cwills@sinenomine.net>
Date: Sun, 01 Jun 2025 07:22:08 -0600
Subject: [PATCH] Linux: Use folio_wait_locked()
The Linux 6.15 commit:
mm: Remove wait_on_page_locked() (d96e2802a802)
removed the compatibility wrapper wait_on_page_locked(). The
replacement is folio_wait_locked().
The Linux 5.16 commits:
mm/filemap: Add folio_wait_locked() (6baa8d602e84d)
mm: Add folio_put() (b620f63358cd3)
added folio_wait_locked, updated wait_on_page_locked to be just a
wrapper for folio_wait_locked(), and added folio_put().
Introduce wrapper functions afs_page_wait_locked() and afs_put_page().
If folio_wait_locked() is available, these 2 wrappers will take a page
and and use the associated folio interface, otherwise use the older
page related interfaces.
Since they were added in the same Linux version, assume that folio_put()
is available if folio_wait_locked() is available, to avoid an extra
configure test.
Reviewed-on: https://gerrit.openafs.org/16375
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
(cherry picked from commit aadc02227fdd3728404c8763ae4842dee88a6668)
Change-Id: I2c1e494b885614dd8ca5177fe4b61f8a725cb1ba
---
diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
index 6eb6d7d..59ad337 100644
--- a/src/afs/LINUX/osi_compat.h
+++ b/src/afs/LINUX/osi_compat.h
@@ -835,4 +835,23 @@
#endif /* D_ALIAS_IS_HLIST */
+static inline void
+afs_page_wait_locked(struct page *p)
+{
+#if defined(HAVE_LINUX_FOLIO_WAIT_LOCKED)
+ return folio_wait_locked(page_folio(p));
+#else
+ return wait_on_page_locked(p);
+#endif
+}
+static inline void
+afs_put_page(struct page *p)
+{
+#if defined(HAVE_LINUX_FOLIO_WAIT_LOCKED)
+ return folio_put(page_folio(p));
+#else
+ return put_page(p);
+#endif
+}
+
#endif /* AFS_LINUX_OSI_COMPAT_H */
diff --git a/src/afs/LINUX/osi_pagecopy.c b/src/afs/LINUX/osi_pagecopy.c
index 061d8c6..131b041 100644
--- a/src/afs/LINUX/osi_pagecopy.c
+++ b/src/afs/LINUX/osi_pagecopy.c
@@ -228,8 +228,8 @@
for (;;) {
sleeppage = afs_pagecopy_checkworkload();
if (sleeppage) {
- wait_on_page_locked(sleeppage);
- put_page(sleeppage);
+ afs_page_wait_locked(sleeppage);
+ afs_put_page(sleeppage);
} else {
break;
}
diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
index 7c6f735..2438809 100644
--- a/src/afs/LINUX/osi_vnodeops.c
+++ b/src/afs/LINUX/osi_vnodeops.c
@@ -2441,7 +2441,7 @@
* even when an error is returned. */
code = mapping_read_page(cachemapping, cachepage);
if (!code && !task) {
- wait_on_page_locked(cachepage);
+ afs_page_wait_locked(cachepage);
}
} else {
unlock_page(cachepage);
@@ -2467,8 +2467,9 @@
unlock_page(page);
}
- if (cachepage)
- put_page(cachepage);
+ if (cachepage != NULL) {
+ afs_put_page(cachepage);
+ }
return code;
}
diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4
index bec5cba..9a0d41a 100644
--- a/src/cf/linux-kernel-func.m4
+++ b/src/cf/linux-kernel-func.m4
@@ -329,6 +329,13 @@
[[aops->write_begin(file, mapping, 0, 0, &foliop, fsdata);
aops->write_end(file, mapping, 0, 0, 0, foliop, fsdata);]])
+dnl Linux 5.16 added folio_wait_locked and updated wait_on_page_locked to be
+dnl just a wrapper for folio_wait_locked. Linux 6.15 removed wait_on_paged_locked
+AC_CHECK_LINUX_FUNC([folio_wait_locked],
+ [[#include <linux/pagemap.h>
+ #include <linux/fs.h>]],
+ [[folio_wait_locked(NULL);]])
+
dnl Consequences - things which get set as a result of the
dnl above tests
AS_IF([test "x$ac_cv_linux_func_d_alloc_anon" = "xno"],