mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 21:35:07 +00:00
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;
|
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 @@ repeat:
|
|||||||
/* 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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))
|
if (PageUptodate(page))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -2357,21 +2345,14 @@ retry:
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user