diff options
author | NeilBrown <neilb@suse.de> | 2009-09-23 04:10:29 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-09-23 04:10:29 -0400 |
commit | 3fa841d7e7266f6fcc1b3885b905f5153ba897d8 (patch) | |
tree | 7afa971a10eddcf52787340ea43fa1e910b5805b /drivers/md | |
parent | 0da3c6194ec2f32617b272df4505a1cf022faea5 (diff) |
md: report device as congested when suspended
This should writeback from coming when the device is temporarily
suspended.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/linear.c | 3 | ||||
-rw-r--r-- | drivers/md/md.c | 6 | ||||
-rw-r--r-- | drivers/md/md.h | 1 | ||||
-rw-r--r-- | drivers/md/multipath.c | 3 | ||||
-rw-r--r-- | drivers/md/raid0.c | 3 | ||||
-rw-r--r-- | drivers/md/raid1.c | 3 | ||||
-rw-r--r-- | drivers/md/raid10.c | 2 | ||||
-rw-r--r-- | drivers/md/raid5.c | 3 |
8 files changed, 24 insertions, 0 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index ea4842905444..1ceceb334d5e 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -108,6 +108,9 @@ static int linear_congested(void *data, int bits) | |||
108 | linear_conf_t *conf; | 108 | linear_conf_t *conf; |
109 | int i, ret = 0; | 109 | int i, ret = 0; |
110 | 110 | ||
111 | if (mddev_congested(mddev, bits)) | ||
112 | return 1; | ||
113 | |||
111 | rcu_read_lock(); | 114 | rcu_read_lock(); |
112 | conf = rcu_dereference(mddev->private); | 115 | conf = rcu_dereference(mddev->private); |
113 | 116 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index a3dd3c8ea681..26ba42a79129 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -262,6 +262,12 @@ static void mddev_resume(mddev_t *mddev) | |||
262 | mddev->pers->quiesce(mddev, 0); | 262 | mddev->pers->quiesce(mddev, 0); |
263 | } | 263 | } |
264 | 264 | ||
265 | int mddev_congested(mddev_t *mddev, int bits) | ||
266 | { | ||
267 | return mddev->suspended; | ||
268 | } | ||
269 | EXPORT_SYMBOL(mddev_congested); | ||
270 | |||
265 | 271 | ||
266 | static inline mddev_t *mddev_get(mddev_t *mddev) | 272 | static inline mddev_t *mddev_get(mddev_t *mddev) |
267 | { | 273 | { |
diff --git a/drivers/md/md.h b/drivers/md/md.h index f55d2ff95133..f184b69ef337 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -430,6 +430,7 @@ extern void md_write_end(mddev_t *mddev); | |||
430 | extern void md_done_sync(mddev_t *mddev, int blocks, int ok); | 430 | extern void md_done_sync(mddev_t *mddev, int blocks, int ok); |
431 | extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev); | 431 | extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev); |
432 | 432 | ||
433 | extern int mddev_congested(mddev_t *mddev, int bits); | ||
433 | extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | 434 | extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, |
434 | sector_t sector, int size, struct page *page); | 435 | sector_t sector, int size, struct page *page); |
435 | extern void md_super_wait(mddev_t *mddev); | 436 | extern void md_super_wait(mddev_t *mddev); |
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 94c21c11b9bc..dcbf9d35928b 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -199,6 +199,9 @@ static int multipath_congested(void *data, int bits) | |||
199 | multipath_conf_t *conf = mddev->private; | 199 | multipath_conf_t *conf = mddev->private; |
200 | int i, ret = 0; | 200 | int i, ret = 0; |
201 | 201 | ||
202 | if (mddev_congested(mddev, bits)) | ||
203 | return 1; | ||
204 | |||
202 | rcu_read_lock(); | 205 | rcu_read_lock(); |
203 | for (i = 0; i < mddev->raid_disks ; i++) { | 206 | for (i = 0; i < mddev->raid_disks ; i++) { |
204 | mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev); | 207 | mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev); |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 68a4d129206e..d3a4ce06015a 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -44,6 +44,9 @@ static int raid0_congested(void *data, int bits) | |||
44 | mdk_rdev_t **devlist = conf->devlist; | 44 | mdk_rdev_t **devlist = conf->devlist; |
45 | int i, ret = 0; | 45 | int i, ret = 0; |
46 | 46 | ||
47 | if (mddev_congested(mddev, bits)) | ||
48 | return 1; | ||
49 | |||
47 | for (i = 0; i < mddev->raid_disks && !ret ; i++) { | 50 | for (i = 0; i < mddev->raid_disks && !ret ; i++) { |
48 | struct request_queue *q = bdev_get_queue(devlist[i]->bdev); | 51 | struct request_queue *q = bdev_get_queue(devlist[i]->bdev); |
49 | 52 | ||
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 7efdeb44097f..a1eb4e13a112 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -576,6 +576,9 @@ static int raid1_congested(void *data, int bits) | |||
576 | conf_t *conf = mddev->private; | 576 | conf_t *conf = mddev->private; |
577 | int i, ret = 0; | 577 | int i, ret = 0; |
578 | 578 | ||
579 | if (mddev_congested(mddev, bits)) | ||
580 | return 1; | ||
581 | |||
579 | rcu_read_lock(); | 582 | rcu_read_lock(); |
580 | for (i = 0; i < mddev->raid_disks; i++) { | 583 | for (i = 0; i < mddev->raid_disks; i++) { |
581 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); | 584 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 7872968fdfcc..191f42efecc2 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -631,6 +631,8 @@ static int raid10_congested(void *data, int bits) | |||
631 | conf_t *conf = mddev->private; | 631 | conf_t *conf = mddev->private; |
632 | int i, ret = 0; | 632 | int i, ret = 0; |
633 | 633 | ||
634 | if (mddev_congested(mddev, bits)) | ||
635 | return 1; | ||
634 | rcu_read_lock(); | 636 | rcu_read_lock(); |
635 | for (i = 0; i < mddev->raid_disks && ret == 0; i++) { | 637 | for (i = 0; i < mddev->raid_disks && ret == 0; i++) { |
636 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); | 638 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index bee3573ed1bd..9db84c98a41d 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3332,6 +3332,9 @@ static int raid5_congested(void *data, int bits) | |||
3332 | /* No difference between reads and writes. Just check | 3332 | /* No difference between reads and writes. Just check |
3333 | * how busy the stripe_cache is | 3333 | * how busy the stripe_cache is |
3334 | */ | 3334 | */ |
3335 | |||
3336 | if (mddev_congested(mddev, bits)) | ||
3337 | return 1; | ||
3335 | if (conf->inactive_blocked) | 3338 | if (conf->inactive_blocked) |
3336 | return 1; | 3339 | return 1; |
3337 | if (conf->quiesce) | 3340 | if (conf->quiesce) |