diff -purN -X /home/mbligh/.diff.exclude 555-aio-gang_lookup-fix/mm/page-writeback.c 560-aio-O_SYNC-short-write-fix/mm/page-writeback.c
--- 555-aio-gang_lookup-fix/mm/page-writeback.c	2004-02-28 11:21:53.000000000 -0800
+++ 560-aio-O_SYNC-short-write-fix/mm/page-writeback.c	2004-02-28 11:22:07.000000000 -0800
@@ -579,19 +579,19 @@ static ssize_t operate_on_page_range(str
 	pgoff_t next = first, curr = first;
 	struct pagevec pvec;
 	ssize_t ret = 0, bytes = 0;
-	int i;
+	int i, nr;
 
 	if (count == 0)
 		return 0;
 
 	pagevec_init(&pvec, 0);
-	while (pagevec_lookup(&pvec, mapping, &next,
-				min((pgoff_t)PAGEVEC_SIZE, last - next + 1))) {
+	while ((nr = pagevec_lookup(&pvec, mapping, &next,
+				min((pgoff_t)PAGEVEC_SIZE, last - next + 1)))) {
 		for (i = 0; i < pagevec_count(&pvec); i++) {
 			struct page *page = pvec.pages[i];
 
 			curr = page->index;
-			if ((curr > next) || !page->mapping) /* truncated ?*/ {
+			if (page->mapping != mapping) /* truncated ?*/ {
 				curr = next;
 				break;
 			} else {
@@ -601,16 +601,17 @@ static ssize_t operate_on_page_range(str
 				if (PageError(page)) {
 					if (!ret)
 						ret = -EIO;
-				}
+				} else
+					curr++;
 			}
-			curr++;
-			if (next > last)
-				break;
 		}
 		pagevec_release(&pvec);
-		if ((next > last) || (ret == -EIOCBRETRY))
+		if ((ret == -EIOCBRETRY) || (next > last))
 			break;
 	}
+	if (!nr)
+		curr = last + 1;
+
 	bytes = (curr << PAGE_CACHE_SHIFT) - pos;
 	if (bytes > count)
 		bytes = count;