|
@@ -201,11 +201,11 @@ static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
|
|
|
if (test_bit(STRIPE_HANDLE, &sh->state)) {
|
|
|
if (test_bit(STRIPE_DELAYED, &sh->state)) {
|
|
|
list_add_tail(&sh->lru, &conf->delayed_list);
|
|
|
- blk_plug_device(conf->mddev->queue);
|
|
|
+ plugger_set_plug(&conf->plug);
|
|
|
} else if (test_bit(STRIPE_BIT_DELAY, &sh->state) &&
|
|
|
sh->bm_seq - conf->seq_write > 0) {
|
|
|
list_add_tail(&sh->lru, &conf->bitmap_list);
|
|
|
- blk_plug_device(conf->mddev->queue);
|
|
|
+ plugger_set_plug(&conf->plug);
|
|
|
} else {
|
|
|
clear_bit(STRIPE_BIT_DELAY, &sh->state);
|
|
|
list_add_tail(&sh->lru, &conf->handle_list);
|
|
@@ -434,7 +434,7 @@ static int has_failed(raid5_conf_t *conf)
|
|
|
}
|
|
|
|
|
|
static void unplug_slaves(mddev_t *mddev);
|
|
|
-static void raid5_unplug_device(struct request_queue *q);
|
|
|
+static void raid5_unplug_device(raid5_conf_t *conf);
|
|
|
|
|
|
static struct stripe_head *
|
|
|
get_active_stripe(raid5_conf_t *conf, sector_t sector,
|
|
@@ -464,7 +464,7 @@ get_active_stripe(raid5_conf_t *conf, sector_t sector,
|
|
|
< (conf->max_nr_stripes *3/4)
|
|
|
|| !conf->inactive_blocked),
|
|
|
conf->device_lock,
|
|
|
- raid5_unplug_device(conf->mddev->queue)
|
|
|
+ raid5_unplug_device(conf)
|
|
|
);
|
|
|
conf->inactive_blocked = 0;
|
|
|
} else
|
|
@@ -3618,7 +3618,7 @@ static void raid5_activate_delayed(raid5_conf_t *conf)
|
|
|
list_add_tail(&sh->lru, &conf->hold_list);
|
|
|
}
|
|
|
} else
|
|
|
- blk_plug_device(conf->mddev->queue);
|
|
|
+ plugger_set_plug(&conf->plug);
|
|
|
}
|
|
|
|
|
|
static void activate_bit_delay(raid5_conf_t *conf)
|
|
@@ -3659,23 +3659,33 @@ static void unplug_slaves(mddev_t *mddev)
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
|
|
|
|
-static void raid5_unplug_device(struct request_queue *q)
|
|
|
+static void raid5_unplug_device(raid5_conf_t *conf)
|
|
|
{
|
|
|
- mddev_t *mddev = q->queuedata;
|
|
|
- raid5_conf_t *conf = mddev->private;
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(&conf->device_lock, flags);
|
|
|
|
|
|
- if (blk_remove_plug(q)) {
|
|
|
+ if (plugger_remove_plug(&conf->plug)) {
|
|
|
conf->seq_flush++;
|
|
|
raid5_activate_delayed(conf);
|
|
|
}
|
|
|
- md_wakeup_thread(mddev->thread);
|
|
|
+ md_wakeup_thread(conf->mddev->thread);
|
|
|
|
|
|
spin_unlock_irqrestore(&conf->device_lock, flags);
|
|
|
|
|
|
- unplug_slaves(mddev);
|
|
|
+ unplug_slaves(conf->mddev);
|
|
|
+}
|
|
|
+
|
|
|
+static void raid5_unplug(struct plug_handle *plug)
|
|
|
+{
|
|
|
+ raid5_conf_t *conf = container_of(plug, raid5_conf_t, plug);
|
|
|
+ raid5_unplug_device(conf);
|
|
|
+}
|
|
|
+
|
|
|
+static void raid5_unplug_queue(struct request_queue *q)
|
|
|
+{
|
|
|
+ mddev_t *mddev = q->queuedata;
|
|
|
+ raid5_unplug_device(mddev->private);
|
|
|
}
|
|
|
|
|
|
int md_raid5_congested(mddev_t *mddev, int bits)
|
|
@@ -4085,7 +4095,7 @@ static int make_request(mddev_t *mddev, struct bio * bi)
|
|
|
* add failed due to overlap. Flush everything
|
|
|
* and wait a while
|
|
|
*/
|
|
|
- raid5_unplug_device(mddev->queue);
|
|
|
+ raid5_unplug_device(conf);
|
|
|
release_stripe(sh);
|
|
|
schedule();
|
|
|
goto retry;
|
|
@@ -5178,6 +5188,7 @@ static int run(mddev_t *mddev)
|
|
|
mdname(mddev));
|
|
|
md_set_array_sectors(mddev, raid5_size(mddev, 0, 0));
|
|
|
|
|
|
+ plugger_init(&conf->plug, raid5_unplug);
|
|
|
if (mddev->queue) {
|
|
|
/* read-ahead size must cover two whole stripes, which
|
|
|
* is 2 * (datadisks) * chunksize where 'n' is the
|
|
@@ -5197,7 +5208,7 @@ static int run(mddev_t *mddev)
|
|
|
|
|
|
mddev->queue->queue_lock = &conf->device_lock;
|
|
|
|
|
|
- mddev->queue->unplug_fn = raid5_unplug_device;
|
|
|
+ mddev->queue->unplug_fn = raid5_unplug_queue;
|
|
|
|
|
|
chunk_size = mddev->chunk_sectors << 9;
|
|
|
blk_queue_io_min(mddev->queue, chunk_size);
|
|
@@ -5229,7 +5240,7 @@ static int stop(mddev_t *mddev)
|
|
|
mddev->thread = NULL;
|
|
|
if (mddev->queue)
|
|
|
mddev->queue->backing_dev_info.congested_fn = NULL;
|
|
|
- blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
|
|
|
+ plugger_flush(&conf->plug); /* the unplug fn references 'conf'*/
|
|
|
free_conf(conf);
|
|
|
mddev->private = NULL;
|
|
|
mddev->to_remove = &raid5_attrs_group;
|