fs: convert error_remove_page to error_remove_folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 17 Nov 2023 16:14:47 +0000 (16:14 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 11 Dec 2023 00:51:42 +0000 (16:51 -0800)
There were already assertions that we were not passing a tail page to
error_remove_page(), so make the compiler enforce that by converting
everything to pass and use a folio.

Link: https://lkml.kernel.org/r/20231117161447.2461643-7-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
23 files changed:
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
block/fops.c
fs/afs/write.c
fs/bcachefs/fs.c
fs/btrfs/inode.c
fs/ceph/addr.c
fs/ext2/inode.c
fs/ext4/inode.c
fs/f2fs/compress.c
fs/f2fs/inode.c
fs/gfs2/aops.c
fs/hugetlbfs/inode.c
fs/nfs/file.c
fs/ntfs/aops.c
fs/ocfs2/aops.c
fs/xfs/xfs_aops.c
fs/zonefs/file.c
include/linux/fs.h
include/linux/mm.h
mm/memory-failure.c
mm/shmem.c
mm/truncate.c

index 7be2900806c85330b9589f32e4a887b0b6857fde..421daf83794088c1cab620341433a8fbd55789d4 100644 (file)
@@ -261,7 +261,7 @@ prototypes::
                        struct folio *src, enum migrate_mode);
        int (*launder_folio)(struct folio *);
        bool (*is_partially_uptodate)(struct folio *, size_t from, size_t count);
-       int (*error_remove_page)(struct address_space *, struct page *);
+       int (*error_remove_folio)(struct address_space *, struct folio *);
        int (*swap_activate)(struct swap_info_struct *sis, struct file *f, sector_t *span)
        int (*swap_deactivate)(struct file *);
        int (*swap_rw)(struct kiocb *iocb, struct iov_iter *iter);
@@ -287,7 +287,7 @@ direct_IO:
 migrate_folio:         yes (both)
 launder_folio:         yes
 is_partially_uptodate: yes
-error_remove_page:     yes
+error_remove_folio:    yes
 swap_activate:         no
 swap_deactivate:       no
 swap_rw:               yes, unlocks
index 99acc2e9867391a917269bfb4a5fb0a3f940bc7e..dd99ce5912d85967581ca382e35df112af4ed6e1 100644 (file)
@@ -823,7 +823,7 @@ cache in your filesystem.  The following members are defined:
                bool (*is_partially_uptodate) (struct folio *, size_t from,
                                               size_t count);
                void (*is_dirty_writeback)(struct folio *, bool *, bool *);
-               int (*error_remove_page) (struct mapping *mapping, struct page *page);
+               int (*error_remove_folio)(struct mapping *mapping, struct folio *);
                int (*swap_activate)(struct swap_info_struct *sis, struct file *f, sector_t *span)
                int (*swap_deactivate)(struct file *);
                int (*swap_rw)(struct kiocb *iocb, struct iov_iter *iter);
@@ -1034,8 +1034,8 @@ cache in your filesystem.  The following members are defined:
        VM if a folio should be treated as dirty or writeback for the
        purposes of stalling.
 
-``error_remove_page``
-       normally set to generic_error_remove_page if truncation is ok
+``error_remove_folio``
+       normally set to generic_error_remove_folio if truncation is ok
        for this address space.  Used for memory failure handling.
        Setting this implies you deal with pages going away under you,
        unless you have them locked or reference counts increased.
index 0abaac705dafb08bf26078a7d3048c12916067c6..0bdad1e8d51457c2fccfc2e99999a6aff3e4bc87 100644 (file)
@@ -500,7 +500,7 @@ const struct address_space_operations def_blk_aops = {
        .readahead              = blkdev_readahead,
        .writepages             = blkdev_writepages,
        .is_partially_uptodate  = iomap_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
        .migrate_folio          = filemap_migrate_folio,
 };
 #endif /* CONFIG_BUFFER_HEAD */
index 57d05d67f0c26220206e331d4141c4e32cf842db..e87b52b1f34c647498b8a7272b6a6dad5d91f54d 100644 (file)
@@ -242,7 +242,7 @@ static void afs_kill_pages(struct address_space *mapping,
                folio_clear_uptodate(folio);
                folio_end_writeback(folio);
                folio_lock(folio);
-               generic_error_remove_page(mapping, &folio->page);
+               generic_error_remove_folio(mapping, folio);
                folio_unlock(folio);
                folio_put(folio);
 
index 4d51be813509891458735d494b44e36c043035c6..df4a97b6637b8c06c975fa1efa730274b8e0eabb 100644 (file)
@@ -1103,7 +1103,7 @@ static const struct address_space_operations bch_address_space_operations = {
 #ifdef CONFIG_MIGRATION
        .migrate_folio  = filemap_migrate_folio,
 #endif
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
 };
 
 struct bcachefs_fid {
index 9f5a9894f88f49156e9ddb7c4baac8ef1be252df..ff7b4efca24f398bb9ee1079b95a98bda2df7720 100644 (file)
@@ -10930,7 +10930,7 @@ static const struct address_space_operations btrfs_aops = {
        .release_folio  = btrfs_release_folio,
        .migrate_folio  = btrfs_migrate_folio,
        .dirty_folio    = filemap_dirty_folio,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
        .swap_activate  = btrfs_swap_activate,
        .swap_deactivate = btrfs_swap_deactivate,
 };
index 85be3bf18cdf38834de3141dfe0d6d75393c6d94..13af429ab030b6232c197c53659d982ac8bdc43a 100644 (file)
@@ -907,8 +907,8 @@ static void writepages_finish(struct ceph_osd_request *req)
                        doutc(cl, "unlocking %p\n", page);
 
                        if (remove_page)
-                               generic_error_remove_page(inode->i_mapping,
-                                                         page);
+                               generic_error_remove_folio(inode->i_mapping,
+                                                         page_folio(page));
 
                        unlock_page(page);
                }
index 464faf6c217e902689a02703ca6e7eadaf0a8c6d..5a4272b2c6b0a26770e33aa2a1f59e9ff5f7db6b 100644 (file)
@@ -969,7 +969,7 @@ const struct address_space_operations ext2_aops = {
        .writepages             = ext2_writepages,
        .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
 };
 
 static const struct address_space_operations ext2_dax_aops = {
index 61277f7f87225a0a69701922ad84f75290a5a113..d7729b17a66b8203add550d4d306f8694de90fb0 100644 (file)
@@ -3564,7 +3564,7 @@ static const struct address_space_operations ext4_aops = {
        .direct_IO              = noop_direct_IO,
        .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
        .swap_activate          = ext4_iomap_swap_activate,
 };
 
@@ -3581,7 +3581,7 @@ static const struct address_space_operations ext4_journalled_aops = {
        .direct_IO              = noop_direct_IO,
        .migrate_folio          = buffer_migrate_folio_norefs,
        .is_partially_uptodate  = block_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
        .swap_activate          = ext4_iomap_swap_activate,
 };
 
@@ -3598,7 +3598,7 @@ static const struct address_space_operations ext4_da_aops = {
        .direct_IO              = noop_direct_IO,
        .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
        .swap_activate          = ext4_iomap_swap_activate,
 };
 
index 36e5dab6baaee99141ab0a42741e7fdf9879fe08..6b2af514660d7f5938fb92d040369ec7d406b316 100644 (file)
@@ -1944,7 +1944,7 @@ void f2fs_invalidate_compress_pages(struct f2fs_sb_info *sbi, nid_t ino)
                                continue;
                        }
 
-                       generic_error_remove_page(mapping, &folio->page);
+                       generic_error_remove_folio(mapping, folio);
                        folio_unlock(folio);
                }
                folio_batch_release(&fbatch);
index 560bfcad1af2356c761446c93c67d90110f041f3..a9eb3891f417869444bf6c7aa40ec00e5bbd6b4d 100644 (file)
@@ -600,7 +600,7 @@ make_now:
 #ifdef CONFIG_F2FS_FS_COMPRESSION
                inode->i_mapping->a_ops = &f2fs_compress_aops;
                /*
-                * generic_error_remove_page only truncates pages of regular
+                * generic_error_remove_folio only truncates pages of regular
                 * inode
                 */
                inode->i_mode |= S_IFREG;
index ba8742dc91f81fcbc6cf0aed06b5f074bdbce459..5cffb079b87cbf0c2c77a5fa69406969ed56fd63 100644 (file)
@@ -745,7 +745,7 @@ static const struct address_space_operations gfs2_aops = {
        .bmap = gfs2_bmap,
        .migrate_folio = filemap_migrate_folio,
        .is_partially_uptodate = iomap_is_partially_uptodate,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
 };
 
 static const struct address_space_operations gfs2_jdata_aops = {
@@ -758,7 +758,7 @@ static const struct address_space_operations gfs2_jdata_aops = {
        .invalidate_folio = gfs2_invalidate_folio,
        .release_folio = gfs2_release_folio,
        .is_partially_uptodate = block_is_partially_uptodate,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
 };
 
 void gfs2_set_aops(struct inode *inode)
index f757d4f7ad98a48542cb197fe8292ff91c868cd3..36132c9125f94d138b14af8924496c9f41556379 100644 (file)
@@ -1129,8 +1129,8 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
 #define hugetlbfs_migrate_folio NULL
 #endif
 
-static int hugetlbfs_error_remove_page(struct address_space *mapping,
-                               struct page *page)
+static int hugetlbfs_error_remove_folio(struct address_space *mapping,
+                               struct folio *folio)
 {
        return 0;
 }
@@ -1277,7 +1277,7 @@ static const struct address_space_operations hugetlbfs_aops = {
        .write_end      = hugetlbfs_write_end,
        .dirty_folio    = noop_dirty_folio,
        .migrate_folio  = hugetlbfs_migrate_folio,
-       .error_remove_page      = hugetlbfs_error_remove_page,
+       .error_remove_folio     = hugetlbfs_error_remove_folio,
 };
 
 
index 3f9768810427df609c74cf5a077e6748cc5019ce..e8cccb94b9277e90ae057c1f178cf064ad6b7189 100644 (file)
@@ -567,7 +567,7 @@ const struct address_space_operations nfs_file_aops = {
        .migrate_folio = nfs_migrate_folio,
        .launder_folio = nfs_launder_folio,
        .is_dirty_writeback = nfs_check_dirty_writeback,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
        .swap_activate = nfs_swap_activate,
        .swap_deactivate = nfs_swap_deactivate,
        .swap_rw = nfs_swap_rw,
index 71e31e789b292e0f3fa645219134423ebd647dbf..70479ce915e8f166f46115b33990f37012a9907c 100644 (file)
@@ -1644,7 +1644,7 @@ const struct address_space_operations ntfs_normal_aops = {
        .bmap           = ntfs_bmap,
        .migrate_folio  = buffer_migrate_folio,
        .is_partially_uptodate = block_is_partially_uptodate,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
 };
 
 /*
@@ -1658,7 +1658,7 @@ const struct address_space_operations ntfs_compressed_aops = {
 #endif /* NTFS_RW */
        .migrate_folio  = buffer_migrate_folio,
        .is_partially_uptodate = block_is_partially_uptodate,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
 };
 
 /*
@@ -1673,7 +1673,7 @@ const struct address_space_operations ntfs_mst_aops = {
 #endif /* NTFS_RW */
        .migrate_folio  = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
-       .error_remove_page = generic_error_remove_page,
+       .error_remove_folio = generic_error_remove_folio,
 };
 
 #ifdef NTFS_RW
index ba790219d528e1997c84e92ff3e297b6756fa69f..79599780632655fc06abcc0ef8d90eee4282f70b 100644 (file)
@@ -2480,5 +2480,5 @@ const struct address_space_operations ocfs2_aops = {
        .release_folio          = ocfs2_release_folio,
        .migrate_folio          = buffer_migrate_folio,
        .is_partially_uptodate  = block_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
 };
index 465d7630bb2185d878b21d9968131a92d66d1ee8..813f85156b0c3b9ed97a5d5740db2d20e3810e59 100644 (file)
@@ -584,7 +584,7 @@ const struct address_space_operations xfs_address_space_operations = {
        .bmap                   = xfs_vm_bmap,
        .migrate_folio          = filemap_migrate_folio,
        .is_partially_uptodate  = iomap_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
        .swap_activate          = xfs_iomap_swapfile_activate,
 };
 
index b2c9b35df8f76d155ce51b5fecb8c04e98c834e0..6ab2318a9c8e80271a3f17d2ad852dacad2f2fa1 100644 (file)
@@ -180,7 +180,7 @@ const struct address_space_operations zonefs_file_aops = {
        .invalidate_folio       = iomap_invalidate_folio,
        .migrate_folio          = filemap_migrate_folio,
        .is_partially_uptodate  = iomap_is_partially_uptodate,
-       .error_remove_page      = generic_error_remove_page,
+       .error_remove_folio     = generic_error_remove_folio,
        .swap_activate          = zonefs_swap_activate,
 };
 
index 98b7a7a8c42e36cc140d14797cf8eb00f7c36f76..31b2cf963db9c371a33ebe0a665d7e272ca2e088 100644 (file)
@@ -434,7 +434,7 @@ struct address_space_operations {
        bool (*is_partially_uptodate) (struct folio *, size_t from,
                        size_t count);
        void (*is_dirty_writeback) (struct folio *, bool *dirty, bool *wb);
-       int (*error_remove_page)(struct address_space *, struct page *);
+       int (*error_remove_folio)(struct address_space *, struct folio *);
 
        /* swapfile support */
        int (*swap_activate)(struct swap_info_struct *sis, struct file *file,
index 64cd1ee4aaccd5c9cdf3b954c6238346ab02e6a7..13a0902717161585283cfa02db370d5eb90f9ef0 100644 (file)
@@ -2384,7 +2384,8 @@ extern void truncate_pagecache(struct inode *inode, loff_t new);
 extern void truncate_setsize(struct inode *inode, loff_t newsize);
 void pagecache_isize_extended(struct inode *inode, loff_t from, loff_t to);
 void truncate_pagecache_range(struct inode *inode, loff_t offset, loff_t end);
-int generic_error_remove_page(struct address_space *mapping, struct page *page);
+int generic_error_remove_folio(struct address_space *mapping,
+               struct folio *folio);
 
 struct vm_area_struct *lock_mm_and_find_vma(struct mm_struct *mm,
                unsigned long address, struct pt_regs *regs);
index 6aec94821fda69ecb9538821be9e69220ef0146e..d8c853b35dbb01279f183477fe3a06c70856b9e2 100644 (file)
@@ -927,13 +927,13 @@ static int delete_from_lru_cache(struct folio *folio)
        return -EIO;
 }
 
-static int truncate_error_page(struct folio *folio, unsigned long pfn,
+static int truncate_error_folio(struct folio *folio, unsigned long pfn,
                                struct address_space *mapping)
 {
        int ret = MF_FAILED;
 
-       if (mapping->a_ops->error_remove_page) {
-               int err = mapping->a_ops->error_remove_page(mapping, &folio->page);
+       if (mapping->a_ops->error_remove_folio) {
+               int err = mapping->a_ops->error_remove_folio(mapping, folio);
 
                if (err != 0)
                        pr_info("%#lx: Failed to punch page: %d\n", pfn, err);
@@ -1054,7 +1054,7 @@ static int me_pagecache_clean(struct page_state *ps, struct page *p)
         *
         * Open: to take i_rwsem or not for this? Right now we don't.
         */
-       ret = truncate_error_page(folio, page_to_pfn(p), mapping);
+       ret = truncate_error_folio(folio, page_to_pfn(p), mapping);
        if (has_extra_refcount(ps, p, extra_pins))
                ret = MF_FAILED;
 
@@ -1188,7 +1188,7 @@ static int me_huge_page(struct page_state *ps, struct page *p)
 
        mapping = folio_mapping(folio);
        if (mapping) {
-               res = truncate_error_page(folio, page_to_pfn(p), mapping);
+               res = truncate_error_folio(folio, page_to_pfn(p), mapping);
                /* The page is kept in page cache. */
                extra_pins = true;
                folio_unlock(folio);
index 91e2620148b2f6d789420e6736daef7a53e2cc5c..97bc622da77447d00a4fa71a6ca2b68ef7d12b98 100644 (file)
@@ -4445,8 +4445,8 @@ static void __init shmem_destroy_inodecache(void)
 }
 
 /* Keep the page in page cache instead of truncating it */
-static int shmem_error_remove_page(struct address_space *mapping,
-                                  struct page *page)
+static int shmem_error_remove_folio(struct address_space *mapping,
+                                  struct folio *folio)
 {
        return 0;
 }
@@ -4461,7 +4461,7 @@ const struct address_space_operations shmem_aops = {
 #ifdef CONFIG_MIGRATION
        .migrate_folio  = migrate_folio,
 #endif
-       .error_remove_page = shmem_error_remove_page,
+       .error_remove_folio = shmem_error_remove_folio,
 };
 EXPORT_SYMBOL(shmem_aops);
 
index 52e3a703e7b299bb048313321a706c6e7d49f942..725b150e47ac4cc72f3d8238b46c20bf43f1c061 100644 (file)
@@ -250,10 +250,9 @@ bool truncate_inode_partial_folio(struct folio *folio, loff_t start, loff_t end)
 /*
  * Used to get rid of pages on hardware memory corruption.
  */
-int generic_error_remove_page(struct address_space *mapping, struct page *page)
+int generic_error_remove_folio(struct address_space *mapping,
+               struct folio *folio)
 {
-       VM_BUG_ON_PAGE(PageTail(page), page);
-
        if (!mapping)
                return -EINVAL;
        /*
@@ -262,9 +261,9 @@ int generic_error_remove_page(struct address_space *mapping, struct page *page)
         */
        if (!S_ISREG(mapping->host->i_mode))
                return -EIO;
-       return truncate_inode_folio(mapping, page_folio(page));
+       return truncate_inode_folio(mapping, folio);
 }
-EXPORT_SYMBOL(generic_error_remove_page);
+EXPORT_SYMBOL(generic_error_remove_folio);
 
 /**
  * mapping_evict_folio() - Remove an unused folio from the page-cache.