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"],
openSUSE Build Service is sponsored by