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: 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>
This commit is contained in:
parent
07061aab2f
commit
32b635298f
43
mm/filemap.c
43
mm/filemap.c
|
@ -2303,7 +2303,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,
|
||||
|
@ -2325,31 +2325,19 @@ static struct page *__read_cache_page(struct address_space *mapping,
|
|||
/* 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);
|
||||
}
|
||||
|
||||
page = wait_on_page_read(page);
|
||||
if (IS_ERR(page))
|
||||
return page;
|
||||
goto out;
|
||||
}
|
||||
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;
|
||||
if (PageUptodate(page))
|
||||
goto out;
|
||||
|
||||
|
@ -2357,21 +2345,14 @@ static struct page *do_read_cache_page(struct address_space *mapping,
|
|||
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;
|
||||
|
|
Loading…
Reference in New Issue