Commit fdaf532a authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle)
Browse files

mm/writeback: Add folio_cancel_dirty()



Turn __cancel_dirty_page() into __folio_cancel_dirty() and add wrappers.
Move the prototypes into pagemap.h since this is page cache functionality.
Saves 44 bytes of kernel text in total; 33 bytes from __folio_cancel_dirty
and 11 from two callers of cancel_dirty_page().

Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDavid Howells <dhowells@redhat.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
parent fc9b6a53
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -2008,13 +2008,6 @@ int redirty_page_for_writepage(struct writeback_control *wbc,
bool folio_mark_dirty(struct folio *folio);
bool set_page_dirty(struct page *page);
int set_page_dirty_lock(struct page *page);
void __cancel_dirty_page(struct page *page);
static inline void cancel_dirty_page(struct page *page)
{
	/* Avoid atomic ops, locking, etc. when not actually needed. */
	if (PageDirty(page))
		__cancel_dirty_page(page);
}
int clear_page_dirty_for_io(struct page *page);

int get_cmdline(struct task_struct *task, char *buffer, int buflen);
+11 −0
Original line number Diff line number Diff line
@@ -785,6 +785,17 @@ static inline void account_page_cleaned(struct page *page,
{
	return folio_account_cleaned(page_folio(page), mapping, wb);
}
void __folio_cancel_dirty(struct folio *folio);
static inline void folio_cancel_dirty(struct folio *folio)
{
	/* Avoid atomic ops, locking, etc. when not actually needed. */
	if (folio_test_dirty(folio))
		__folio_cancel_dirty(folio);
}
static inline void cancel_dirty_page(struct page *page)
{
	folio_cancel_dirty(page_folio(page));
}

int __set_page_dirty_nobuffers(struct page *page);
int __set_page_dirty_no_writeback(struct page *page);
+8 −8
Original line number Diff line number Diff line
@@ -2657,28 +2657,28 @@ EXPORT_SYMBOL(set_page_dirty_lock);
 * page without actually doing it through the VM. Can you say "ext3 is
 * horribly ugly"? Thought you could.
 */
void __cancel_dirty_page(struct page *page)
void __folio_cancel_dirty(struct folio *folio)
{
	struct address_space *mapping = page_mapping(page);
	struct address_space *mapping = folio_mapping(folio);

	if (mapping_can_writeback(mapping)) {
		struct inode *inode = mapping->host;
		struct bdi_writeback *wb;
		struct wb_lock_cookie cookie = {};

		lock_page_memcg(page);
		folio_memcg_lock(folio);
		wb = unlocked_inode_to_wb_begin(inode, &cookie);

		if (TestClearPageDirty(page))
			account_page_cleaned(page, mapping, wb);
		if (folio_test_clear_dirty(folio))
			folio_account_cleaned(folio, mapping, wb);

		unlocked_inode_to_wb_end(inode, &cookie);
		unlock_page_memcg(page);
		folio_memcg_unlock(folio);
	} else {
		ClearPageDirty(page);
		folio_clear_dirty(folio);
	}
}
EXPORT_SYMBOL(__cancel_dirty_page);
EXPORT_SYMBOL(__folio_cancel_dirty);

/*
 * Clear a page's dirty flag, while caring for dirty memory accounting.