Message ID | 20210715033704.692967-77-willy@infradead.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Memory folios | expand |
Matthew Wilcox (Oracle) <willy@infradead.org> wrote: > 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>
On 7/15/21 5:36 AM, Matthew Wilcox (Oracle) wrote: > 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> Acked-by: Vlastimil Babka <vbabka@suse.cz> Nit: > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -2558,21 +2558,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. s/0/false > + * > + * 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; > + unsigned 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. >
On Thu, Aug 12, 2021 at 06:30:51PM +0200, Vlastimil Babka wrote: > > +/** > > + * 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. > > s/0/false ... no? This sentence describes what a writepage implementation should do, and writepage returns an int, not bool.
diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 176580f54af9..104ae698443e 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c @@ -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" diff --git a/include/linux/mm.h b/include/linux/mm.h index 26883ea28349..4803f2c01367 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -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; @@ -2000,8 +1998,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); diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 50cb6e25ab9e..5383f7e39816 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -404,6 +404,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); diff --git a/mm/folio-compat.c b/mm/folio-compat.c index 39f5a8d963b1..c1e01bc36d32 100644 --- a/mm/folio-compat.c +++ b/mm/folio-compat.c @@ -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); diff --git a/mm/page-writeback.c b/mm/page-writeback.c index d7bd5580c91e..c2987f05c944 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2558,21 +2558,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; + unsigned 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.