]> git.kernelconcepts.de Git - karo-tx-linux.git/commit
Convert shmem_getpage_gfp(), the engine-room of shmem, to expect page or
authorHugh Dickins <hughd@google.com>
Tue, 26 Jul 2011 10:14:54 +0000 (20:14 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 27 Jul 2011 03:26:52 +0000 (13:26 +1000)
commite0ee0eead129eb623b0a0ddfa2a5b2bc882c6d2b
tree6b333676b5ef78b98812952608b7ccfc3853d8a1
parent95d21ae99679192b2dee070a2b1fc7fcc7446f0f
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: Hugh Dickins <hughd@google.com>
Acked-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/shmem.c