diff options
Diffstat (limited to 'drivers/md/multipath.c')
-rw-r--r-- | drivers/md/multipath.c | 24 |
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) | |||
581 | module_init(multipath_init); | 586 | module_init(multipath_init); |
582 | module_exit(multipath_exit); | 587 | module_exit(multipath_exit); |
583 | MODULE_LICENSE("GPL"); | 588 | MODULE_LICENSE("GPL"); |
589 | MODULE_DESCRIPTION("simple multi-path personality for MD"); | ||
584 | MODULE_ALIAS("md-personality-7"); /* MULTIPATH */ | 590 | MODULE_ALIAS("md-personality-7"); /* MULTIPATH */ |
585 | MODULE_ALIAS("md-multipath"); | 591 | MODULE_ALIAS("md-multipath"); |
586 | MODULE_ALIAS("md-level--4"); | 592 | MODULE_ALIAS("md-level--4"); |