mm/truncate.c: fix THP handling in invalidate_mapping_pages()
[sfrench/cifs-2.6.git] / mm / truncate.c
index 6479ed2afc53fb9dd8d9719051ea77e7a5b200af..2330223841fbbdf40c4e50764a11a557d9c7b426 100644 (file)
@@ -530,9 +530,15 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
                        } else if (PageTransHuge(page)) {
                                index += 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;
+                               }
                        }
 
                        ret = invalidate_inode_page(page);