Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] md: define backing_dev_info.congested_fn for raid0 and linear

Each backing_dev needs to be able to report whether it is congested, either by
modulating BDI_*_congested in ->state, or by defining a ->congested_fn.
md/raid did neither of these. This patch add a congested_fn which simply
checks all component devices to see if they are congested.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

NeilBrown and committed by
Linus Torvalds
26be34dc c04be0aa

+32
+15
drivers/md/linear.c
··· 111 111 return ret; 112 112 } 113 113 114 + static int linear_congested(void *data, int bits) 115 + { 116 + mddev_t *mddev = data; 117 + linear_conf_t *conf = mddev_to_conf(mddev); 118 + int i, ret = 0; 119 + 120 + for (i = 0; i < mddev->raid_disks && !ret ; i++) { 121 + request_queue_t *q = bdev_get_queue(conf->disks[i].rdev->bdev); 122 + ret |= bdi_congested(&q->backing_dev_info, bits); 123 + } 124 + return ret; 125 + } 126 + 114 127 static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) 115 128 { 116 129 linear_conf_t *conf; ··· 282 269 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec); 283 270 mddev->queue->unplug_fn = linear_unplug; 284 271 mddev->queue->issue_flush_fn = linear_issue_flush; 272 + mddev->queue->backing_dev_info.congested_fn = linear_congested; 273 + mddev->queue->backing_dev_info.congested_data = mddev; 285 274 return 0; 286 275 } 287 276
+17
drivers/md/raid0.c
··· 60 60 return ret; 61 61 } 62 62 63 + static int raid0_congested(void *data, int bits) 64 + { 65 + mddev_t *mddev = data; 66 + raid0_conf_t *conf = mddev_to_conf(mddev); 67 + mdk_rdev_t **devlist = conf->strip_zone[0].dev; 68 + int i, ret = 0; 69 + 70 + for (i = 0; i < mddev->raid_disks && !ret ; i++) { 71 + request_queue_t *q = bdev_get_queue(devlist[i]->bdev); 72 + 73 + ret |= bdi_congested(&q->backing_dev_info, bits); 74 + } 75 + return ret; 76 + } 77 + 63 78 64 79 static int create_strip_zones (mddev_t *mddev) 65 80 { ··· 251 236 mddev->queue->unplug_fn = raid0_unplug; 252 237 253 238 mddev->queue->issue_flush_fn = raid0_issue_flush; 239 + mddev->queue->backing_dev_info.congested_fn = raid0_congested; 240 + mddev->queue->backing_dev_info.congested_data = mddev; 254 241 255 242 printk("raid0: done.\n"); 256 243 return 0;