aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>2013-09-12 18:13:59 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-12 18:38:03 -0400
commit66a0c8ee3dce78362d59f00a8efbd752fbeddfb1 (patch)
tree52dda5e13fb36c0c48c1ab922563d8450e4b20dc /mm
parent3cd14fcd3f128d5eba8575491cb4e1999ee1bad2 (diff)
mm: cleanup add_to_page_cache_locked()
Make add_to_page_cache_locked() cleaner: - unindent most code of the function by inverting one condition; - streamline code no-error path; - move insert error path outside normal code path; - call radix_tree_preload_end() earlier; No functional changes. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Hugh Dickins <hughd@google.com> Cc: Wu Fengguang <fengguang.wu@intel.com> Cc: Jan Kara <jack@suse.cz> Cc: Mel Gorman <mgorman@suse.de> Cc: Andi Kleen <ak@linux.intel.com> Cc: Matthew Wilcox <willy@linux.intel.com> Cc: Hillf Danton <dhillf@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/filemap.c48
1 files changed, 25 insertions, 23 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index e3b6fc8c0b7b..1e6aec4a2d2e 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -467,32 +467,34 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
467 error = mem_cgroup_cache_charge(page, current->mm, 467 error = mem_cgroup_cache_charge(page, current->mm,
468 gfp_mask & GFP_RECLAIM_MASK); 468 gfp_mask & GFP_RECLAIM_MASK);
469 if (error) 469 if (error)
470 goto out; 470 return error;
471 471
472 error = radix_tree_maybe_preload(gfp_mask & ~__GFP_HIGHMEM); 472 error = radix_tree_maybe_preload(gfp_mask & ~__GFP_HIGHMEM);
473 if (error == 0) { 473 if (error) {
474 page_cache_get(page);
475 page->mapping = mapping;
476 page->index = offset;
477
478 spin_lock_irq(&mapping->tree_lock);
479 error = radix_tree_insert(&mapping->page_tree, offset, page);
480 if (likely(!error)) {
481 mapping->nrpages++;
482 __inc_zone_page_state(page, NR_FILE_PAGES);
483 spin_unlock_irq(&mapping->tree_lock);
484 trace_mm_filemap_add_to_page_cache(page);
485 } else {
486 page->mapping = NULL;
487 /* Leave page->index set: truncation relies upon it */
488 spin_unlock_irq(&mapping->tree_lock);
489 mem_cgroup_uncharge_cache_page(page);
490 page_cache_release(page);
491 }
492 radix_tree_preload_end();
493 } else
494 mem_cgroup_uncharge_cache_page(page); 474 mem_cgroup_uncharge_cache_page(page);
495out: 475 return error;
476 }
477
478 page_cache_get(page);
479 page->mapping = mapping;
480 page->index = offset;
481
482 spin_lock_irq(&mapping->tree_lock);
483 error = radix_tree_insert(&mapping->page_tree, offset, page);
484 radix_tree_preload_end();
485 if (unlikely(error))
486 goto err_insert;
487 mapping->nrpages++;
488 __inc_zone_page_state(page, NR_FILE_PAGES);
489 spin_unlock_irq(&mapping->tree_lock);
490 trace_mm_filemap_add_to_page_cache(page);
491 return 0;
492err_insert:
493 page->mapping = NULL;
494 /* Leave page->index set: truncation relies upon it */
495 spin_unlock_irq(&mapping->tree_lock);
496 mem_cgroup_uncharge_cache_page(page);
497 page_cache_release(page);
496 return error; 498 return error;
497} 499}
498EXPORT_SYMBOL(add_to_page_cache_locked); 500EXPORT_SYMBOL(add_to_page_cache_locked);