• Hugh Dickins's avatar
    [PATCH] holepunch: fix disconnected pages after second truncate · 16a10019
    Hugh Dickins authored
    shmem_truncate_range has its own truncate_inode_pages_range, to free any pages
    racily instantiated while it was in progress: a SHMEM_PAGEIN flag is set when
    this might have happened.  But holepunching gets no chance to clear that flag
    at the start of vmtruncate_range, so it's always set (unless a truncate came
    just before), so holepunch almost always does this second
    truncate_inode_pages_range.
    
    shmem holepunch has unlikely swap<->file races hereabouts whatever we do
    (without a fuller rework than is fit for this release): I was going to skip
    the second truncate in the punch_hole case, but Miklos points out that would
    make holepunch correctness more vulnerable to swapoff.  So keep the second
    truncate, but follow it by an unmap_mapping_range to eliminate the
    disconnected pages (freed from pagecache while still mapped in userspace) that
    it might have left behind.
    Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
    Cc: Miklos Szeredi <mszeredi@suse.cz>
    Cc: Badari Pulavarty <pbadari@us.ibm.com>
    Cc: Nick Piggin <npiggin@suse.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    16a10019
shmem.c 65.5 KB