
From: Jens Axboe <axboe@suse.de>



---

 25-akpm/drivers/md/md.c         |   16 ++++++++++------
 25-akpm/drivers/md/raid1.c      |    6 +++---
 25-akpm/drivers/md/raid5.c      |    2 +-
 25-akpm/include/linux/raid/md.h |    1 +
 4 files changed, 15 insertions(+), 10 deletions(-)

diff -puN drivers/md/md.c~md-unplugging-fix drivers/md/md.c
--- 25/drivers/md/md.c~md-unplugging-fix	2004-03-15 01:13:39.163823408 -0800
+++ 25-akpm/drivers/md/md.c	2004-03-15 01:13:39.172822040 -0800
@@ -160,14 +160,11 @@ static int md_fail_request (request_queu
 	return 0;
 }
 
-static void md_unplug_all(request_queue_t *q)
+void md_unplug_mddev(mddev_t *mddev)
 {
-	mddev_t *mddev = q->queuedata;
 	struct list_head *tmp;
 	mdk_rdev_t *rdev;
 
-	clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
-
 	/*
 	 * this list iteration is done without any locking in md?!
 	 */
@@ -179,7 +176,14 @@ static void md_unplug_all(request_queue_
 			r_queue->unplug_fn(r_queue);
 		}
 	}
+}
 
+static void md_unplug_all(request_queue_t *q)
+{
+	mddev_t *mddev = q->queuedata;
+
+	clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
+	md_unplug_mddev(mddev);
 }
 
 static inline mddev_t *mddev_get(mddev_t *mddev)
@@ -2742,7 +2746,7 @@ int md_thread(void * arg)
 		run = thread->run;
 		if (run) {
 			run(thread->mddev);
-			blk_run_queue(thread->mddev->queue);
+			md_unplug_mddev(thread->mddev);
 		}
 		if (signal_pending(current))
 			flush_signals(current);
@@ -3310,7 +3314,7 @@ static void md_do_sync(mddev_t *mddev)
 		    test_bit(MD_RECOVERY_ERR, &mddev->recovery))
 			break;
 
-		blk_run_queue(mddev->queue);
+		md_unplug_mddev(mddev);
 
 	repeat:
 		if (jiffies >= mark[last_mark] + SYNC_MARK_STEP ) {
diff -puN drivers/md/raid1.c~md-unplugging-fix drivers/md/raid1.c
--- 25/drivers/md/raid1.c~md-unplugging-fix	2004-03-15 01:13:39.164823256 -0800
+++ 25-akpm/drivers/md/raid1.c	2004-03-15 01:13:39.173821888 -0800
@@ -451,7 +451,7 @@ rb_out:
 
 static void device_barrier(conf_t *conf, sector_t sect)
 {
-	blk_run_queue(conf->mddev->queue);
+	md_unplug_mddev(conf->mddev);
 	spin_lock_irq(&conf->resync_lock);
 	wait_event_lock_irq(conf->wait_idle, !waitqueue_active(&conf->wait_resume), conf->resync_lock);
 	
@@ -479,7 +479,7 @@ static int make_request(request_queue_t 
 	 * thread has put up a bar for new requests.
 	 * Continue immediately if no resync is active currently.
 	 */
-	blk_run_queue(conf->mddev->queue);
+	md_unplug_mddev(conf->mddev);
 	spin_lock_irq(&conf->resync_lock);
 	wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock);
 	conf->nr_pending++;
@@ -646,7 +646,7 @@ static void print_conf(conf_t *conf)
 
 static void close_sync(conf_t *conf)
 {
-	blk_run_queue(conf->mddev->queue);
+	md_unplug_mddev(conf->mddev);
 	spin_lock_irq(&conf->resync_lock);
 	wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
diff -puN drivers/md/raid5.c~md-unplugging-fix drivers/md/raid5.c
--- 25/drivers/md/raid5.c~md-unplugging-fix	2004-03-15 01:13:39.166822952 -0800
+++ 25-akpm/drivers/md/raid5.c	2004-03-15 01:13:39.175821584 -0800
@@ -249,7 +249,7 @@ static struct stripe_head *get_active_st
 				break;
 			if (!sh) {
 				conf->inactive_blocked = 1;
-				blk_run_queue(conf->mddev->queue);
+				md_unplug_mddev(conf->mddev);
 				wait_event_lock_irq(conf->wait_for_stripe,
 						    !list_empty(&conf->inactive_list) &&
 						    (atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4)
diff -puN include/linux/raid/md.h~md-unplugging-fix include/linux/raid/md.h
--- 25/include/linux/raid/md.h~md-unplugging-fix	2004-03-15 01:13:39.168822648 -0800
+++ 25-akpm/include/linux/raid/md.h	2004-03-15 01:13:39.175821584 -0800
@@ -76,6 +76,7 @@ extern void md_handle_safemode(mddev_t *
 extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
 extern void md_sync_acct(mdk_rdev_t *rdev, unsigned long nr_sectors);
 extern void md_error (mddev_t *mddev, mdk_rdev_t *rdev);
+extern void md_unplug_mddev(mddev_t *mddev);
 
 extern void md_print_devices (void);
 

_
