diff options
Diffstat (limited to 'mm/truncate.c')
-rw-r--r-- | mm/truncate.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/mm/truncate.c b/mm/truncate.c index 6479ed2afc53..2330223841fb 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -530,9 +530,15 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, | |||
530 | } else if (PageTransHuge(page)) { | 530 | } else if (PageTransHuge(page)) { |
531 | index += HPAGE_PMD_NR - 1; | 531 | index += HPAGE_PMD_NR - 1; |
532 | i += HPAGE_PMD_NR - 1; | 532 | i += HPAGE_PMD_NR - 1; |
533 | /* 'end' is in the middle of THP */ | 533 | /* |
534 | if (index == round_down(end, HPAGE_PMD_NR)) | 534 | * 'end' is in the middle of THP. Don't |
535 | * invalidate the page as the part outside of | ||
536 | * 'end' could be still useful. | ||
537 | */ | ||
538 | if (index > end) { | ||
539 | unlock_page(page); | ||
535 | continue; | 540 | continue; |
541 | } | ||
536 | } | 542 | } |
537 | 543 | ||
538 | ret = invalidate_inode_page(page); | 544 | ret = invalidate_inode_page(page); |