diff options
author | Jan Kara <jack@suse.cz> | 2017-11-15 20:37:15 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-15 21:21:06 -0500 |
commit | 9f4e41f4717832e34cca153ced62b4a1d7e26c0e (patch) | |
tree | 7ae9a21d93fd73e10be9a2a23ef9ac91cea2055d /mm/truncate.c | |
parent | 736304f3245f39392895ff3392e1325d3e49e7d2 (diff) |
mm: refactor truncate_complete_page()
Move call of delete_from_page_cache() and page->mapping check out of
truncate_complete_page() into the single caller - truncate_inode_page().
Also move page_mapped() check into truncate_complete_page(). That way
it will be easier to batch operations.
Also rename truncate_complete_page() to truncate_cleanup_page().
Link: http://lkml.kernel.org/r/20171010151937.26984-3-jack@suse.cz
Signed-off-by: Jan Kara <jack@suse.cz>
Acked-by: Mel Gorman <mgorman@suse.de>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Cc: Dave Chinner <david@fromorbit.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/truncate.c')
-rw-r--r-- | mm/truncate.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/mm/truncate.c b/mm/truncate.c index 2330223841fb..383a530d511e 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -134,11 +134,17 @@ void do_invalidatepage(struct page *page, unsigned int offset, | |||
134 | * its lock, b) when a concurrent invalidate_mapping_pages got there first and | 134 | * its lock, b) when a concurrent invalidate_mapping_pages got there first and |
135 | * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space. | 135 | * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space. |
136 | */ | 136 | */ |
137 | static int | 137 | static void |
138 | truncate_complete_page(struct address_space *mapping, struct page *page) | 138 | truncate_cleanup_page(struct address_space *mapping, struct page *page) |
139 | { | 139 | { |
140 | if (page->mapping != mapping) | 140 | if (page_mapped(page)) { |
141 | return -EIO; | 141 | loff_t holelen; |
142 | |||
143 | holelen = PageTransHuge(page) ? HPAGE_PMD_SIZE : PAGE_SIZE; | ||
144 | unmap_mapping_range(mapping, | ||
145 | (loff_t)page->index << PAGE_SHIFT, | ||
146 | holelen, 0); | ||
147 | } | ||
142 | 148 | ||
143 | if (page_has_private(page)) | 149 | if (page_has_private(page)) |
144 | do_invalidatepage(page, 0, PAGE_SIZE); | 150 | do_invalidatepage(page, 0, PAGE_SIZE); |
@@ -150,8 +156,6 @@ truncate_complete_page(struct address_space *mapping, struct page *page) | |||
150 | */ | 156 | */ |
151 | cancel_dirty_page(page); | 157 | cancel_dirty_page(page); |
152 | ClearPageMappedToDisk(page); | 158 | ClearPageMappedToDisk(page); |
153 | delete_from_page_cache(page); | ||
154 | return 0; | ||
155 | } | 159 | } |
156 | 160 | ||
157 | /* | 161 | /* |
@@ -180,16 +184,14 @@ invalidate_complete_page(struct address_space *mapping, struct page *page) | |||
180 | 184 | ||
181 | int truncate_inode_page(struct address_space *mapping, struct page *page) | 185 | int truncate_inode_page(struct address_space *mapping, struct page *page) |
182 | { | 186 | { |
183 | loff_t holelen; | ||
184 | VM_BUG_ON_PAGE(PageTail(page), page); | 187 | VM_BUG_ON_PAGE(PageTail(page), page); |
185 | 188 | ||
186 | holelen = PageTransHuge(page) ? HPAGE_PMD_SIZE : PAGE_SIZE; | 189 | if (page->mapping != mapping) |
187 | if (page_mapped(page)) { | 190 | return -EIO; |
188 | unmap_mapping_range(mapping, | 191 | |
189 | (loff_t)page->index << PAGE_SHIFT, | 192 | truncate_cleanup_page(mapping, page); |
190 | holelen, 0); | 193 | delete_from_page_cache(page); |
191 | } | 194 | return 0; |
192 | return truncate_complete_page(mapping, page); | ||
193 | } | 195 | } |
194 | 196 | ||
195 | /* | 197 | /* |