|
@@ -530,9 +530,15 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
|
|
} else if (PageTransHuge(page)) {
|
|
} else if (PageTransHuge(page)) {
|
|
index += HPAGE_PMD_NR - 1;
|
|
index += HPAGE_PMD_NR - 1;
|
|
i += HPAGE_PMD_NR - 1;
|
|
i += HPAGE_PMD_NR - 1;
|
|
- /* 'end' is in the middle of THP */
|
|
|
|
- if (index == round_down(end, HPAGE_PMD_NR))
|
|
|
|
|
|
+ /*
|
|
|
|
+ * 'end' is in the middle of THP. Don't
|
|
|
|
+ * invalidate the page as the part outside of
|
|
|
|
+ * 'end' could be still useful.
|
|
|
|
+ */
|
|
|
|
+ if (index > end) {
|
|
|
|
+ unlock_page(page);
|
|
continue;
|
|
continue;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
ret = invalidate_inode_page(page);
|
|
ret = invalidate_inode_page(page);
|