diff options
| author | Theodore Ts'o <tytso@mit.edu> | 2015-01-22 12:38:11 -0500 |
|---|---|---|
| committer | Mister Oyster <oysterized@gmail.com> | 2017-05-27 19:39:52 +0200 |
| commit | c800f6f41d3ef7d86fbeb42c65d892df5ea4d02c (patch) | |
| tree | 38a51d8ac5ed1aad46da9c1b0a03ecf1d7219e28 | |
| parent | 088cb00b882f95b49b814b0ab7413f35b14dd33f (diff) | |
ext4: backport mm portion of: fix data integrity sync in ordered mode
Commit 1c8349a17137: "ext4: fix data integrity sync in ordered mode"
included changes to include/linux/page-flags.h and
mm/page-writeback.c. Apply them as part of the 3.18 ext4 backport.
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
| -rw-r--r-- | include/linux/page-flags.h | 12 | ||||
| -rw-r--r-- | mm/page-writeback.c | 11 |
2 files changed, 17 insertions, 6 deletions
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 7fbd67200..327a01903 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -318,13 +318,23 @@ CLEARPAGEFLAG(Uptodate, uptodate) extern void cancel_dirty_page(struct page *page, unsigned int account_size); int test_clear_page_writeback(struct page *page); -int test_set_page_writeback(struct page *page); +int __test_set_page_writeback(struct page *page, bool keep_write); + +#define test_set_page_writeback(page) \ + __test_set_page_writeback(page, false) +#define test_set_page_writeback_keepwrite(page) \ + __test_set_page_writeback(page, true) static inline void set_page_writeback(struct page *page) { test_set_page_writeback(page); } +static inline void set_page_writeback_keepwrite(struct page *page) +{ + test_set_page_writeback_keepwrite(page); +} + #ifdef CONFIG_PAGEFLAGS_EXTENDED /* * System with lots of page flags available. This allows separate diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 784472640..353a2b5e3 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2268,7 +2268,7 @@ int test_clear_page_writeback(struct page *page) return ret; } -int test_set_page_writeback(struct page *page) +int __test_set_page_writeback(struct page *page, bool keep_write) { struct address_space *mapping = page_mapping(page); int ret; @@ -2290,9 +2290,10 @@ int test_set_page_writeback(struct page *page) radix_tree_tag_clear(&mapping->page_tree, page_index(page), PAGECACHE_TAG_DIRTY); - radix_tree_tag_clear(&mapping->page_tree, - page_index(page), - PAGECACHE_TAG_TOWRITE); + if (!keep_write) + radix_tree_tag_clear(&mapping->page_tree, + page_index(page), + PAGECACHE_TAG_TOWRITE); spin_unlock_irqrestore(&mapping->tree_lock, flags); } else { ret = TestSetPageWriteback(page); @@ -2302,7 +2303,7 @@ int test_set_page_writeback(struct page *page) return ret; } -EXPORT_SYMBOL(test_set_page_writeback); +EXPORT_SYMBOL(__test_set_page_writeback); /* * Return true if any of the pages in the mapping are marked with the |
