ntfs3: Convert ntfs_get_frame_pages() to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 22 Apr 2024 19:32:00 +0000 (20:32 +0100)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Wed, 26 Jun 2024 12:48:57 +0000 (15:48 +0300)
The function still takes an array of pages, but use a folio internally.
This function would deadlock against itself if used with large folios
(as it locks each page), so we can be a little sloppy with the conversion
back from folio to page for now.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/file.c

index 9ae202901f3c013547e05fe9c740df35fabbea09..35ca0f201cb8e0e0bce06a69300779324803675a 100644 (file)
@@ -821,23 +821,24 @@ static int ntfs_get_frame_pages(struct address_space *mapping, pgoff_t index,
        *frame_uptodate = true;
 
        for (npages = 0; npages < pages_per_frame; npages++, index++) {
-               struct page *page;
+               struct folio *folio;
 
-               page = find_or_create_page(mapping, index, gfp_mask);
-               if (!page) {
+               folio = __filemap_get_folio(mapping, index,
+                               FGP_LOCK | FGP_ACCESSED | FGP_CREAT, gfp_mask);
+               if (IS_ERR(folio)) {
                        while (npages--) {
-                               page = pages[npages];
-                               unlock_page(page);
-                               put_page(page);
+                               folio = page_folio(pages[npages]);
+                               folio_unlock(folio);
+                               folio_put(folio);
                        }
 
                        return -ENOMEM;
                }
 
-               if (!PageUptodate(page))
+               if (!folio_test_uptodate(folio))
                        *frame_uptodate = false;
 
-               pages[npages] = page;
+               pages[npages] = &folio->page;
        }
 
        return 0;