aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/checkpoint.c2
-rw-r--r--fs/f2fs/data.c33
-rw-r--r--fs/f2fs/f2fs.h1
-rw-r--r--fs/f2fs/node.c2
4 files changed, 35 insertions, 3 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index 2b43d4013e92..2755ef730a41 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -366,7 +366,7 @@ static int f2fs_set_meta_page_dirty(struct page *page)
366 366
367 SetPageUptodate(page); 367 SetPageUptodate(page);
368 if (!PageDirty(page)) { 368 if (!PageDirty(page)) {
369 __set_page_dirty_nobuffers(page); 369 f2fs_set_page_dirty_nobuffers(page);
370 inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_META); 370 inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_META);
371 SetPagePrivate(page); 371 SetPagePrivate(page);
372 f2fs_trace_pid(page); 372 f2fs_trace_pid(page);
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 3d93cf184114..4a2e97dad9e9 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -19,6 +19,8 @@
19#include <linux/bio.h> 19#include <linux/bio.h>
20#include <linux/prefetch.h> 20#include <linux/prefetch.h>
21#include <linux/uio.h> 21#include <linux/uio.h>
22#include <linux/mm.h>
23#include <linux/memcontrol.h>
22#include <linux/cleancache.h> 24#include <linux/cleancache.h>
23 25
24#include "f2fs.h" 26#include "f2fs.h"
@@ -1775,6 +1777,35 @@ int f2fs_release_page(struct page *page, gfp_t wait)
1775 return 1; 1777 return 1;
1776} 1778}
1777 1779
1780/*
1781 * This was copied from __set_page_dirty_buffers which gives higher performance
1782 * in very high speed storages. (e.g., pmem)
1783 */
1784void f2fs_set_page_dirty_nobuffers(struct page *page)
1785{
1786 struct address_space *mapping = page->mapping;
1787 unsigned long flags;
1788
1789 if (unlikely(!mapping))
1790 return;
1791
1792 spin_lock(&mapping->private_lock);
1793 lock_page_memcg(page);
1794 SetPageDirty(page);
1795 spin_unlock(&mapping->private_lock);
1796
1797 spin_lock_irqsave(&mapping->tree_lock, flags);
1798 WARN_ON_ONCE(!PageUptodate(page));
1799 account_page_dirtied(page, mapping);
1800 radix_tree_tag_set(&mapping->page_tree,
1801 page_index(page), PAGECACHE_TAG_DIRTY);
1802 spin_unlock_irqrestore(&mapping->tree_lock, flags);
1803 unlock_page_memcg(page);
1804
1805 __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
1806 return;
1807}
1808
1778static int f2fs_set_data_page_dirty(struct page *page) 1809static int f2fs_set_data_page_dirty(struct page *page)
1779{ 1810{
1780 struct address_space *mapping = page->mapping; 1811 struct address_space *mapping = page->mapping;
@@ -1797,7 +1828,7 @@ static int f2fs_set_data_page_dirty(struct page *page)
1797 } 1828 }
1798 1829
1799 if (!PageDirty(page)) { 1830 if (!PageDirty(page)) {
1800 __set_page_dirty_nobuffers(page); 1831 f2fs_set_page_dirty_nobuffers(page);
1801 update_dirty_page(inode, page); 1832 update_dirty_page(inode, page);
1802 return 1; 1833 return 1;
1803 } 1834 }
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 32884a7bdcc4..096f16d343a8 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2077,6 +2077,7 @@ struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool);
2077int do_write_data_page(struct f2fs_io_info *); 2077int do_write_data_page(struct f2fs_io_info *);
2078int f2fs_map_blocks(struct inode *, struct f2fs_map_blocks *, int, int); 2078int f2fs_map_blocks(struct inode *, struct f2fs_map_blocks *, int, int);
2079int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); 2079int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64);
2080void f2fs_set_page_dirty_nobuffers(struct page *);
2080void f2fs_invalidate_page(struct page *, unsigned int, unsigned int); 2081void f2fs_invalidate_page(struct page *, unsigned int, unsigned int);
2081int f2fs_release_page(struct page *, gfp_t); 2082int f2fs_release_page(struct page *, gfp_t);
2082 2083
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 69171ce9b4b1..db73f3c823dc 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1646,7 +1646,7 @@ static int f2fs_set_node_page_dirty(struct page *page)
1646 1646
1647 SetPageUptodate(page); 1647 SetPageUptodate(page);
1648 if (!PageDirty(page)) { 1648 if (!PageDirty(page)) {
1649 __set_page_dirty_nobuffers(page); 1649 f2fs_set_page_dirty_nobuffers(page);
1650 inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES); 1650 inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
1651 SetPagePrivate(page); 1651 SetPagePrivate(page);
1652 f2fs_trace_pid(page); 1652 f2fs_trace_pid(page);