]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
mm/migrate: Convert buffer_migrate_page() to buffer_migrate_folio()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 6 Jun 2022 14:20:31 +0000 (10:20 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 2 Aug 2022 16:34:03 +0000 (12:34 -0400)
Use a folio throughout __buffer_migrate_folio(), add kernel-doc for
buffer_migrate_folio() and buffer_migrate_folio_norefs(), move their
declarations to buffer.h and switch all filesystems that have wired
them up.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
block/fops.c
fs/ext2/inode.c
fs/ext4/inode.c
fs/ntfs/aops.c
fs/ocfs2/aops.c
include/linux/buffer_head.h
include/linux/fs.h
mm/migrate.c

index d6b3276a6c68088e470790d0fe767b325c4a4cfd..743fc46d0aad7ce24bac91b921a14744fbab34a5 100644 (file)
@@ -417,7 +417,7 @@ const struct address_space_operations def_blk_aops = {
        .write_end      = blkdev_write_end,
        .writepages     = blkdev_writepages,
        .direct_IO      = blkdev_direct_IO,
-       .migratepage    = buffer_migrate_page_norefs,
+       .migrate_folio  = buffer_migrate_folio_norefs,
        .is_dirty_writeback = buffer_check_dirty_writeback,
 };
 
index e6b932219803ed9984c08d656806c6242bb430f0..58a9d061f17d142932081cad51ff7fb9194d1bb9 100644 (file)
@@ -973,7 +973,7 @@ const struct address_space_operations ext2_aops = {
        .bmap                   = ext2_bmap,
        .direct_IO              = ext2_direct_IO,
        .writepages             = ext2_writepages,
-       .migratepage            = buffer_migrate_page,
+       .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
        .error_remove_page      = generic_error_remove_page,
 };
@@ -989,7 +989,7 @@ const struct address_space_operations ext2_nobh_aops = {
        .bmap                   = ext2_bmap,
        .direct_IO              = ext2_direct_IO,
        .writepages             = ext2_writepages,
-       .migratepage            = buffer_migrate_page,
+       .migrate_folio          = buffer_migrate_folio,
        .error_remove_page      = generic_error_remove_page,
 };
 
index 06cc688781766be28de5c0460ffb31a4700ae01d..87a8b4382bce085d90523ea86b0ebff58889c9bd 100644 (file)
@@ -3633,7 +3633,7 @@ static const struct address_space_operations ext4_aops = {
        .invalidate_folio       = ext4_invalidate_folio,
        .release_folio          = ext4_release_folio,
        .direct_IO              = noop_direct_IO,
-       .migratepage            = buffer_migrate_page,
+       .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
        .error_remove_page      = generic_error_remove_page,
        .swap_activate          = ext4_iomap_swap_activate,
@@ -3668,7 +3668,7 @@ static const struct address_space_operations ext4_da_aops = {
        .invalidate_folio       = ext4_invalidate_folio,
        .release_folio          = ext4_release_folio,
        .direct_IO              = noop_direct_IO,
-       .migratepage            = buffer_migrate_page,
+       .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
        .error_remove_page      = generic_error_remove_page,
        .swap_activate          = ext4_iomap_swap_activate,
index 9e3964ea2ea030ed38d0cec10d110de7972fd33b..5f4fb6ca6f2e936cd48ec54c56d85ea318e04e3f 100644 (file)
@@ -1659,7 +1659,7 @@ const struct address_space_operations ntfs_normal_aops = {
        .dirty_folio    = block_dirty_folio,
 #endif /* NTFS_RW */
        .bmap           = ntfs_bmap,
-       .migratepage    = buffer_migrate_page,
+       .migrate_folio  = buffer_migrate_folio,
        .is_partially_uptodate = block_is_partially_uptodate,
        .error_remove_page = generic_error_remove_page,
 };
@@ -1673,7 +1673,7 @@ const struct address_space_operations ntfs_compressed_aops = {
        .writepage      = ntfs_writepage,
        .dirty_folio    = block_dirty_folio,
 #endif /* NTFS_RW */
-       .migratepage    = buffer_migrate_page,
+       .migrate_folio  = buffer_migrate_folio,
        .is_partially_uptodate = block_is_partially_uptodate,
        .error_remove_page = generic_error_remove_page,
 };
@@ -1688,7 +1688,7 @@ const struct address_space_operations ntfs_mst_aops = {
        .writepage      = ntfs_writepage,       /* Write dirty page to disk. */
        .dirty_folio    = filemap_dirty_folio,
 #endif /* NTFS_RW */
-       .migratepage    = buffer_migrate_page,
+       .migrate_folio  = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
        .error_remove_page = generic_error_remove_page,
 };
index 767df51f8657a6b0b919a76e7c6a686c4418ca3c..1d489003f99dcc1e78b07fe872b16fb39ee2ba4e 100644 (file)
@@ -2462,7 +2462,7 @@ const struct address_space_operations ocfs2_aops = {
        .direct_IO              = ocfs2_direct_IO,
        .invalidate_folio       = block_invalidate_folio,
        .release_folio          = ocfs2_release_folio,
-       .migratepage            = buffer_migrate_page,
+       .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
        .error_remove_page      = generic_error_remove_page,
 };
index c9d1463bb20f31863a2f34ada0bc5e2485807cb0..b0366c89d6a4d12a9fd01dc6ef618c56a24d139e 100644 (file)
@@ -267,6 +267,16 @@ int nobh_truncate_page(struct address_space *, loff_t, get_block_t *);
 int nobh_writepage(struct page *page, get_block_t *get_block,
                         struct writeback_control *wbc);
 
+#ifdef CONFIG_MIGRATION
+extern int buffer_migrate_folio(struct address_space *,
+               struct folio *dst, struct folio *src, enum migrate_mode);
+extern int buffer_migrate_folio_norefs(struct address_space *,
+               struct folio *dst, struct folio *src, enum migrate_mode);
+#else
+#define buffer_migrate_folio NULL
+#define buffer_migrate_folio_norefs NULL
+#endif
+
 void buffer_init(void);
 
 /*
index 47431cf8fbb3d4d811bfa49812fd6988a0633bfa..9e6b17da4e11b17f74c4e54f5f410e5489652bc4 100644 (file)
@@ -3215,18 +3215,6 @@ extern int generic_check_addressable(unsigned, u64);
 
 extern void generic_set_encrypted_ci_d_ops(struct dentry *dentry);
 
-#ifdef CONFIG_MIGRATION
-extern int buffer_migrate_page(struct address_space *,
-                               struct page *, struct page *,
-                               enum migrate_mode);
-extern int buffer_migrate_page_norefs(struct address_space *,
-                               struct page *, struct page *,
-                               enum migrate_mode);
-#else
-#define buffer_migrate_page NULL
-#define buffer_migrate_page_norefs NULL
-#endif
-
 int may_setattr(struct user_namespace *mnt_userns, struct inode *inode,
                unsigned int ia_valid);
 int setattr_prepare(struct user_namespace *, struct dentry *, struct iattr *);
index 75b171425c458574776d907fc1ff4339b9853158..ea5398d0f7f1f0be0f4007d0773d7d82e7428402 100644 (file)
@@ -656,23 +656,23 @@ static bool buffer_migrate_lock_buffers(struct buffer_head *head,
        return true;
 }
 
-static int __buffer_migrate_page(struct address_space *mapping,
-               struct page *newpage, struct page *page, enum migrate_mode mode,
+static int __buffer_migrate_folio(struct address_space *mapping,
+               struct folio *dst, struct folio *src, enum migrate_mode mode,
                bool check_refs)
 {
        struct buffer_head *bh, *head;
        int rc;
        int expected_count;
 
-       if (!page_has_buffers(page))
-               return migrate_page(mapping, newpage, page, mode);
+       head = folio_buffers(src);
+       if (!head)
+               return migrate_page(mapping, &dst->page, &src->page, mode);
 
        /* Check whether page does not have extra refs before we do more work */
-       expected_count = expected_page_refs(mapping, page);
-       if (page_count(page) != expected_count)
+       expected_count = expected_page_refs(mapping, &src->page);
+       if (folio_ref_count(src) != expected_count)
                return -EAGAIN;
 
-       head = page_buffers(page);
        if (!buffer_migrate_lock_buffers(head, mode))
                return -EAGAIN;
 
@@ -703,23 +703,22 @@ recheck_buffers:
                }
        }
 
-       rc = migrate_page_move_mapping(mapping, newpage, page, 0);
+       rc = folio_migrate_mapping(mapping, dst, src, 0);
        if (rc != MIGRATEPAGE_SUCCESS)
                goto unlock_buffers;
 
-       attach_page_private(newpage, detach_page_private(page));
+       folio_attach_private(dst, folio_detach_private(src));
 
        bh = head;
        do {
-               set_bh_page(bh, newpage, bh_offset(bh));
+               set_bh_page(bh, &dst->page, bh_offset(bh));
                bh = bh->b_this_page;
-
        } while (bh != head);
 
        if (mode != MIGRATE_SYNC_NO_COPY)
-               migrate_page_copy(newpage, page);
+               folio_migrate_copy(dst, src);
        else
-               migrate_page_states(newpage, page);
+               folio_migrate_flags(dst, src);
 
        rc = MIGRATEPAGE_SUCCESS;
 unlock_buffers:
@@ -729,34 +728,51 @@ unlock_buffers:
        do {
                unlock_buffer(bh);
                bh = bh->b_this_page;
-
        } while (bh != head);
 
        return rc;
 }
 
-/*
- * Migration function for pages with buffers. This function can only be used
- * if the underlying filesystem guarantees that no other references to "page"
- * exist. For example attached buffer heads are accessed only under page lock.
+/**
+ * buffer_migrate_folio() - Migration function for folios with buffers.
+ * @mapping: The address space containing @src.
+ * @dst: The folio to migrate to.
+ * @src: The folio to migrate from.
+ * @mode: How to migrate the folio.
+ *
+ * This function can only be used if the underlying filesystem guarantees
+ * that no other references to @src exist. For example attached buffer
+ * heads are accessed only under the folio lock.  If your filesystem cannot
+ * provide this guarantee, buffer_migrate_folio_norefs() may be more
+ * appropriate.
+ *
+ * Return: 0 on success or a negative errno on failure.
  */
-int buffer_migrate_page(struct address_space *mapping,
-               struct page *newpage, struct page *page, enum migrate_mode mode)
+int buffer_migrate_folio(struct address_space *mapping,
+               struct folio *dst, struct folio *src, enum migrate_mode mode)
 {
-       return __buffer_migrate_page(mapping, newpage, page, mode, false);
+       return __buffer_migrate_folio(mapping, dst, src, mode, false);
 }
-EXPORT_SYMBOL(buffer_migrate_page);
+EXPORT_SYMBOL(buffer_migrate_folio);
 
-/*
- * Same as above except that this variant is more careful and checks that there
- * are also no buffer head references. This function is the right one for
- * mappings where buffer heads are directly looked up and referenced (such as
- * block device mappings).
+/**
+ * buffer_migrate_folio_norefs() - Migration function for folios with buffers.
+ * @mapping: The address space containing @src.
+ * @dst: The folio to migrate to.
+ * @src: The folio to migrate from.
+ * @mode: How to migrate the folio.
+ *
+ * Like buffer_migrate_folio() except that this variant is more careful
+ * and checks that there are also no buffer head references. This function
+ * is the right one for mappings where buffer heads are directly looked
+ * up and referenced (such as block device mappings).
+ *
+ * Return: 0 on success or a negative errno on failure.
  */
-int buffer_migrate_page_norefs(struct address_space *mapping,
-               struct page *newpage, struct page *page, enum migrate_mode mode)
+int buffer_migrate_folio_norefs(struct address_space *mapping,
+               struct folio *dst, struct folio *src, enum migrate_mode mode)
 {
-       return __buffer_migrate_page(mapping, newpage, page, mode, true);
+       return __buffer_migrate_folio(mapping, dst, src, mode, true);
 }
 #endif