In that way, pages can be accessed directly with xarray.

Cc: Matthew Wilcox <[email protected]>
Signed-off-by: Gao Xiang <[email protected]>
---
Just an open-coded PoC one, since that is what EROFS actually needs but
without the iteration API (see [PATCH 1/2] as well.)

 fs/erofs/zdata.c | 32 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 054b9839e9db..210b2965ecc4 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -1416,7 +1416,8 @@ static void z_erofs_readahead(struct readahead_control 
*rac)
        bool sync = (sbi->ctx.readahead_sync_decompress &&
                        nr_pages <= sbi->ctx.max_sync_decompress_pages);
        struct z_erofs_decompress_frontend f = DECOMPRESS_FRONTEND_INIT(inode);
-       struct page *page, *head = NULL;
+       struct page *page;
+       pgoff_t index;
        LIST_HEAD(pagepool);
 
        trace_erofs_readpages(inode, readahead_index(rac), nr_pages, false);
@@ -1434,26 +1435,19 @@ static void z_erofs_readahead(struct readahead_control 
*rac)
         *  2) submission chain can be then in the forward order since
         *     pclusters are all inserted at head.
         */
-       while ((page = readahead_page(rac))) {
-               prefetchw(&page->flags);
-
-               /*
-                * A pure asynchronous readahead is indicated if
-                * a PG_readahead marked page is hitted at first.
-                * Let's also do asynchronous decompression for this case.
-                */
-               sync &= !(PageReadahead(page) && !head);
-
-               set_page_private(page, (unsigned long)head);
-               head = page;
-       }
-
-       while (head) {
-               struct page *page = head;
+       index = rac->_index + rac->_nr_pages;
+       while (rac->_nr_pages) {
+               struct page *head;
                int err;
 
-               /* traversal in reverse order */
-               head = (void *)page_private(page);
+               --rac->_nr_pages;
+               page = xa_load(&rac->mapping->i_pages, --index);
+               /* XXX: very incomplete thp support */
+               head = thp_head(page);
+               if (head != page) {
+                       index -= page->index - head->index;
+                       page = head;
+               }
 
                err = z_erofs_do_read_page(&f, page, &pagepool);
                if (err)
-- 
2.20.1

Reply via email to