|
@@ -1152,13 +1152,17 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
|
|
|
|
|
|
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
|
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
|
rdev->data_offset << 9);
|
|
rdev->data_offset << 9);
|
|
- /* as we don't honour merge_bvec_fn, we must never risk
|
|
|
|
- * violating it, so limit ->max_sector to one PAGE, as
|
|
|
|
- * a one page request is never in violation.
|
|
|
|
|
|
+ /* as we don't honour merge_bvec_fn, we must
|
|
|
|
+ * never risk violating it, so limit
|
|
|
|
+ * ->max_segments to one lying with a single
|
|
|
|
+ * page, as a one page request is never in
|
|
|
|
+ * violation.
|
|
*/
|
|
*/
|
|
- if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
|
|
|
|
- queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9))
|
|
|
|
- blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9);
|
|
|
|
|
|
+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn) {
|
|
|
|
+ blk_queue_max_segments(mddev->queue, 1);
|
|
|
|
+ blk_queue_segment_boundary(mddev->queue,
|
|
|
|
+ PAGE_CACHE_SIZE - 1);
|
|
|
|
+ }
|
|
|
|
|
|
p->head_position = 0;
|
|
p->head_position = 0;
|
|
rdev->raid_disk = mirror;
|
|
rdev->raid_disk = mirror;
|
|
@@ -2098,12 +2102,14 @@ static int run(mddev_t *mddev)
|
|
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
|
disk_stack_limits(mddev->gendisk, rdev->bdev,
|
|
rdev->data_offset << 9);
|
|
rdev->data_offset << 9);
|
|
/* as we don't honour merge_bvec_fn, we must never risk
|
|
/* as we don't honour merge_bvec_fn, we must never risk
|
|
- * violating it, so limit ->max_sector to one PAGE, as
|
|
|
|
- * a one page request is never in violation.
|
|
|
|
|
|
+ * violating it, so limit ->max_segments to 1 lying within
|
|
|
|
+ * a single page, as a one page request is never in violation.
|
|
*/
|
|
*/
|
|
- if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
|
|
|
|
- queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9))
|
|
|
|
- blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9);
|
|
|
|
|
|
+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn) {
|
|
|
|
+ blk_queue_max_segments(mddev->queue, 1);
|
|
|
|
+ blk_queue_segment_boundary(mddev->queue,
|
|
|
|
+ PAGE_CACHE_SIZE - 1);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
mddev->degraded = 0;
|
|
mddev->degraded = 0;
|