aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2007-05-09 08:42:20 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-09 16:04:03 -0400
commitc855ff3718e5f667b463b20b9de516b4cd7625ad (patch)
tree5f5f2db132c80705db2254fc8f2f222160228aa5
parentaabded9c3aab5160ae2ca3dd1fa0fa37f3d510e4 (diff)
Fix a bad error case handling in read_cache_page_async()
Commit 6fe6900e1e5b6fa9e5c59aa5061f244fe3f467e2 introduced a nasty bug in read_cache_page_async(). It added a "mark_page_accessed(page)" at the final return path in read_cache_page_async(). But in error cases, 'page' holds the error code, and you can't mark it accessed. [ and Glauber de Oliveira Costa points out that we can use a return instead of adding more goto's ] Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/filemap.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index 9e56fd158fa3..7b48b2ad00e7 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1784,7 +1784,7 @@ struct page *read_cache_page_async(struct address_space *mapping,
1784retry: 1784retry:
1785 page = __read_cache_page(mapping, index, filler, data); 1785 page = __read_cache_page(mapping, index, filler, data);
1786 if (IS_ERR(page)) 1786 if (IS_ERR(page))
1787 goto out; 1787 return page;
1788 mark_page_accessed(page); 1788 mark_page_accessed(page);
1789 if (PageUptodate(page)) 1789 if (PageUptodate(page))
1790 goto out; 1790 goto out;
@@ -1802,9 +1802,9 @@ retry:
1802 err = filler(data, page); 1802 err = filler(data, page);
1803 if (err < 0) { 1803 if (err < 0) {
1804 page_cache_release(page); 1804 page_cache_release(page);
1805 page = ERR_PTR(err); 1805 return ERR_PTR(err);
1806 } 1806 }
1807 out: 1807out:
1808 mark_page_accessed(page); 1808 mark_page_accessed(page);
1809 return page; 1809 return page;
1810} 1810}