aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/multipath.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/multipath.c')
-rw-r--r--drivers/md/multipath.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
index ee7646f974a0..789bf535d29c 100644
--- a/drivers/md/multipath.c
+++ b/drivers/md/multipath.c
@@ -22,6 +22,7 @@
22#include <linux/blkdev.h> 22#include <linux/blkdev.h>
23#include <linux/raid/md_u.h> 23#include <linux/raid/md_u.h>
24#include <linux/seq_file.h> 24#include <linux/seq_file.h>
25#include <linux/slab.h>
25#include "md.h" 26#include "md.h"
26#include "multipath.h" 27#include "multipath.h"
27 28
@@ -145,7 +146,7 @@ static int multipath_make_request (struct request_queue *q, struct bio * bio)
145 int cpu; 146 int cpu;
146 147
147 if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { 148 if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) {
148 bio_endio(bio, -EOPNOTSUPP); 149 md_barrier_request(mddev, bio);
149 return 0; 150 return 0;
150 } 151 }
151 152
@@ -301,14 +302,16 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
301 rdev->data_offset << 9); 302 rdev->data_offset << 9);
302 303
303 /* as we don't honour merge_bvec_fn, we must never risk 304 /* as we don't honour merge_bvec_fn, we must never risk
304 * violating it, so limit ->max_sector to one PAGE, as 305 * violating it, so limit ->max_segments to one, lying
305 * a one page request is never in violation. 306 * within a single page.
306 * (Note: it is very unlikely that a device with 307 * (Note: it is very unlikely that a device with
307 * merge_bvec_fn will be involved in multipath.) 308 * merge_bvec_fn will be involved in multipath.)
308 */ 309 */
309 if (q->merge_bvec_fn && 310 if (q->merge_bvec_fn) {
310 queue_max_sectors(q) > (PAGE_SIZE>>9)) 311 blk_queue_max_segments(mddev->queue, 1);
311 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); 312 blk_queue_segment_boundary(mddev->queue,
313 PAGE_CACHE_SIZE - 1);
314 }
312 315
313 conf->working_disks++; 316 conf->working_disks++;
314 mddev->degraded--; 317 mddev->degraded--;
@@ -476,9 +479,11 @@ static int multipath_run (mddev_t *mddev)
476 /* as we don't honour merge_bvec_fn, we must never risk 479 /* as we don't honour merge_bvec_fn, we must never risk
477 * violating it, not that we ever expect a device with 480 * violating it, not that we ever expect a device with
478 * a merge_bvec_fn to be involved in multipath */ 481 * a merge_bvec_fn to be involved in multipath */
479 if (rdev->bdev->bd_disk->queue->merge_bvec_fn && 482 if (rdev->bdev->bd_disk->queue->merge_bvec_fn) {
480 queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) 483 blk_queue_max_segments(mddev->queue, 1);
481 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); 484 blk_queue_segment_boundary(mddev->queue,
485 PAGE_CACHE_SIZE - 1);
486 }
482 487
483 if (!test_bit(Faulty, &rdev->flags)) 488 if (!test_bit(Faulty, &rdev->flags))
484 conf->working_disks++; 489 conf->working_disks++;
@@ -581,6 +586,7 @@ static void __exit multipath_exit (void)
581module_init(multipath_init); 586module_init(multipath_init);
582module_exit(multipath_exit); 587module_exit(multipath_exit);
583MODULE_LICENSE("GPL"); 588MODULE_LICENSE("GPL");
589MODULE_DESCRIPTION("simple multi-path personality for MD");
584MODULE_ALIAS("md-personality-7"); /* MULTIPATH */ 590MODULE_ALIAS("md-personality-7"); /* MULTIPATH */
585MODULE_ALIAS("md-multipath"); 591MODULE_ALIAS("md-multipath");
586MODULE_ALIAS("md-level--4"); 592MODULE_ALIAS("md-level--4");