fs: Add aops->launder_folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 9 Feb 2022 20:21:52 +0000 (20:21 +0000)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 15 Mar 2022 12:23:30 +0000 (08:23 -0400)
Since the only difference between ->launder_page and ->launder_folio
is the type of the pointer, these can safely use a union without
affecting bisectability.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Tested-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Tested-by: Mike Marshall <hubcap@omnibond.com> # orangefs
Tested-by: David Howells <dhowells@redhat.com> # afs
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
include/linux/fs.h
mm/truncate.c

index 8e9cbc0fb70f6ed79d4ed1d59e46e88370099da1..dee512efb45832c35763f2c7295a16b1884f9e2e 100644 (file)
@@ -257,7 +257,7 @@ prototypes::
        bool (*isolate_page) (struct page *, isolate_mode_t);
        int (*migratepage)(struct address_space *, struct page *, struct page *);
        void (*putback_page) (struct page *);
-       int (*launder_page)(struct page *);
+       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 (*swap_activate)(struct file *);
@@ -285,7 +285,7 @@ direct_IO:
 isolate_page:          yes
 migratepage:           yes (both)
 putback_page:          yes
-launder_page:          yes
+launder_folio:         yes
 is_partially_uptodate: yes
 error_remove_page:     yes
 swap_activate:         no
@@ -385,9 +385,9 @@ the kernel assumes that the fs has no private interest in the buffers.
 ->freepage() is called when the kernel is done dropping the page
 from the page cache.
 
-->launder_page() may be called prior to releasing a page if
-it is still found to be dirty. It returns zero if the page was successfully
-cleaned, or an error value if not. Note that in order to prevent the page
+->launder_folio() may be called prior to releasing a folio if
+it is still found to be dirty. It returns zero if the folio was successfully
+cleaned, or an error value if not. Note that in order to prevent the folio
 getting mapped back in and redirtied, it needs to be kept locked
 across the entire operation.
 
index 28704831652c3197b992fe703896ce42f984c57c..c54ca4d88ed6bf9f94e4004bc6a6bcef668ddf3f 100644 (file)
@@ -745,7 +745,7 @@ cache in your filesystem.  The following members are defined:
                int (*migratepage) (struct page *, struct page *);
                /* put migration-failed page back to right list */
                void (*putback_page) (struct page *);
-               int (*launder_page) (struct page *);
+               int (*launder_folio) (struct folio *);
 
                bool (*is_partially_uptodate) (struct folio *, size_t from,
                                               size_t count);
@@ -930,9 +930,9 @@ cache in your filesystem.  The following members are defined:
 ``putback_page``
        Called by the VM when isolated page's migration fails.
 
-``launder_page``
-       Called before freeing a page - it writes back the dirty page.
-       To prevent redirtying the page, it is kept locked during the
+``launder_folio``
+       Called before freeing a folio - it writes back the dirty folio.
+       To prevent redirtying the folio, it is kept locked during the
        whole operation.
 
 ``is_partially_uptodate``
index af9ae091bd82d8672edd456887cf2ddc89b34a3a..0af3075cdff2270ec72e8a38d7b1d27c04299e78 100644 (file)
@@ -399,7 +399,10 @@ struct address_space_operations {
                        struct page *, struct page *, enum migrate_mode);
        bool (*isolate_page)(struct page *, isolate_mode_t);
        void (*putback_page)(struct page *);
-       int (*launder_page) (struct page *);
+       union {
+               int (*launder_page) (struct page *);
+               int (*launder_folio) (struct folio *);
+       };
        bool (*is_partially_uptodate) (struct folio *, size_t from,
                        size_t count);
        void (*is_dirty_writeback) (struct page *, bool *, bool *);
index 8010461a59bd71b43c399e1db2d5ad45245cbee1..6ad44b546dff170564a141f9599ec0a377fb48a9 100644 (file)
@@ -614,13 +614,13 @@ failed:
        return 0;
 }
 
-static int do_launder_folio(struct address_space *mapping, struct folio *folio)
+static int folio_launder(struct address_space *mapping, struct folio *folio)
 {
        if (!folio_test_dirty(folio))
                return 0;
-       if (folio->mapping != mapping || mapping->a_ops->launder_page == NULL)
+       if (folio->mapping != mapping || mapping->a_ops->launder_folio == NULL)
                return 0;
-       return mapping->a_ops->launder_page(&folio->page);
+       return mapping->a_ops->launder_folio(folio);
 }
 
 /**
@@ -686,7 +686,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
                                unmap_mapping_folio(folio);
                        BUG_ON(folio_mapped(folio));
 
-                       ret2 = do_launder_folio(mapping, folio);
+                       ret2 = folio_launder(mapping, folio);
                        if (ret2 == 0) {
                                if (!invalidate_complete_folio2(mapping, folio))
                                        ret2 = -EBUSY;