diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ce63d603820f..d02d6436add0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -466,6 +466,7 @@ void prep_compound_page(struct page *page, unsigned int order) | |||
466 | for (i = 1; i < nr_pages; i++) { | 466 | for (i = 1; i < nr_pages; i++) { |
467 | struct page *p = page + i; | 467 | struct page *p = page + i; |
468 | set_page_count(p, 0); | 468 | set_page_count(p, 0); |
469 | p->mapping = TAIL_MAPPING; | ||
469 | set_compound_head(p, page); | 470 | set_compound_head(p, page); |
470 | } | 471 | } |
471 | } | 472 | } |
@@ -856,6 +857,10 @@ static int free_tail_pages_check(struct page *head_page, struct page *page) | |||
856 | ret = 0; | 857 | ret = 0; |
857 | goto out; | 858 | goto out; |
858 | } | 859 | } |
860 | if (page->mapping != TAIL_MAPPING) { | ||
861 | bad_page(page, "corrupted mapping in tail page", 0); | ||
862 | goto out; | ||
863 | } | ||
859 | if (unlikely(!PageTail(page))) { | 864 | if (unlikely(!PageTail(page))) { |
860 | bad_page(page, "PageTail not set", 0); | 865 | bad_page(page, "PageTail not set", 0); |
861 | goto out; | 866 | goto out; |
@@ -866,6 +871,7 @@ static int free_tail_pages_check(struct page *head_page, struct page *page) | |||
866 | } | 871 | } |
867 | ret = 0; | 872 | ret = 0; |
868 | out: | 873 | out: |
874 | page->mapping = NULL; | ||
869 | clear_compound_head(page); | 875 | clear_compound_head(page); |
870 | return ret; | 876 | return ret; |
871 | } | 877 | } |