aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 17e7fd776034..d45f52edb314 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -321,9 +321,23 @@ EXPORT_SYMBOL_GPL(mddev_resume);
321 321
322int mddev_congested(struct mddev *mddev, int bits) 322int mddev_congested(struct mddev *mddev, int bits)
323{ 323{
324 return mddev->suspended; 324 struct md_personality *pers = mddev->pers;
325 int ret = 0;
326
327 rcu_read_lock();
328 if (mddev->suspended)
329 ret = 1;
330 else if (pers && pers->congested)
331 ret = pers->congested(mddev, bits);
332 rcu_read_unlock();
333 return ret;
334}
335EXPORT_SYMBOL_GPL(mddev_congested);
336static int md_congested(void *data, int bits)
337{
338 struct mddev *mddev = data;
339 return mddev_congested(mddev, bits);
325} 340}
326EXPORT_SYMBOL(mddev_congested);
327 341
328/* 342/*
329 * Generic flush handling for md 343 * Generic flush handling for md
@@ -4908,6 +4922,10 @@ int md_run(struct mddev *mddev)
4908 bitmap_destroy(mddev); 4922 bitmap_destroy(mddev);
4909 return err; 4923 return err;
4910 } 4924 }
4925 if (mddev->queue) {
4926 mddev->queue->backing_dev_info.congested_data = mddev;
4927 mddev->queue->backing_dev_info.congested_fn = md_congested;
4928 }
4911 if (mddev->pers->sync_request) { 4929 if (mddev->pers->sync_request) {
4912 if (mddev->kobj.sd && 4930 if (mddev->kobj.sd &&
4913 sysfs_create_group(&mddev->kobj, &md_redundancy_group)) 4931 sysfs_create_group(&mddev->kobj, &md_redundancy_group))