|
|
@@ -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 @@ 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;
|
|
|
|
|
|
@@ -2357,21 +2345,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;
|