Commit 9f4e41f4 authored by Jan Kara's avatar Jan Kara Committed by Linus Torvalds

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/[email protected]Signed-off-by: default avatarJan Kara <[email protected]>
Acked-by: default avatarMel Gorman <[email protected]>
Reviewed-by: default avatarAndi Kleen <[email protected]>
Cc: Dave Chinner <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: "Kirill A. Shutemov" <[email protected]>
Signed-off-by: default avatarAndrew Morton <[email protected]>
Signed-off-by: default avatarLinus Torvalds <[email protected]>
parent 736304f3
...@@ -134,11 +134,17 @@ void do_invalidatepage(struct page *page, unsigned int offset, ...@@ -134,11 +134,17 @@ void do_invalidatepage(struct page *page, unsigned int offset,
* its lock, b) when a concurrent invalidate_mapping_pages got there first and * its lock, b) when a concurrent invalidate_mapping_pages got there first and
* c) when tmpfs swizzles a page between a tmpfs inode and swapper_space. * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space.
*/ */
static int static void
truncate_complete_page(struct address_space *mapping, struct page *page) truncate_cleanup_page(struct address_space *mapping, struct page *page)
{ {
if (page->mapping != mapping) if (page_mapped(page)) {
return -EIO; loff_t holelen;
holelen = PageTransHuge(page) ? HPAGE_PMD_SIZE : PAGE_SIZE;
unmap_mapping_range(mapping,
(loff_t)page->index << PAGE_SHIFT,
holelen, 0);
}
if (page_has_private(page)) if (page_has_private(page))
do_invalidatepage(page, 0, PAGE_SIZE); do_invalidatepage(page, 0, PAGE_SIZE);
...@@ -150,8 +156,6 @@ truncate_complete_page(struct address_space *mapping, struct page *page) ...@@ -150,8 +156,6 @@ truncate_complete_page(struct address_space *mapping, struct page *page)
*/ */
cancel_dirty_page(page); cancel_dirty_page(page);
ClearPageMappedToDisk(page); ClearPageMappedToDisk(page);
delete_from_page_cache(page);
return 0;
} }
/* /*
...@@ -180,16 +184,14 @@ invalidate_complete_page(struct address_space *mapping, struct page *page) ...@@ -180,16 +184,14 @@ invalidate_complete_page(struct address_space *mapping, struct page *page)
int truncate_inode_page(struct address_space *mapping, struct page *page) int truncate_inode_page(struct address_space *mapping, struct page *page)
{ {
loff_t holelen;
VM_BUG_ON_PAGE(PageTail(page), page); VM_BUG_ON_PAGE(PageTail(page), page);
holelen = PageTransHuge(page) ? HPAGE_PMD_SIZE : PAGE_SIZE; if (page->mapping != mapping)
if (page_mapped(page)) { return -EIO;
unmap_mapping_range(mapping,
(loff_t)page->index << PAGE_SHIFT, truncate_cleanup_page(mapping, page);
holelen, 0); delete_from_page_cache(page);
} return 0;
return truncate_complete_page(mapping, page);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment