<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Mike Christie &lt;michaelc@cs.wisc.edu&gt;

A couple of drivers can sometimes fail the first segments in a bio then
requeue the rest of the request.  In this situation, if the last part of
the bio completes successfully bio_pair_end_* will miss that the beginging
of the bio had failed becuase they just return one when bi_size is not yet
zero.  The attached patch moves the error value test before the bi_size to
catch the above case.


---

 25-akpm/fs/bio.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff -puN fs/bio.c~bio_pair_end-fix fs/bio.c
--- 25/fs/bio.c~bio_pair_end-fix	Tue Mar 23 15:05:19 2004
+++ 25-akpm/fs/bio.c	Tue Mar 23 15:05:19 2004
@@ -701,11 +701,12 @@ static int bio_pair_end_1(struct bio * b
 {
 	struct bio_pair *bp = container_of(bi, struct bio_pair, bio1);
 
-	if (bi-&gt;bi_size)
-		return 1;
 	if (err)
 		bp-&gt;error = err;
 
+	if (bi-&gt;bi_size)
+		return 1;
+
 	bio_pair_release(bp);
 	return 0;
 }
@@ -714,11 +715,12 @@ static int bio_pair_end_2(struct bio * b
 {
 	struct bio_pair *bp = container_of(bi, struct bio_pair, bio2);
 
-	if (bi-&gt;bi_size)
-		return 1;
 	if (err)
 		bp-&gt;error = err;
 
+	if (bi-&gt;bi_size)
+		return 1;
+
 	bio_pair_release(bp);
 	return 0;
 }

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