]>
Commit | Line | Data |
---|---|---|
34357203 GKH |
1 | From aba336bd1d46d6b0404b06f6915ed76150739057 Mon Sep 17 00:00:00 2001 |
2 | From: NeilBrown <neilb@suse.de> | |
3 | Date: Thu, 31 May 2012 15:39:11 +1000 | |
4 | Subject: md: raid1/raid10: fix problem with merge_bvec_fn | |
5 | ||
6 | From: NeilBrown <neilb@suse.de> | |
7 | ||
8 | commit aba336bd1d46d6b0404b06f6915ed76150739057 upstream. | |
9 | ||
10 | The new merge_bvec_fn which calls the corresponding function | |
11 | in subsidiary devices requires that mddev->merge_check_needed | |
12 | be set if any child has a merge_bvec_fn. | |
13 | ||
14 | However were were only setting that when a device was hot-added, | |
15 | not when a device was present from the start. | |
16 | ||
17 | This bug was introduced in 3.4 so patch is suitable for 3.4.y | |
18 | kernels. However that are conflicts in raid10.c so a separate | |
19 | patch will be needed for 3.4.y. | |
20 | ||
21 | Reported-by: Sebastian Riemer <sebastian.riemer@profitbricks.com> | |
22 | Signed-off-by: NeilBrown <neilb@suse.de> | |
23 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
24 | ||
25 | --- | |
26 | drivers/md/raid1.c | 4 ++++ | |
27 | drivers/md/raid10.c | 5 ++++- | |
28 | 2 files changed, 8 insertions(+), 1 deletion(-) | |
29 | ||
30 | --- a/drivers/md/raid1.c | |
31 | +++ b/drivers/md/raid1.c | |
32 | @@ -2548,6 +2548,7 @@ static struct r1conf *setup_conf(struct | |
33 | err = -EINVAL; | |
34 | spin_lock_init(&conf->device_lock); | |
35 | rdev_for_each(rdev, mddev) { | |
36 | + struct request_queue *q; | |
37 | int disk_idx = rdev->raid_disk; | |
38 | if (disk_idx >= mddev->raid_disks | |
39 | || disk_idx < 0) | |
40 | @@ -2560,6 +2561,9 @@ static struct r1conf *setup_conf(struct | |
41 | if (disk->rdev) | |
42 | goto abort; | |
43 | disk->rdev = rdev; | |
44 | + q = bdev_get_queue(rdev->bdev); | |
45 | + if (q->merge_bvec_fn) | |
46 | + mddev->merge_check_needed = 1; | |
47 | ||
48 | disk->head_position = 0; | |
49 | } | |
50 | --- a/drivers/md/raid10.c | |
51 | +++ b/drivers/md/raid10.c | |
52 | @@ -3311,7 +3311,7 @@ static int run(struct mddev *mddev) | |
53 | (conf->raid_disks / conf->near_copies)); | |
54 | ||
55 | rdev_for_each(rdev, mddev) { | |
56 | - | |
57 | + struct request_queue *q; | |
58 | disk_idx = rdev->raid_disk; | |
59 | if (disk_idx >= conf->raid_disks | |
60 | || disk_idx < 0) | |
61 | @@ -3327,6 +3327,9 @@ static int run(struct mddev *mddev) | |
62 | goto out_free_conf; | |
63 | disk->rdev = rdev; | |
64 | } | |
65 | + q = bdev_get_queue(rdev->bdev); | |
66 | + if (q->merge_bvec_fn) | |
67 | + mddev->merge_check_needed = 1; | |
68 | ||
69 | disk_stack_limits(mddev->gendisk, rdev->bdev, | |
70 | rdev->data_offset << 9); |