Convert function to use folios. This is in preparation for the removal
of find_get_pages_range_tag(). Now also supports the use of large
folios.

Since tofind might be larger than the max number of folios in a
folio_batch (15), we loop through filling in wdata->pages pulling more
batches until we either reach tofind pages or run out of folios.

This function may not return all pages in the last found folio before
tofind pages are reached.

Signed-off-by: Vishal Moola (Oracle) <vishal.mo...@gmail.com>
---
 fs/cifs/file.c | 33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index fa738adc031f..c4da53b57369 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2517,14 +2517,41 @@ wdata_alloc_and_fillpages(pgoff_t tofind, struct 
address_space *mapping,
                          unsigned int *found_pages)
 {
        struct cifs_writedata *wdata;
-
+       struct folio_batch fbatch;
+       unsigned int i, idx, p, nr;
        wdata = cifs_writedata_alloc((unsigned int)tofind,
                                     cifs_writev_complete);
        if (!wdata)
                return NULL;
 
-       *found_pages = find_get_pages_range_tag(mapping, index, end,
-                               PAGECACHE_TAG_DIRTY, tofind, wdata->pages);
+       folio_batch_init(&fbatch);
+       *found_pages = 0;
+
+again:
+       nr = filemap_get_folios_tag(mapping, index, end,
+                               PAGECACHE_TAG_DIRTY, &fbatch);
+       if (!nr)
+               goto out; /* No dirty pages left in the range */
+
+       for (i = 0; i < nr; i++) {
+               struct folio *folio = fbatch.folios[i];
+
+               idx = 0;
+               p = folio_nr_pages(folio);
+add_more:
+               wdata->pages[*found_pages] = folio_page(folio, idx);
+               if (++*found_pages == tofind) {
+                       folio_batch_release(&fbatch);
+                       goto out;
+               }
+               if (++idx < p) {
+                       folio_ref_inc(folio);
+                       goto add_more;
+               }
+       }
+       folio_batch_release(&fbatch);
+       goto again;
+out:
        return wdata;
 }
 
-- 
2.36.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to