From: Jens Axboe --- 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); _