summarylogtreecommitdiffstats
path: root/0001-Linux-6.0-Replace-add_to_page_cache.patch
diff options
context:
space:
mode:
Diffstat (limited to '0001-Linux-6.0-Replace-add_to_page_cache.patch')
-rw-r--r--0001-Linux-6.0-Replace-add_to_page_cache.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/0001-Linux-6.0-Replace-add_to_page_cache.patch b/0001-Linux-6.0-Replace-add_to_page_cache.patch
new file mode 100644
index 000000000000..d900953a13e4
--- /dev/null
+++ b/0001-Linux-6.0-Replace-add_to_page_cache.patch
@@ -0,0 +1,130 @@
+From ea74bb05c9a36bcf77698008d340202959be8091 Mon Sep 17 00:00:00 2001
+From: Cheyenne Wills <cwills@sinenomine.net>
+Date: Thu, 22 Sep 2022 13:04:59 -0600
+Subject: [PATCH] Linux-6.0: Replace add_to_page_cache
+
+Linux 6.0 removed the add_to_page_cache function in the Linux commit:
+ 'filemap: Remove add_to_page_cache() and add_to_page_cache_locked()'
+ (2bb876b58d593d7f2522ec0f41f20a74fde76822)
+
+The replacement function, filemap_add_folio function is exported as GPL,
+but a non-GPL wrapper was provided in the Linux 5.15 commit:
+ 'mm/filemap: Add filemap_add_folio()'
+ (9dd3d069406cea073fc633e77bc59abbfde8c6c4)
+which changed the GPL exported function add_to_page_cache_lru to a
+non-GPL exported function.
+
+The function add_to_page_cache_lru functionally combines the
+add_to_page_cache with lru_cache_add. Within afs, all the calls to
+add_to_page_cache follow the pattern of calling the lru_cache_add
+via the wrapper afs_lru_cache_add immediately after (except in one case
+noted below).
+
+Add an autoconf check to see if add_to_page_cache_lru is available.
+
+Introduce a new wrapper function afs_add_to_page_cache_lru that handles
+calling either add_to_page_cache/afs_lru_cache_add or
+add_to_page_cache_lru.
+
+As noted above there is one function, afs_linux_bypass_readpages, that
+calls add_to_page_cache but does not immediately call afs_lru_cache_add.
+This function is only used in Linux kernels prior to 5.18, see the
+commit:
+ 'Linux-5.18: replace readpages with readahead' (7a181415db)
+Since this code path is only built for a Linux kernel level where
+add_to_page_cache should also exists, we do not replace this call.
+
+NOTE:
+The add_to_page_cache_lru was moved into mm/folio-compat.c which has a
+comment indicating that callers of these functions should migrate to
+folio calls. However the replacement folio call that is needed by afs,
+filemap_add_folio, is exported as GPL.
+
+Change-Id: I10087ebeb8b08309e6c1bab4fc43f7e9f50bd105
+---
+ src/afs/LINUX/osi_vnodeops.c | 30 ++++++++++++++++++++++--------
+ src/cf/linux-kernel-func.m4 | 10 ++++++++++
+ 2 files changed, 32 insertions(+), 8 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
+index 621e4da38..bec30bb4c 100644
+--- a/src/afs/LINUX/osi_vnodeops.c
++++ b/src/afs/LINUX/osi_vnodeops.c
+@@ -148,6 +148,23 @@ afs_lru_cache_finalize(struct afs_lru_pages *alrupages)
+ }
+ #endif /* !HAVE_LINUX_LRU_ADD_FILE */
+
++static inline int
++afs_add_to_page_cache_lru(struct afs_lru_pages *alrupages, struct page *page,
++ struct address_space *mapping,
++ pgoff_t index, gfp_t gfp)
++{
++#if defined(HAVE_LINUX_ADD_TO_PAGE_CACHE_LRU)
++ return add_to_page_cache_lru(page, mapping, index, gfp);
++#else
++ int code;
++ code = add_to_page_cache(page, mapping, index, gfp);
++ if (code == 0) {
++ afs_lru_cache_add(alrupages, page);
++ }
++ return code;
++#endif
++}
++
+ /* This function converts a positive error code from AFS into a negative
+ * code suitable for passing into the Linux VFS layer. It checks that the
+ * error code is within the permissable bounds for the ERR_PTR mechanism.
+@@ -2269,12 +2286,11 @@ afs_linux_read_cache(struct file *cachefp, struct page *page,
+ goto out;
+ }
+
+- code = add_to_page_cache(newpage, cachemapping,
+- pageindex, GFP_KERNEL);
++ code = afs_add_to_page_cache_lru(alrupages, newpage, cachemapping,
++ pageindex, GFP_KERNEL);
+ if (code == 0) {
+ cachepage = newpage;
+ newpage = NULL;
+- afs_lru_cache_add(alrupages, cachepage);
+ } else {
+ put_page(newpage);
+ newpage = NULL;
+@@ -3092,11 +3108,9 @@ afs_linux_readpages(struct file *fp, struct address_space *mapping,
+ goto out;
+ }
+
+- if (tdc && !add_to_page_cache(page, mapping, page->index,
+- GFP_KERNEL)) {
+- afs_lru_cache_add(&lrupages, page);
+-
+- /* Note that add_to_page_cache() locked 'page'.
++ if (tdc && !afs_add_to_page_cache_lru(&lrupages, page, mapping, page->index,
++ GFP_KERNEL)) {
++ /* Note that afs_add_to_page_cache_lru() locks the 'page'.
+ * afs_linux_read_cache() is guaranteed to handle unlocking it. */
+ afs_linux_read_cache(cacheFp, page, tdc->f.chunk, &lrupages, task);
+ }
+diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4
+index 27a1d4141..d3abdf9ff 100644
+--- a/src/cf/linux-kernel-func.m4
++++ b/src/cf/linux-kernel-func.m4
+@@ -189,6 +189,16 @@ AC_CHECK_LINUX_FUNC([kthread_complete_and_exit],
+ #include <linux/kthread.h>],
+ [kthread_complete_and_exit(0, 0);])
+
++dnl Linux 6.0 removed add_to_page_cache. It's replacement, filemap_add_folio,
++dnl was added in 5.15 and is GPL-only, but has a NON-GPL wrapper called
++dnl add_to_page_cache_lru.
++dnl Note prior to 5.15, add_to_page_cache_lru was either not exported or
++dnl or exported as GPL-only.
++AC_CHECK_LINUX_FUNC([add_to_page_cache_lru],
++ [#include <linux/kernel.h>
++ #include <linux/pagemap.h>],
++ [add_to_page_cache_lru(NULL, NULL, 0, 0);])
++
+ 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"],
+--
+2.37.3
+