md/raid5: export is_congested test
authorNeilBrown <neilb@suse.de>
Mon, 26 Jul 2010 01:57:07 +0000 (11:57 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 26 Jul 2010 02:52:29 +0000 (12:52 +1000)
the dm module will need this for dm-raid45.

Also only access ->queue->backing_dev_info->congested_fn
if ->queue actually exists.  It won't in a dm target.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c
drivers/md/raid5.h

index 9c462f6659c3ec9a931fb42db8ecd827a92384aa..ad6694f8a3a88b3b1e1d2ae8c3a066028ad9746a 100644 (file)
@@ -3678,17 +3678,14 @@ static void raid5_unplug_device(struct request_queue *q)
        unplug_slaves(mddev);
 }
 
-static int raid5_congested(void *data, int bits)
+int md_raid5_congested(mddev_t *mddev, int bits)
 {
-       mddev_t *mddev = data;
        raid5_conf_t *conf = mddev->private;
 
        /* No difference between reads and writes.  Just check
         * how busy the stripe_cache is
         */
 
-       if (mddev_congested(mddev, bits))
-               return 1;
        if (conf->inactive_blocked)
                return 1;
        if (conf->quiesce)
@@ -3698,6 +3695,15 @@ static int raid5_congested(void *data, int bits)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(md_raid5_congested);
+
+static int raid5_congested(void *data, int bits)
+{
+       mddev_t *mddev = data;
+
+       return mddev_congested(mddev, bits) ||
+               md_raid5_congested(mddev, bits);
+}
 
 /* We want read requests to align with chunks where possible,
  * but write requests don't need to.
@@ -5184,13 +5190,14 @@ static int run(mddev_t *mddev)
                        mddev->queue->backing_dev_info.ra_pages = 2 * stripe;
 
                blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec);
+
+               mddev->queue->backing_dev_info.congested_data = mddev;
+               mddev->queue->backing_dev_info.congested_fn = raid5_congested;
        }
 
        mddev->queue->queue_lock = &conf->device_lock;
 
        mddev->queue->unplug_fn = raid5_unplug_device;
-       mddev->queue->backing_dev_info.congested_data = mddev;
-       mddev->queue->backing_dev_info.congested_fn = raid5_congested;
 
        chunk_size = mddev->chunk_sectors << 9;
        blk_queue_io_min(mddev->queue, chunk_size);
@@ -5220,7 +5227,8 @@ static int stop(mddev_t *mddev)
 
        md_unregister_thread(mddev->thread);
        mddev->thread = NULL;
-       mddev->queue->backing_dev_info.congested_fn = NULL;
+       if (mddev->queue)
+               mddev->queue->backing_dev_info.congested_fn = NULL;
        blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
        free_conf(conf);
        mddev->private = NULL;
index 61b6b25dc5e7c3f6abce768af06c385fb4e7b56e..d6470dec667ac2df2c798dd2d252b64b89bcdd3f 100644 (file)
@@ -497,5 +497,7 @@ static inline int algorithm_is_DDF(int layout)
 {
        return layout >= 8 && layout <= 10;
 }
+
+extern int md_raid5_congested(mddev_t *mddev, int bits);
 extern int raid5_set_cache_size(mddev_t *mddev, int size);
 #endif