]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
migrate: Remove call to ->writepage
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 7 Mar 2025 04:38:29 +0000 (23:38 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 17 Mar 2025 22:19:56 +0000 (18:19 -0400)
The writepage callback is going away; filesystems must implement
migrate_folio or else dirty folios will not be migratable.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
mm/migrate.c

index f3ee6d8d5e2eaab4313403aea3e68ddb1736fb63..b29372339bcac825edfc181875a7b5704f6cb0f5 100644 (file)
@@ -944,67 +944,18 @@ int filemap_migrate_folio(struct address_space *mapping,
 }
 EXPORT_SYMBOL_GPL(filemap_migrate_folio);
 
-/*
- * Writeback a folio to clean the dirty state
- */
-static int writeout(struct address_space *mapping, struct folio *folio)
-{
-       struct writeback_control wbc = {
-               .sync_mode = WB_SYNC_NONE,
-               .nr_to_write = 1,
-               .range_start = 0,
-               .range_end = LLONG_MAX,
-               .for_reclaim = 1
-       };
-       int rc;
-
-       if (!mapping->a_ops->writepage)
-               /* No write method for the address space */
-               return -EINVAL;
-
-       if (!folio_clear_dirty_for_io(folio))
-               /* Someone else already triggered a write */
-               return -EAGAIN;
-
-       /*
-        * A dirty folio may imply that the underlying filesystem has
-        * the folio on some queue. So the folio must be clean for
-        * migration. Writeout may mean we lose the lock and the
-        * folio state is no longer what we checked for earlier.
-        * At this point we know that the migration attempt cannot
-        * be successful.
-        */
-       remove_migration_ptes(folio, folio, 0);
-
-       rc = mapping->a_ops->writepage(&folio->page, &wbc);
-
-       if (rc != AOP_WRITEPAGE_ACTIVATE)
-               /* unlocked. Relock */
-               folio_lock(folio);
-
-       return (rc < 0) ? -EIO : -EAGAIN;
-}
-
 /*
  * Default handling if a filesystem does not provide a migration function.
  */
 static int fallback_migrate_folio(struct address_space *mapping,
                struct folio *dst, struct folio *src, enum migrate_mode mode)
 {
-       if (folio_test_dirty(src)) {
-               /* Only writeback folios in full synchronous migration */
-               switch (mode) {
-               case MIGRATE_SYNC:
-                       break;
-               default:
-                       return -EBUSY;
-               }
-               return writeout(mapping, src);
-       }
+       if (folio_test_dirty(src))
+               return -EBUSY;
 
        /*
-        * Buffers may be managed in a filesystem specific way.
-        * We must have no buffers or drop them.
+        * Filesystem may have private data at folio->private that we
+        * can't migrate automatically.
         */
        if (!filemap_release_folio(src, GFP_KERNEL))
                return mode == MIGRATE_SYNC ? -EAGAIN : -EBUSY;