mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
mm: fix false-positive WARN_ON() in truncate/invalidate for hugetlb
Hugetlb pages have ->index in size of the huge pages (PMD_SIZE or
PUD_SIZE), not in PAGE_SIZE as other types of pages. This means we
cannot user page_to_pgoff() to check whether we've got the right page
for the radix-tree index.
Let's introduce page_to_index() which would return radix-tree index for
given page.
We will be able to get rid of this once hugetlb will be switched to
multi-order entries.
Fixes: fc127da085 ("truncate: handle file thp")
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Kirill A. Shutemov <[email protected]>
Reported-by: Doug Nelson <[email protected]>
Tested-by: Doug Nelson <[email protected]>
Reviewed-by: Naoya Horiguchi <[email protected]>
Cc: <[email protected]> [4.8+]
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
828347f8f9
commit
5cbc198ae0
2 changed files with 19 additions and 10 deletions
|
|
@ -283,7 +283,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
|
|||
|
||||
if (!trylock_page(page))
|
||||
continue;
|
||||
WARN_ON(page_to_pgoff(page) != index);
|
||||
WARN_ON(page_to_index(page) != index);
|
||||
if (PageWriteback(page)) {
|
||||
unlock_page(page);
|
||||
continue;
|
||||
|
|
@ -371,7 +371,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
|
|||
}
|
||||
|
||||
lock_page(page);
|
||||
WARN_ON(page_to_pgoff(page) != index);
|
||||
WARN_ON(page_to_index(page) != index);
|
||||
wait_on_page_writeback(page);
|
||||
truncate_inode_page(mapping, page);
|
||||
unlock_page(page);
|
||||
|
|
@ -492,7 +492,7 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
|
|||
if (!trylock_page(page))
|
||||
continue;
|
||||
|
||||
WARN_ON(page_to_pgoff(page) != index);
|
||||
WARN_ON(page_to_index(page) != index);
|
||||
|
||||
/* Middle of THP: skip */
|
||||
if (PageTransTail(page)) {
|
||||
|
|
@ -612,7 +612,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
|
|||
}
|
||||
|
||||
lock_page(page);
|
||||
WARN_ON(page_to_pgoff(page) != index);
|
||||
WARN_ON(page_to_index(page) != index);
|
||||
if (page->mapping != mapping) {
|
||||
unlock_page(page);
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Reference in a new issue