<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Suparna Bhattacharya &lt;suparna@in.ibm.com&gt;

Might fix a BUG which was seen in testing.


 fs/aio.c            |   13 ++++++-------
 mm/page-writeback.c |   16 +++++++++-------
 2 files changed, 15 insertions(+), 14 deletions(-)

diff -puN fs/aio.c~aio-10-BUG-fix fs/aio.c
--- 25/fs/aio.c~aio-10-BUG-fix	2003-08-30 15:42:29.000000000 -0700
+++ 25-akpm/fs/aio.c	2003-08-30 15:42:29.000000000 -0700
@@ -1287,18 +1287,17 @@ retry_osync:
 		ssize_t err;
 
 		err = sync_page_range(inode, mapping, iocb-&gt;ki_pos, ret);
-		if (err &lt; 0)
+		if (err &lt;= 0) {
 			ret = err;
-		else {
-			printk("synced %d bytes\n", err);
+		} else {
+			BUG_ON(err &gt; iocb-&gt;ki_left);
 			iocb-&gt;ki_pos += err;
 			iocb-&gt;ki_left -= err;
-			if ((iocb-&gt;ki_left) &amp;&amp; (err != 0))
-				ret = -EIOCBRETRY;
-			else
-				ret = iocb-&gt;ki_nbytes;
+			ret = -EIOCBRETRY;
 		}
 	}
+	if (ret == 0)
+		ret = iocb-&gt;ki_nbytes - iocb-&gt;ki_left;
 	return ret;
 }
 
diff -puN mm/page-writeback.c~aio-10-BUG-fix mm/page-writeback.c
--- 25/mm/page-writeback.c~aio-10-BUG-fix	2003-08-30 15:42:29.000000000 -0700
+++ 25-akpm/mm/page-writeback.c	2003-08-30 15:42:29.000000000 -0700
@@ -583,9 +583,12 @@ static ssize_t operate_on_page_range(str
 	pgoff_t last = (pos + count - 1) &gt;&gt; PAGE_CACHE_SHIFT;	/* inclusive */
 	pgoff_t next = first;
 	struct pagevec pvec;
-	ssize_t ret = 0;
+	ssize_t ret = 0, bytes = 0;
 	int i;
 
+	if (count == 0)
+		return 0;
+
 	pagevec_init(&amp;pvec, 0);
 	while (pagevec_lookup(&amp;pvec, mapping, next,
 				min((pgoff_t)PAGEVEC_SIZE, last - next + 1))) {
@@ -600,10 +603,8 @@ static ssize_t operate_on_page_range(str
 			}
 			next = page-&gt;index + 1;
 			ret = (*operator)(page);
-			if (ret == -EIOCBRETRY) {
-				next--;
+			if (ret == -EIOCBRETRY)
 				break;
-			}
 			if (PageError(page)) {
 				if (!ret)
 					ret = -EIO;
@@ -615,9 +616,10 @@ static ssize_t operate_on_page_range(str
 		if ((next &gt; last) || (ret == -EIOCBRETRY))
 			break;
 	}
-	if (!ret || (ret == -EIOCBRETRY))
-		ret = (next &lt;&lt; PAGE_CACHE_SHIFT) - pos;
-	return ret;
+	bytes = (next &lt;&lt; PAGE_CACHE_SHIFT) - pos;
+	if (bytes &gt; count)
+		bytes = count;
+	return (bytes &amp;&amp; (!ret || (ret == -EIOCBRETRY))) ? bytes : ret;
 }
 
 static int page_waiter(struct page *page)

_
</pre></body></html>