From: NeilBrown <neilb@cse.unsw.edu.au>

The functions are all subtley different.  This patch makes them all much the
same.  In particular, EOPNOTSUPP gets returned by all is appropriate.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/md/linear.c    |   11 ++++-------
 25-akpm/drivers/md/multipath.c |   13 +++++--------
 25-akpm/drivers/md/raid0.c     |   12 ++++--------
 25-akpm/drivers/md/raid1.c     |   12 ++++++------
 25-akpm/drivers/md/raid10.c    |   12 ++++++------
 25-akpm/drivers/md/raid5.c     |   22 ++++++----------------
 25-akpm/drivers/md/raid6main.c |   22 ++++++----------------
 7 files changed, 37 insertions(+), 67 deletions(-)

diff -puN drivers/md/linear.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/linear.c
--- 25/drivers/md/linear.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.609155920 -0700
+++ 25-akpm/drivers/md/linear.c	2004-09-07 19:59:00.623153792 -0700
@@ -99,17 +99,14 @@ static int linear_issue_flush(request_qu
 	linear_conf_t *conf = mddev_to_conf(mddev);
 	int i, ret = 0;
 
-	for (i=0; i < mddev->raid_disks; i++) {
+	for (i=0; i < mddev->raid_disks && ret == 0; i++) {
 		struct block_device *bdev = conf->disks[i].rdev->bdev;
 		request_queue_t *r_queue = bdev_get_queue(bdev);
 
-		if (!r_queue->issue_flush_fn) {
+		if (!r_queue->issue_flush_fn)
 			ret = -EOPNOTSUPP;
-			break;
-		}
-		ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-		if (ret)
-			break;
+		else
+			ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
 	}
 	return ret;
 }
diff -puN drivers/md/multipath.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/multipath.c
--- 25/drivers/md/multipath.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.611155616 -0700
+++ 25-akpm/drivers/md/multipath.c	2004-09-07 19:59:00.623153792 -0700
@@ -238,20 +238,17 @@ static int multipath_issue_flush(request
 	multipath_conf_t *conf = mddev_to_conf(mddev);
 	int i, ret = 0;
 
-	for (i=0; i<mddev->raid_disks; i++) {
+	for (i=0; i<mddev->raid_disks && ret == 0; i++) {
 		mdk_rdev_t *rdev = conf->multipaths[i].rdev;
 		if (rdev && !rdev->faulty) {
 			struct block_device *bdev = rdev->bdev;
 			request_queue_t *r_queue = bdev_get_queue(bdev);
 
-			if (!r_queue->issue_flush_fn) {
+			if (!r_queue->issue_flush_fn)
 				ret = -EOPNOTSUPP;
-				break;
-			}
-
-			ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-			if (ret)
-				break;
+			else
+				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk,
+							      error_sector);
 		}
 	}
 	return ret;
diff -puN drivers/md/raid0.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/raid0.c
--- 25/drivers/md/raid0.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.613155312 -0700
+++ 25-akpm/drivers/md/raid0.c	2004-09-07 19:59:00.624153640 -0700
@@ -48,18 +48,14 @@ static int raid0_issue_flush(request_que
 	mdk_rdev_t **devlist = conf->strip_zone[0].dev;
 	int i, ret = 0;
 
-	for (i=0; i<mddev->raid_disks; i++) {
+	for (i=0; i<mddev->raid_disks && ret == 0; i++) {
 		struct block_device *bdev = devlist[i]->bdev;
 		request_queue_t *r_queue = bdev_get_queue(bdev);
 
-		if (!r_queue->issue_flush_fn) {
+		if (!r_queue->issue_flush_fn)
 			ret = -EOPNOTSUPP;
-			break;
-		}
-
-		ret =r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-		if (ret)
-			break;
+		else
+			ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
 	}
 	return ret;
 }
diff -puN drivers/md/raid10.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/raid10.c
--- 25/drivers/md/raid10.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.615155008 -0700
+++ 25-akpm/drivers/md/raid10.c	2004-09-07 19:59:00.626153336 -0700
@@ -613,17 +613,17 @@ static int raid10_issue_flush(request_qu
 	int i, ret = 0;
 
 	spin_lock_irqsave(&conf->device_lock, flags);
-	for (i=0; i<mddev->raid_disks; i++) {
+	for (i=0; i<mddev->raid_disks && ret == 0; i++) {
 		mdk_rdev_t *rdev = conf->mirrors[i].rdev;
 		if (rdev && !rdev->faulty) {
 			struct block_device *bdev = rdev->bdev;
 			request_queue_t *r_queue = bdev_get_queue(bdev);
 
-			if (r_queue->issue_flush_fn) {
-				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-				if (ret)
-					break;
-			}
+			if (!r_queue->issue_flush_fn)
+				ret = -EOPNOTSUPP;
+			else
+				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk,
+							      error_sector);
 		}
 	}
 	spin_unlock_irqrestore(&conf->device_lock, flags);
diff -puN drivers/md/raid1.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/raid1.c
--- 25/drivers/md/raid1.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.616154856 -0700
+++ 25-akpm/drivers/md/raid1.c	2004-09-07 19:59:00.625153488 -0700
@@ -459,17 +459,17 @@ static int raid1_issue_flush(request_que
 	int i, ret = 0;
 
 	spin_lock_irqsave(&conf->device_lock, flags);
-	for (i=0; i<mddev->raid_disks; i++) {
+	for (i=0; i<mddev->raid_disks && ret == 0; i++) {
 		mdk_rdev_t *rdev = conf->mirrors[i].rdev;
 		if (rdev && !rdev->faulty) {
 			struct block_device *bdev = rdev->bdev;
 			request_queue_t *r_queue = bdev_get_queue(bdev);
 
-			if (r_queue->issue_flush_fn) {
-				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-				if (ret)
-					break;
-			}
+			if (!r_queue->issue_flush_fn)
+				ret = -EOPNOTSUPP;
+			else
+				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk,
+							      error_sector);
 		}
 	}
 	spin_unlock_irqrestore(&conf->device_lock, flags);
diff -puN drivers/md/raid5.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/raid5.c
--- 25/drivers/md/raid5.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.617154704 -0700
+++ 25-akpm/drivers/md/raid5.c	2004-09-07 19:59:00.628153032 -0700
@@ -1347,27 +1347,17 @@ static int raid5_issue_flush(request_que
 	raid5_conf_t *conf = mddev_to_conf(mddev);
 	int i, ret = 0;
 
-	for (i=0; i<mddev->raid_disks; i++) {
+	for (i=0; i<mddev->raid_disks && ret == 0; i++) {
 		mdk_rdev_t *rdev = conf->disks[i].rdev;
 		if (rdev && !rdev->faulty) {
 			struct block_device *bdev = rdev->bdev;
-			request_queue_t *r_queue;
+			request_queue_t *r_queue = bdev_get_queue(bdev);
 
-			if (!bdev)
-				continue;
-
-			r_queue = bdev_get_queue(bdev);
-			if (!r_queue)
-				continue;
-
-			if (!r_queue->issue_flush_fn) {
+			if (!r_queue->issue_flush_fn)
 				ret = -EOPNOTSUPP;
-				break;
-			}
-
-			ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-			if (ret)
-				break;
+			else
+				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk,
+							      error_sector);
 		}
 	}
 	return ret;
diff -puN drivers/md/raid6main.c~md-rationalise-issue_flush-function-in-md-personalities drivers/md/raid6main.c
--- 25/drivers/md/raid6main.c~md-rationalise-issue_flush-function-in-md-personalities	2004-09-07 19:59:00.619154400 -0700
+++ 25-akpm/drivers/md/raid6main.c	2004-09-07 19:59:00.630152728 -0700
@@ -1509,27 +1509,17 @@ static int raid6_issue_flush(request_que
 	raid6_conf_t *conf = mddev_to_conf(mddev);
 	int i, ret = 0;
 
-	for (i=0; i<mddev->raid_disks; i++) {
+	for (i=0; i<mddev->raid_disks && ret == 0; i++) {
 		mdk_rdev_t *rdev = conf->disks[i].rdev;
 		if (rdev && !rdev->faulty) {
 			struct block_device *bdev = rdev->bdev;
-			request_queue_t *r_queue;
+			request_queue_t *r_queue = bdev_get_queue(bdev);
 
-			if (!bdev)
-				continue;
-
-			r_queue = bdev_get_queue(bdev);
-			if (!r_queue)
-				continue;
-
-			if (!r_queue->issue_flush_fn) {
+			if (!r_queue->issue_flush_fn)
 				ret = -EOPNOTSUPP;
-				break;
-			}
-
-			ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk, error_sector);
-			if (ret)
-				break;
+			else
+				ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk,
+							      error_sector);
 		}
 	}
 	return ret;
_