summaryrefslogtreecommitdiff
path: root/fs/cifs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs/file.c')
-rw-r--r--fs/cifs/file.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 22dfc1f8b4f1..162fab5a4583 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -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;
}
@@ -2649,14 +2675,14 @@ wdata_send_pages(struct cifs_writedata *wdata, unsigned int nr_pages,
static int
cifs_writepage_locked(struct page *page, struct writeback_control *wbc);
-static int cifs_write_one_page(struct page *page, struct writeback_control *wbc,
- void *data)
+static int cifs_write_one_page(struct folio *folio,
+ struct writeback_control *wbc, void *data)
{
struct address_space *mapping = data;
int ret;
- ret = cifs_writepage_locked(page, wbc);
- unlock_page(page);
+ ret = cifs_writepage_locked(&folio->page, wbc);
+ folio_unlock(folio);
mapping_set_error(mapping, ret);
return ret;
}