• Miaohe Lin's avatar
    mm/shmem: fix infinite loop when swap in shmem error at swapoff time · 6cec2b95
    Miaohe Lin authored
    When swap in shmem error at swapoff time, there would be a infinite loop
    in the while loop in shmem_unuse_inode().  It's because swapin error is
    deliberately ignored now and thus info->swapped will never reach 0.  So we
    can't escape the loop in shmem_unuse().
    
    In order to fix the issue, swapin_error entry is stored in the mapping
    when swapin error occurs.  So the swapcache page can be freed and the user
    won't end up with a permanently mounted swap because a sector is bad.  If
    the page is accessed later, the user process will be killed so that
    corrupted data is never consumed.  On the other hand, if the page is never
    accessed, the user won't even notice it.
    
    Link: https://lkml.kernel.org/r/20220519125030.21486-5-linmiaohe@huawei.comSigned-off-by: default avatarMiaohe Lin <linmiaohe@huawei.com>
    Reported-by: default avatarNaoya Horiguchi <naoya.horiguchi@nec.com>
    Reviewed-by: default avatarNaoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: NeilBrown <neilb@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    6cec2b95
shmem.c 109 KB