summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <JBeulich@novell.com>2011-07-21 15:02:43 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2011-08-03 12:42:50 -0700
commit95df2d8860b2fd0759722fe691c244f0769829c6 (patch)
treeffbac0b010d48bbf6ae6d93a905ab34a6a2245dc
parent2cdac5f07180d5536b7f695685dd2bc49bc79e23 (diff)
downloadlinux-stable-95df2d8860b2fd0759722fe691c244f0769829c6.tar.gz
linux-stable-95df2d8860b2fd0759722fe691c244f0769829c6.tar.bz2
linux-stable-95df2d8860b2fd0759722fe691c244f0769829c6.zip
FS-Cache: Fix __fscache_uncache_all_inode_pages()'s outer loop
commit b307d4655a71749ac3f91c6dbe33d28cc026ceeb upstream. The compiler, at least for ix86 and m68k, validly warns that the comparison: next <= (loff_t)-1 is always true (and it's always true also for x86-64 and probably all other arches - as long as pgoff_t isn't wider than loff_t). The intention appears to be to avoid wrapping of "next", so rather than eliminating the pointless comparison, fix the loop to indeed get exited when "next" would otherwise wrap. On m68k the following warning is observed: fs/fscache/page.c: In function '__fscache_uncache_all_inode_pages': fs/fscache/page.c:979: warning: comparison is always false due to limited range of data type Reported-by: Geert Uytterhoeven <geert@linux-m68k.org> Reported-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: David Howells <dhowells@redhat.com> Cc: Suresh Jayaraman <sjayaraman@suse.de> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--fs/fscache/page.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/fs/fscache/page.c b/fs/fscache/page.c
index 52b59e2a4af6..fd03b0e427f9 100644
--- a/fs/fscache/page.c
+++ b/fs/fscache/page.c
@@ -989,16 +989,12 @@ void __fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
pagevec_init(&pvec, 0);
next = 0;
- while (next <= (loff_t)-1 &&
- pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)
- ) {
+ do {
+ if (!pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE))
+ break;
for (i = 0; i < pagevec_count(&pvec); i++) {
struct page *page = pvec.pages[i];
- pgoff_t page_index = page->index;
-
- ASSERTCMP(page_index, >=, next);
- next = page_index + 1;
-
+ next = page->index;
if (PageFsCache(page)) {
__fscache_wait_on_page_write(cookie, page);
__fscache_uncache_page(cookie, page);
@@ -1006,7 +1002,7 @@ void __fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
}
pagevec_release(&pvec);
cond_resched();
- }
+ } while (++next);
_leave("");
}