lkml.org 
[lkml]   [2018]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 40/50] mm: use swp_offset as key in shmem_replace_page()
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Yu Zhao <yuzhao@google.com>

    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>

    ---
    mm/shmem.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/mm/shmem.c
    +++ b/mm/shmem.c
    @@ -1494,11 +1494,13 @@ static int shmem_replace_page(struct pag
    {
    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);

    /*
    @@ -1517,7 +1519,7 @@ static int shmem_replace_page(struct pag
    __SetPageLocked(newpage);
    __SetPageSwapBacked(newpage);
    SetPageUptodate(newpage);
    - set_page_private(newpage, swap_index);
    + set_page_private(newpage, entry.val);
    SetPageSwapCache(newpage);

    /*

    \
     
     \ /
      Last update: 2018-12-04 12:11    [W:4.092 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site