ntfs3: Convert attr_make_nonresident to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 22 Apr 2024 19:31:56 +0000 (20:31 +0100)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Wed, 26 Jun 2024 12:48:56 +0000 (15:48 +0300)
Fetch a folio from the page cache instead of a page and operate on it.

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

index 1292fc84f092bdc8316973c70376f6e5c1b2c090..3a4b81bbc5d98f78601b20627951ec5bdc1a7091 100644 (file)
@@ -288,22 +288,21 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
                        if (err)
                                goto out2;
                } else if (!page) {
-                       char *kaddr;
-
-                       page = grab_cache_page(ni->vfs_inode.i_mapping, 0);
-                       if (!page) {
-                               err = -ENOMEM;
+                       struct address_space *mapping = ni->vfs_inode.i_mapping;
+                       struct folio *folio;
+
+                       folio = __filemap_get_folio(mapping, 0,
+                                       FGP_LOCK | FGP_ACCESSED | FGP_CREAT,
+                                       mapping_gfp_mask(mapping));
+                       if (IS_ERR(folio)) {
+                               err = PTR_ERR(folio);
                                goto out2;
                        }
-                       kaddr = kmap_atomic(page);
-                       memcpy(kaddr, data, rsize);
-                       memset(kaddr + rsize, 0, PAGE_SIZE - rsize);
-                       kunmap_atomic(kaddr);
-                       flush_dcache_page(page);
-                       SetPageUptodate(page);
-                       set_page_dirty(page);
-                       unlock_page(page);
-                       put_page(page);
+                       folio_fill_tail(folio, 0, data, rsize);
+                       folio_mark_uptodate(folio);
+                       folio_mark_dirty(folio);
+                       folio_unlock(folio);
+                       folio_put(folio);
                }
        }