aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-06-01 05:37:29 -0400
committerNeilBrown <neilb@suse.de>2010-07-25 22:53:08 -0400
commit252ac5221a71be72b7e7c7b7482af91e9c962e8c (patch)
treecb9542b1391dabc136ce0052eb28948e77a6e2e5
parent2ac8740151b082f045e58010eb92560c3a23a0e9 (diff)
md/plug: optionally use plugger to unplug an array during resync/recovery.
If an array doesn't have a 'queue' then md_do_sync cannot unplug it. In that case it will have a 'plugger', so make that available to the mddev, and use it to unplug the array if needed. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/md.c15
-rw-r--r--drivers/md/md.h2
-rw-r--r--drivers/md/raid5.c1
3 files changed, 15 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index eec75f130708..03c64e9735fb 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -4693,6 +4693,7 @@ static void md_clean(mddev_t *mddev)
4693 mddev->bitmap_info.chunksize = 0; 4693 mddev->bitmap_info.chunksize = 0;
4694 mddev->bitmap_info.daemon_sleep = 0; 4694 mddev->bitmap_info.daemon_sleep = 0;
4695 mddev->bitmap_info.max_write_behind = 0; 4695 mddev->bitmap_info.max_write_behind = 0;
4696 mddev->plug = NULL;
4696} 4697}
4697 4698
4698void md_stop_writes(mddev_t *mddev) 4699void md_stop_writes(mddev_t *mddev)
@@ -6626,6 +6627,14 @@ int md_allow_write(mddev_t *mddev)
6626} 6627}
6627EXPORT_SYMBOL_GPL(md_allow_write); 6628EXPORT_SYMBOL_GPL(md_allow_write);
6628 6629
6630static void md_unplug(mddev_t *mddev)
6631{
6632 if (mddev->queue)
6633 blk_unplug(mddev->queue);
6634 if (mddev->plug)
6635 mddev->plug->unplug_fn(mddev->plug);
6636}
6637
6629#define SYNC_MARKS 10 6638#define SYNC_MARKS 10
6630#define SYNC_MARK_STEP (3*HZ) 6639#define SYNC_MARK_STEP (3*HZ)
6631void md_do_sync(mddev_t *mddev) 6640void md_do_sync(mddev_t *mddev)
@@ -6804,7 +6813,7 @@ void md_do_sync(mddev_t *mddev)
6804 >= mddev->resync_max - mddev->curr_resync_completed 6813 >= mddev->resync_max - mddev->curr_resync_completed
6805 )) { 6814 )) {
6806 /* time to update curr_resync_completed */ 6815 /* time to update curr_resync_completed */
6807 blk_unplug(mddev->queue); 6816 md_unplug(mddev);
6808 wait_event(mddev->recovery_wait, 6817 wait_event(mddev->recovery_wait,
6809 atomic_read(&mddev->recovery_active) == 0); 6818 atomic_read(&mddev->recovery_active) == 0);
6810 mddev->curr_resync_completed = 6819 mddev->curr_resync_completed =
@@ -6882,7 +6891,7 @@ void md_do_sync(mddev_t *mddev)
6882 * about not overloading the IO subsystem. (things like an 6891 * about not overloading the IO subsystem. (things like an
6883 * e2fsck being done on the RAID array should execute fast) 6892 * e2fsck being done on the RAID array should execute fast)
6884 */ 6893 */
6885 blk_unplug(mddev->queue); 6894 md_unplug(mddev);
6886 cond_resched(); 6895 cond_resched();
6887 6896
6888 currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2 6897 currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2
@@ -6901,7 +6910,7 @@ void md_do_sync(mddev_t *mddev)
6901 * this also signals 'finished resyncing' to md_stop 6910 * this also signals 'finished resyncing' to md_stop
6902 */ 6911 */
6903 out: 6912 out:
6904 blk_unplug(mddev->queue); 6913 md_unplug(mddev);
6905 6914
6906 wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); 6915 wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));
6907 6916
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 5be0d6921b9d..57eb864a8249 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -328,6 +328,8 @@ struct mddev_s
328 struct list_head all_mddevs; 328 struct list_head all_mddevs;
329 329
330 struct attribute_group *to_remove; 330 struct attribute_group *to_remove;
331 struct plug_handle *plug; /* if used by personality */
332
331 /* Generic barrier handling. 333 /* Generic barrier handling.
332 * If there is a pending barrier request, all other 334 * If there is a pending barrier request, all other
333 * writes are blocked while the devices are flushed. 335 * writes are blocked while the devices are flushed.
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 84bb9aec2211..0a8173e650bb 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5189,6 +5189,7 @@ static int run(mddev_t *mddev)
5189 md_set_array_sectors(mddev, raid5_size(mddev, 0, 0)); 5189 md_set_array_sectors(mddev, raid5_size(mddev, 0, 0));
5190 5190
5191 plugger_init(&conf->plug, raid5_unplug); 5191 plugger_init(&conf->plug, raid5_unplug);
5192 mddev->plug = &conf->plug;
5192 if (mddev->queue) { 5193 if (mddev->queue) {
5193 /* read-ahead size must cover two whole stripes, which 5194 /* read-ahead size must cover two whole stripes, which
5194 * is 2 * (datadisks) * chunksize where 'n' is the 5195 * is 2 * (datadisks) * chunksize where 'n' is the