mm/writeback: Add folio_redirty_for_writepage()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 3 May 2021 03:22:52 +0000 (23:22 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 18 Oct 2021 11:49:40 +0000 (07:49 -0400)
Reimplement redirty_page_for_writepage() as a wrapper around
folio_redirty_for_writepage().  Account the number of pages in the
folio, add kernel-doc and move the prototype to writeback.h.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Howells <dhowells@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
fs/jfs/jfs_metapage.c
include/linux/mm.h
include/linux/writeback.h
mm/folio-compat.c
mm/page-writeback.c

index 176580f54af96160a12447f2893223abd2bac4d0..104ae698443ed085eae66109a0ff7abdb34deae2 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/buffer_head.h>
 #include <linux/mempool.h>
 #include <linux/seq_file.h>
+#include <linux/writeback.h>
 #include "jfs_incore.h"
 #include "jfs_superblock.h"
 #include "jfs_filsys.h"
index dd5c6970ba675f411f7c185ebc2ee5573e876b9d..23ab040aa65a898d12b5537f139cfcede5ae0536 100644 (file)
@@ -36,9 +36,7 @@
 struct mempolicy;
 struct anon_vma;
 struct anon_vma_chain;
-struct file_ra_state;
 struct user_struct;
-struct writeback_control;
 struct pt_regs;
 
 extern int sysctl_page_lock_unfairness;
@@ -2003,8 +2001,6 @@ extern int try_to_release_page(struct page * page, gfp_t gfp_mask);
 extern void do_invalidatepage(struct page *page, unsigned int offset,
                              unsigned int length);
 
-int redirty_page_for_writepage(struct writeback_control *wbc,
-                               struct page *page);
 bool folio_mark_dirty(struct folio *folio);
 bool set_page_dirty(struct page *page);
 int set_page_dirty_lock(struct page *page);
index 852100bea351efb92ff6d45f8fae421ddccbd978..3571f383dfb68524bac61453f9744b7966335d2f 100644 (file)
@@ -399,6 +399,8 @@ static inline void account_page_redirty(struct page *page)
 {
        folio_account_redirty(page_folio(page));
 }
+bool folio_redirty_for_writepage(struct writeback_control *, struct folio *);
+bool redirty_page_for_writepage(struct writeback_control *, struct page *);
 
 void sb_mark_inode_writeback(struct inode *inode);
 void sb_clear_inode_writeback(struct inode *inode);
index 39f5a8d963b189438801f4b259f3c1a570598758..c1e01bc36d3225dd8526a7740c211262f87b4760 100644 (file)
@@ -95,3 +95,10 @@ bool clear_page_dirty_for_io(struct page *page)
        return folio_clear_dirty_for_io(page_folio(page));
 }
 EXPORT_SYMBOL(clear_page_dirty_for_io);
+
+bool redirty_page_for_writepage(struct writeback_control *wbc,
+               struct page *page)
+{
+       return folio_redirty_for_writepage(wbc, page_folio(page));
+}
+EXPORT_SYMBOL(redirty_page_for_writepage);
index 7ef904363fb7cb99b327182a0cfa472d5a4b5bd8..a0c35a9d8029c6635f0db57a60e196bb0787f438 100644 (file)
@@ -2575,21 +2575,31 @@ void folio_account_redirty(struct folio *folio)
 }
 EXPORT_SYMBOL(folio_account_redirty);
 
-/*
- * When a writepage implementation decides that it doesn't want to write this
- * page for some reason, it should redirty the locked page via
- * redirty_page_for_writepage() and it should then unlock the page and return 0
+/**
+ * folio_redirty_for_writepage - Decline to write a dirty folio.
+ * @wbc: The writeback control.
+ * @folio: The folio.
+ *
+ * When a writepage implementation decides that it doesn't want to write
+ * @folio for some reason, it should call this function, unlock @folio and
+ * return 0.
+ *
+ * Return: True if we redirtied the folio.  False if someone else dirtied
+ * it first.
  */
-int redirty_page_for_writepage(struct writeback_control *wbc, struct page *page)
+bool folio_redirty_for_writepage(struct writeback_control *wbc,
+               struct folio *folio)
 {
-       int ret;
+       bool ret;
+       long nr = folio_nr_pages(folio);
+
+       wbc->pages_skipped += nr;
+       ret = filemap_dirty_folio(folio->mapping, folio);
+       folio_account_redirty(folio);
 
-       wbc->pages_skipped++;
-       ret = __set_page_dirty_nobuffers(page);
-       account_page_redirty(page);
        return ret;
 }
-EXPORT_SYMBOL(redirty_page_for_writepage);
+EXPORT_SYMBOL(folio_redirty_for_writepage);
 
 /**
  * folio_mark_dirty - Mark a folio as being modified.