diff options
| -rw-r--r-- | mm/swap.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/mm/swap.c b/mm/swap.c index 10e6d4a3683b..1d9eba6744e8 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -81,15 +81,18 @@ void __page_cache_release(struct page *page) unsigned long flags; spin_lock_irqsave(&_pagemap_lru_lock, flags); - if (!TestClearPageLRU(page)) - BUG(); - if (PageActive(page)) - del_page_from_active_list(page); - else - del_page_from_inactive_list(page); + if (TestClearPageLRU(page)) { + if (PageActive(page)) + del_page_from_active_list(page); + else + del_page_from_inactive_list(page); + } + if (page_count(page) != 0) + page = NULL; spin_unlock_irqrestore(&_pagemap_lru_lock, flags); } - __free_pages_ok(page, 0); + if (page) + __free_pages_ok(page, 0); } /* |
