diff options
-rw-r--r-- | mm/truncate.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/mm/truncate.c b/mm/truncate.c index 8563339041f6..dd9ebc1da356 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -592,6 +592,16 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, | |||
592 | unlock_page(page); | 592 | unlock_page(page); |
593 | continue; | 593 | continue; |
594 | } | 594 | } |
595 | |||
596 | /* Take a pin outside pagevec */ | ||
597 | get_page(page); | ||
598 | |||
599 | /* | ||
600 | * Drop extra pins before trying to invalidate | ||
601 | * the huge page. | ||
602 | */ | ||
603 | pagevec_remove_exceptionals(&pvec); | ||
604 | pagevec_release(&pvec); | ||
595 | } | 605 | } |
596 | 606 | ||
597 | ret = invalidate_inode_page(page); | 607 | ret = invalidate_inode_page(page); |
@@ -602,6 +612,8 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, | |||
602 | */ | 612 | */ |
603 | if (!ret) | 613 | if (!ret) |
604 | deactivate_file_page(page); | 614 | deactivate_file_page(page); |
615 | if (PageTransHuge(page)) | ||
616 | put_page(page); | ||
605 | count += ret; | 617 | count += ret; |
606 | } | 618 | } |
607 | pagevec_remove_exceptionals(&pvec); | 619 | pagevec_remove_exceptionals(&pvec); |