• Hugh Dickins's avatar
    tmpfs: convert shmem_getpage_gfp to radix-swap · 54af6042
    Hugh Dickins authored
    Convert shmem_getpage_gfp(), the engine-room of shmem, to expect page or
    swap entry returned from radix tree by find_lock_page().
    Whereas the repetitive old method proceeded mainly under info->lock,
    dropping and repeating whenever one of the conditions needed was not
    met, now we can proceed without it, leaving shmem_add_to_page_cache() to
    check for a race.
    This way there is no need to preallocate a page, no need for an early
    radix_tree_preload(), no need for mem_cgroup_shmem_charge_fallback().
    Move the error unwinding down to the bottom instead of repeating it
    throughout.  ENOSPC handling is a little different from before: there is
    no longer any race between find_lock_page() and finding swap, but we can
    arrive at ENOSPC before calling shmem_recalc_inode(), which might
    occasionally discover freed space.
    Be stricter to check i_size before returning.  info->lock is used for
    little but alloced, swapped, i_blocks updates.  Move i_blocks updates
    out from under the max_blocks check, so even an unlimited size=0 mount
    can show accurate du.
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Acked-by: default avatarRik van Riel <riel@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
shmem.c 66.2 KB