• Hugh Dickins's avatar
    holepunch: fix disconnected pages after second truncate · 42988ea6
    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>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    42988ea6
shmem.c 65.4 KB