ecryptfs: Convert ecryptfs_writepage() to ecryptfs_writepages()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 25 Oct 2024 19:08:11 +0000 (20:08 +0100)
committerChristian Brauner <brauner@kernel.org>
Tue, 5 Nov 2024 16:19:58 +0000 (17:19 +0100)
By adding a ->migrate_folio implementation, theree is no need to keep
the ->writepage implementation.  The new writepages removes the
unnecessary call to SetPageUptodate(); the folio should already be
uptodate at this point.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Link: https://lore.kernel.org/r/20241025190822.1319162-2-willy@infradead.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/ecryptfs/mmap.c

index ceda555..92ea39d 100644 (file)
@@ -38,32 +38,30 @@ struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index)
        return page;
 }
 
-/**
- * ecryptfs_writepage
- * @page: Page that is locked before this call is made
- * @wbc: Write-back control structure
- *
- * Returns zero on success; non-zero otherwise
- *
+/*
  * This is where we encrypt the data and pass the encrypted data to
  * the lower filesystem.  In OpenPGP-compatible mode, we operate on
  * entire underlying packets.
  */
-static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc)
+static int ecryptfs_writepages(struct address_space *mapping,
+               struct writeback_control *wbc)
 {
-       int rc;
-
-       rc = ecryptfs_encrypt_page(page);
-       if (rc) {
-               ecryptfs_printk(KERN_WARNING, "Error encrypting "
-                               "page (upper index [0x%.16lx])\n", page->index);
-               ClearPageUptodate(page);
-               goto out;
+       struct folio *folio = NULL;
+       int error;
+
+       while ((folio = writeback_iter(mapping, wbc, folio, &error))) {
+               error = ecryptfs_encrypt_page(&folio->page);
+               if (error) {
+                       ecryptfs_printk(KERN_WARNING,
+                               "Error encrypting folio (index [0x%.16lx])\n",
+                               folio->index);
+                       folio_clear_uptodate(folio);
+                       mapping_set_error(mapping, error);
+               }
+               folio_unlock(folio);
        }
-       SetPageUptodate(page);
-out:
-       unlock_page(page);
-       return rc;
+
+       return error;
 }
 
 static void strip_xattr_flag(char *page_virt,
@@ -548,9 +546,10 @@ const struct address_space_operations ecryptfs_aops = {
        .dirty_folio    = block_dirty_folio,
        .invalidate_folio = block_invalidate_folio,
 #endif
-       .writepage = ecryptfs_writepage,
+       .writepages = ecryptfs_writepages,
        .read_folio = ecryptfs_read_folio,
        .write_begin = ecryptfs_write_begin,
        .write_end = ecryptfs_write_end,
+       .migrate_folio = filemap_migrate_folio,
        .bmap = ecryptfs_bmap,
 };