Commit 4cda80f3 authored by Vishal Moola (Oracle)'s avatar Vishal Moola (Oracle) Committed by Andrew Morton

cifs: convert wdata_alloc_and_fillpages() to use filemap_get_folios_tag()

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.

Link: https://lkml.kernel.org/r/20230104211448.4804-10-vishal.moola@gmail.comSigned-off-by: default avatarVishal Moola (Oracle) <vishal.moola@gmail.com>
Acked-by: default avatarPaulo Alcantara (SUSE) <pc@cjr.nz>
Cc: Tom Talpey <tom@talpey.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 590a2b5f
......@@ -2527,14 +2527,40 @@ 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);
folio_get(folio);
if (++*found_pages == tofind) {
folio_batch_release(&fbatch);
goto out;
}
if (++idx < p)
goto add_more;
}
folio_batch_release(&fbatch);
goto again;
out:
return wdata;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment