]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.4.2/md-raid1-raid10-fix-problem-with-merge_bvec_fn.patch
Linux 4.14.95
[thirdparty/kernel/stable-queue.git] / releases / 3.4.2 / md-raid1-raid10-fix-problem-with-merge_bvec_fn.patch
CommitLineData
34357203
GKH
1From aba336bd1d46d6b0404b06f6915ed76150739057 Mon Sep 17 00:00:00 2001
2From: NeilBrown <neilb@suse.de>
3Date: Thu, 31 May 2012 15:39:11 +1000
4Subject: md: raid1/raid10: fix problem with merge_bvec_fn
5
6From: NeilBrown <neilb@suse.de>
7
8commit aba336bd1d46d6b0404b06f6915ed76150739057 upstream.
9
10The new merge_bvec_fn which calls the corresponding function
11in subsidiary devices requires that mddev->merge_check_needed
12be set if any child has a merge_bvec_fn.
13
14However were were only setting that when a device was hot-added,
15not when a device was present from the start.
16
17This bug was introduced in 3.4 so patch is suitable for 3.4.y
18kernels. However that are conflicts in raid10.c so a separate
19patch will be needed for 3.4.y.
20
21Reported-by: Sebastian Riemer <sebastian.riemer@profitbricks.com>
22Signed-off-by: NeilBrown <neilb@suse.de>
23Signed-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);