diff options
| -rw-r--r-- | fs/f2fs/checkpoint.c | 2 | ||||
| -rw-r--r-- | fs/f2fs/data.c | 33 | ||||
| -rw-r--r-- | fs/f2fs/f2fs.h | 1 | ||||
| -rw-r--r-- | fs/f2fs/node.c | 2 |
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 | */ | ||
| 1784 | void 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 | |||
| 1778 | static int f2fs_set_data_page_dirty(struct page *page) | 1809 | static 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); | |||
| 2077 | int do_write_data_page(struct f2fs_io_info *); | 2077 | int do_write_data_page(struct f2fs_io_info *); |
| 2078 | int f2fs_map_blocks(struct inode *, struct f2fs_map_blocks *, int, int); | 2078 | int f2fs_map_blocks(struct inode *, struct f2fs_map_blocks *, int, int); |
| 2079 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); | 2079 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); |
| 2080 | void f2fs_set_page_dirty_nobuffers(struct page *); | ||
| 2080 | void f2fs_invalidate_page(struct page *, unsigned int, unsigned int); | 2081 | void f2fs_invalidate_page(struct page *, unsigned int, unsigned int); |
| 2081 | int f2fs_release_page(struct page *, gfp_t); | 2082 | int 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); |
