Commit 32b63529 authored by Mel Gorman's avatar Mel Gorman Committed by Linus Torvalds

mm: filemap: remove redundant code in do_read_cache_page

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: default avatarMel Gorman <mgorman@techsingularity.net>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 07061aab
...@@ -2303,7 +2303,7 @@ static struct page *wait_on_page_read(struct page *page) ...@@ -2303,7 +2303,7 @@ static struct page *wait_on_page_read(struct page *page)
return 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, pgoff_t index,
int (*filler)(void *, struct page *), int (*filler)(void *, struct page *),
void *data, void *data,
...@@ -2325,31 +2325,19 @@ static struct page *__read_cache_page(struct address_space *mapping, ...@@ -2325,31 +2325,19 @@ static struct page *__read_cache_page(struct address_space *mapping,
/* Presumably ENOMEM for radix tree node */ /* Presumably ENOMEM for radix tree node */
return ERR_PTR(err); return ERR_PTR(err);
} }
filler:
err = filler(data, page); err = filler(data, page);
if (err < 0) { if (err < 0) {
page_cache_release(page); page_cache_release(page);
page = ERR_PTR(err); return ERR_PTR(err);
} else {
page = wait_on_page_read(page);
} }
}
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 = wait_on_page_read(page);
page = __read_cache_page(mapping, index, filler, data, gfp); if (IS_ERR(page))
if (IS_ERR(page)) return page;
return page; goto out;
}
if (PageUptodate(page)) if (PageUptodate(page))
goto out; goto out;
...@@ -2357,21 +2345,14 @@ static struct page *do_read_cache_page(struct address_space *mapping, ...@@ -2357,21 +2345,14 @@ static struct page *do_read_cache_page(struct address_space *mapping,
if (!page->mapping) { if (!page->mapping) {
unlock_page(page); unlock_page(page);
page_cache_release(page); page_cache_release(page);
goto retry; goto repeat;
} }
if (PageUptodate(page)) { if (PageUptodate(page)) {
unlock_page(page); unlock_page(page);
goto out; goto out;
} }
err = filler(data, page); goto filler;
if (err < 0) {
page_cache_release(page);
return ERR_PTR(err);
} else {
page = wait_on_page_read(page);
if (IS_ERR(page))
return page;
}
out: out:
mark_page_accessed(page); mark_page_accessed(page);
return page; return page;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment