mm: use swp_offset as key in shmem_replace_page()
commit c1cb20d43728aa9b5393bd8d489bc85c142949b2 upstream. We changed the key of swap cache tree from swp_entry_t.val to swp_offset. We need to do so in shmem_replace_page() as well. Hugh said: "shmem_replace_page() has been wrong since the day I wrote it: good enough to work on swap "type" 0, which is all most people ever use (especially those few who need shmem_replace_page() at all), but broken once there are any non-0 swp_type bits set in the higher order bits" Link: http://lkml.kernel.org/r/20181121215442.138545-1-yuzhao@google.com Fixes: f6ab1f7f6b2d ("mm, swap: use offset of swap entry as key of swap cache") Signed-off-by: Yu Zhao <yuzhao@google.com> Reviewed-by: Matthew Wilcox <willy@infradead.org> Acked-by: Hugh Dickins <hughd@google.com> Cc: <stable@vger.kernel.org> [4.9+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
397dbde614
commit
7c1ba1a1bb
@ -1532,11 +1532,13 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
|
||||
{
|
||||
struct page *oldpage, *newpage;
|
||||
struct address_space *swap_mapping;
|
||||
swp_entry_t entry;
|
||||
pgoff_t swap_index;
|
||||
int error;
|
||||
|
||||
oldpage = *pagep;
|
||||
swap_index = page_private(oldpage);
|
||||
entry.val = page_private(oldpage);
|
||||
swap_index = swp_offset(entry);
|
||||
swap_mapping = page_mapping(oldpage);
|
||||
|
||||
/*
|
||||
@ -1555,7 +1557,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
|
||||
__SetPageLocked(newpage);
|
||||
__SetPageSwapBacked(newpage);
|
||||
SetPageUptodate(newpage);
|
||||
set_page_private(newpage, swap_index);
|
||||
set_page_private(newpage, entry.val);
|
||||
SetPageSwapCache(newpage);
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user