Skip to content

Commit 18f9c2f

Browse files
hwenwurZephyrcf
authored andcommitted
kernel-patches: adapt fscache ondemand IO patch for newer kernels
find_get_pages_contig() was removed in newer kernels. Add a follow-up patch converting cachefiles_page_copy() to use filemap_get_folios_contig() instead, so the ondemand IO optimization still builds on 6.1 and later kernels. Signed-off-by: Wenwu Hou <hwenwur@gmail.com>
1 parent e89f889 commit 18f9c2f

1 file changed

Lines changed: 98 additions & 0 deletions

File tree

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
From 8cded62556a98153a07dacc34198c4e5553e1a12 Mon Sep 17 00:00:00 2001
2+
From: Wenwu Hou <hwenwur@gmail.com>
3+
Date: Tue, 7 Jul 2026 17:31:27 +0800
4+
Subject: [PATCH 2/2] cachefiles: convert cachefiles_page_copy() to use
5+
filemap_get_folios_contig()
6+
7+
find_get_pages_contig() was removed in commit 48658d8509d2 ("filemap:
8+
remove find_get_pages_contig()"). Replace it with
9+
filemap_get_folios_contig().
10+
11+
No functional change intended.
12+
13+
Signed-off-by: Wenwu Hou <hwenwur@gmail.com>
14+
---
15+
fs/cachefiles/io.c | 36 ++++++++++++++++++------------------
16+
1 file changed, 18 insertions(+), 18 deletions(-)
17+
18+
diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c
19+
index 1e4db487a517..7e7439117a3e 100644
20+
--- a/fs/cachefiles/io.c
21+
+++ b/fs/cachefiles/io.c
22+
@@ -71,44 +71,46 @@ static void cachefiles_read_complete(struct kiocb *iocb, long ret)
23+
24+
static void cachefiles_page_copy(struct cachefiles_kiocb *ki, struct iov_iter *iter)
25+
{
26+
- struct address_space *mapping = ki->iocb.ki_filp->f_mapping;
27+
+ struct address_space *mapping = ki->iocb.ki_filp->f_mapping;
28+
struct kiocb *iocb = &ki->iocb;
29+
loff_t isize = i_size_read(mapping->host);
30+
loff_t end = min_t(loff_t, isize, iocb->ki_pos + iov_iter_count(iter));
31+
- struct pagevec pv;
32+
+ struct folio_batch fbatch;
33+
pgoff_t index;
34+
unsigned int i;
35+
bool writably_mapped;
36+
int error = 0;
37+
38+
+ folio_batch_init(&fbatch);
39+
+
40+
while (iocb->ki_pos < end && !error) {
41+
index = iocb->ki_pos >> PAGE_SHIFT;
42+
- pv.nr = find_get_pages_contig(mapping, index, PAGEVEC_SIZE, pv.pages);
43+
-
44+
- if (pv.nr == 0)
45+
+ if (!filemap_get_folios_contig(mapping, &index,
46+
+ (end - 1) >> PAGE_SHIFT, &fbatch))
47+
break;
48+
49+
writably_mapped = mapping_writably_mapped(mapping);
50+
51+
- for (i = 0; i < pv.nr; i++) {
52+
- struct page *page = pv.pages[i];
53+
- unsigned int offset = iocb->ki_pos & ~PAGE_MASK;
54+
- unsigned int bytes = min_t(loff_t, end - iocb->ki_pos,
55+
- PAGE_SIZE - offset);
56+
- unsigned int copied;
57+
+ for (i = 0; i < folio_batch_count(&fbatch); i++) {
58+
+ struct folio *folio = fbatch.folios[i];
59+
+ size_t fsize = folio_size(folio);
60+
+ size_t offset = iocb->ki_pos & (fsize - 1);
61+
+ size_t bytes = min_t(loff_t, end - iocb->ki_pos,
62+
+ fsize - offset);
63+
+ size_t copied;
64+
65+
- if (page->index * PAGE_SIZE >= end)
66+
+ if (end < folio_pos(folio))
67+
break;
68+
69+
- if (!PageUptodate(page)) {
70+
+ if (!folio_test_uptodate(folio)) {
71+
error = -EFAULT;
72+
break;
73+
}
74+
75+
if (writably_mapped)
76+
- flush_dcache_page(page);
77+
+ flush_dcache_folio(folio);
78+
79+
- copied = copy_page_to_iter(page, offset, bytes, iter);
80+
+ copied = copy_folio_to_iter(folio, offset, bytes, iter);
81+
82+
iocb->ki_pos += copied;
83+
if (copied < bytes) {
84+
@@ -117,10 +119,8 @@ static void cachefiles_page_copy(struct cachefiles_kiocb *ki, struct iov_iter *i
85+
}
86+
}
87+
88+
- for (i = 0; i < pv.nr; i++)
89+
- put_page(pv.pages[i]);
90+
+ folio_batch_release(&fbatch);
91+
}
92+
-
93+
}
94+
95+
/*
96+
--
97+
2.43.0
98+

0 commit comments

Comments
 (0)