diff options
Diffstat (limited to 'mm/memory-failure.c')
-rw-r--r-- | mm/memory-failure.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 4f08a2d61487..90002ea43638 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
@@ -945,8 +945,10 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
945 | * to it. Similarly, page lock is shifted. | 945 | * to it. Similarly, page lock is shifted. |
946 | */ | 946 | */ |
947 | if (hpage != p) { | 947 | if (hpage != p) { |
948 | put_page(hpage); | 948 | if (!(flags & MF_COUNT_INCREASED)) { |
949 | get_page(p); | 949 | put_page(hpage); |
950 | get_page(p); | ||
951 | } | ||
950 | lock_page(p); | 952 | lock_page(p); |
951 | unlock_page(hpage); | 953 | unlock_page(hpage); |
952 | *hpagep = p; | 954 | *hpagep = p; |
@@ -1649,7 +1651,7 @@ int soft_offline_page(struct page *page, int flags) | |||
1649 | { | 1651 | { |
1650 | int ret; | 1652 | int ret; |
1651 | unsigned long pfn = page_to_pfn(page); | 1653 | unsigned long pfn = page_to_pfn(page); |
1652 | struct page *hpage = compound_trans_head(page); | 1654 | struct page *hpage = compound_head(page); |
1653 | 1655 | ||
1654 | if (PageHWPoison(page)) { | 1656 | if (PageHWPoison(page)) { |
1655 | pr_info("soft offline: %#lx page already poisoned\n", pfn); | 1657 | pr_info("soft offline: %#lx page already poisoned\n", pfn); |