diff options
-rw-r--r-- | mm/filemap.c | 48 |
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); |
495 | out: | 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; | ||
492 | err_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 | } |
498 | EXPORT_SYMBOL(add_to_page_cache_locked); | 500 | EXPORT_SYMBOL(add_to_page_cache_locked); |