diff options
author | Mel Gorman <mgorman@techsingularity.net> | 2016-03-15 14:55:36 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-05-26 08:48:54 +0200 |
commit | 9c9a6bbaf85bef862609f98809853ab1a1c69c98 (patch) | |
tree | 493dc449d89ba499aa03ce9422c095d6a8b80180 | |
parent | 106253c4c9bca7880000d44aa2248b1ca2071c92 (diff) | |
download | linux-stable-9c9a6bbaf85bef862609f98809853ab1a1c69c98.tar.gz linux-stable-9c9a6bbaf85bef862609f98809853ab1a1c69c98.tar.bz2 linux-stable-9c9a6bbaf85bef862609f98809853ab1a1c69c98.zip |
mm: filemap: remove redundant code in do_read_cache_page
commit 32b635298ff4e991d8d8f64dc23782b02eec29c3 upstream.
do_read_cache_page and __read_cache_page duplicate page filler code when
filling the page for the first time. This patch simply removes the
duplicate logic.
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | mm/filemap.c | 43 |
1 files changed, 12 insertions, 31 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index b15f1d8bba43..87795b433008 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2215,7 +2215,7 @@ static struct page *wait_on_page_read(struct page *page) return page; } -static struct page *__read_cache_page(struct address_space *mapping, +static struct page *do_read_cache_page(struct address_space *mapping, pgoff_t index, int (*filler)(void *, struct page *), void *data, @@ -2237,31 +2237,19 @@ repeat: /* Presumably ENOMEM for radix tree node */ return ERR_PTR(err); } + +filler: err = filler(data, page); if (err < 0) { page_cache_release(page); - page = ERR_PTR(err); - } else { - page = wait_on_page_read(page); + return ERR_PTR(err); } - } - return page; -} - -static struct page *do_read_cache_page(struct address_space *mapping, - pgoff_t index, - int (*filler)(void *, struct page *), - void *data, - gfp_t gfp) - -{ - struct page *page; - int err; -retry: - page = __read_cache_page(mapping, index, filler, data, gfp); - if (IS_ERR(page)) - return page; + page = wait_on_page_read(page); + if (IS_ERR(page)) + return page; + goto out; + } if (PageUptodate(page)) goto out; @@ -2269,21 +2257,14 @@ retry: if (!page->mapping) { unlock_page(page); page_cache_release(page); - goto retry; + goto repeat; } if (PageUptodate(page)) { unlock_page(page); goto out; } - err = filler(data, page); - if (err < 0) { - page_cache_release(page); - return ERR_PTR(err); - } else { - page = wait_on_page_read(page); - if (IS_ERR(page)) - return page; - } + goto filler; + out: mark_page_accessed(page); return page; |