• Hugh Dickins's avatar
    tmpfs: allocate on read when stacked · a0ee5ec5
    Hugh Dickins authored
    tmpfs is expected to limit the memory used (unless mounted with nr_blocks=0 or
    size=0).  But if a stacked filesystem such as unionfs gets pages from a sparse
    tmpfs file by reading holes, and then writes to them, it can easily exceed any
    such limit at present.
    
    So suppress the SGP_READ "don't allocate page" ZERO_PAGE optimization when
    reading for the kernel (a KERNEL_DS check, ugh, sorry about that).  Indeed,
    pessimistically mark such pages as dirty, so they cannot get reclaimed and
    unaccounted by mistake.  The venerable shmem_recalc_inode code (originally to
    account for the reclaim of clean pages) suffices to get the accounting right
    when swappages are dropped in favour of more uptodate filepages.
    
    This also fixes the NULL shmem_swp_entry BUG or oops in shmem_writepage,
    caused by unionfs writing to a very sparse tmpfs file: to minimize memory
    allocation in swapout, tmpfs requires the swap vector be allocated upfront,
    which wasn't always happening in this stacked case.
    Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a0ee5ec5
shmem.c 63.5 KB