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;