1 | From: Yu Kuai <yukuai3@huawei.com> | 1 | From: Yu Kuai <yukuai3@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | This set fix reported problem: | 3 | Changes in v2: |
4 | 4 | - add commit message in patch 2; | |
5 | https://lore.kernel.org/all/CAJpMwyjmHQLvm6zg1cmQErttNNQPDAAXPKM3xgTjMhbfts986Q@mail.gmail.com/ | 5 | - also remove unsed flags in patch 2; |
6 | https://lore.kernel.org/all/ADF7D720-5764-4AF3-B68E-1845988737AA@flyingcircus.io/ | 6 | - handle rehspae in patch 4; |
7 | |||
8 | See details in patch 5. | ||
9 | 7 | ||
10 | Yu Kuai (5): | 8 | Yu Kuai (5): |
11 | md/md-bitmap: factor behind write counters out from | 9 | md/md-bitmap: factor behind write counters out from |
12 | bitmap_{start/end}write() | 10 | bitmap_{start/end}write() |
13 | md/md-bitmap: remove the last parameter for bimtap_ops->endwrite() | 11 | md/md-bitmap: remove the last parameter for bimtap_ops->endwrite() |
14 | md: add a new callback pers->bitmap_sector() | 12 | md: add a new callback pers->bitmap_sector() |
15 | md/raid5: implement pers->bitmap_sector() | 13 | md/raid5: implement pers->bitmap_sector() |
16 | md/md-bitmap: move bitmap_{start, end}write to md upper layer | 14 | md/md-bitmap: move bitmap_{start, end}write to md upper layer |
17 | 15 | ||
18 | drivers/md/md-bitmap.c | 74 ++++++++++++++++---------- | 16 | drivers/md/md-bitmap.c | 74 ++++++++------ |
19 | drivers/md/md-bitmap.h | 7 ++- | 17 | drivers/md/md-bitmap.h | 7 +- |
20 | drivers/md/md.c | 29 ++++++++++ | 18 | drivers/md/md.c | 29 ++++++ |
21 | drivers/md/md.h | 5 ++ | 19 | drivers/md/md.h | 5 + |
22 | drivers/md/raid1.c | 34 +++--------- | 20 | drivers/md/raid1.c | 34 ++----- |
23 | drivers/md/raid1.h | 1 - | 21 | drivers/md/raid1.h | 1 - |
24 | drivers/md/raid10.c | 26 +-------- | 22 | drivers/md/raid10.c | 26 +---- |
25 | drivers/md/raid10.h | 1 - | 23 | drivers/md/raid10.h | 1 - |
26 | drivers/md/raid5-cache.c | 4 -- | 24 | drivers/md/raid5-cache.c | 4 - |
27 | drivers/md/raid5.c | 111 ++++++++++++++++++++------------------- | 25 | drivers/md/raid5.c | 205 ++++++++++++++++++++------------------- |
28 | drivers/md/raid5.h | 4 -- | 26 | drivers/md/raid5.h | 4 - |
29 | 11 files changed, 149 insertions(+), 147 deletions(-) | 27 | 11 files changed, 196 insertions(+), 194 deletions(-) |
30 | 28 | ||
31 | -- | 29 | -- |
32 | 2.39.2 | 30 | 2.39.2 | diff view generated by jsdifflib |
1 | From: Yu Kuai <yukuai3@huawei.com> | 1 | From: Yu Kuai <yukuai3@huawei.com> |
---|---|---|---|
2 | |||
3 | commit 08c50142a128dcb2d7060aa3b4c5db8837f7a46a upstream. | ||
4 | 2 | ||
5 | behind_write is only used in raid1, prepare to refactor | 3 | behind_write is only used in raid1, prepare to refactor |
6 | bitmap_{start/end}write(), there are no functional changes. | 4 | bitmap_{start/end}write(), there are no functional changes. |
7 | 5 | ||
8 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> | 6 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> |
9 | Reviewed-by: Xiao Ni <xni@redhat.com> | 7 | Reviewed-by: Xiao Ni <xni@redhat.com> |
10 | Link: https://lore.kernel.org/r/20250109015145.158868-2-yukuai1@huaweicloud.com | ||
11 | Signed-off-by: Song Liu <song@kernel.org> | ||
12 | --- | 8 | --- |
13 | drivers/md/md-bitmap.c | 57 +++++++++++++++++++++++++--------------- | 9 | drivers/md/md-bitmap.c | 57 +++++++++++++++++++++++++--------------- |
14 | drivers/md/md-bitmap.h | 7 +++-- | 10 | drivers/md/md-bitmap.h | 7 +++-- |
15 | drivers/md/raid1.c | 12 +++++---- | 11 | drivers/md/raid1.c | 12 +++++---- |
16 | drivers/md/raid10.c | 6 ++--- | 12 | drivers/md/raid10.c | 6 ++--- |
... | ... | diff view generated by jsdifflib |
1 | From: Yu Kuai <yukuai3@huawei.com> | 1 | From: Yu Kuai <yukuai3@huawei.com> |
---|---|---|---|
2 | |||
3 | commit 4f0e7d0e03b7b80af84759a9e7cfb0f81ac4adae upstream. | ||
4 | 2 | ||
5 | For the case that IO failed for one rdev, the bit will be mark as NEEDED | 3 | For the case that IO failed for one rdev, the bit will be mark as NEEDED |
6 | in following cases: | 4 | in following cases: |
7 | 5 | ||
8 | 1) If badblocks is set and rdev is not faulty; | 6 | 1) If badblocks is set and rdev is not faulty; |
... | ... | ||
13 | 11 | ||
14 | Also remove R1BIO_Degraded, R10BIO_Degraded and STRIPE_DEGRADED since | 12 | Also remove R1BIO_Degraded, R10BIO_Degraded and STRIPE_DEGRADED since |
15 | case 2) no longer use them. | 13 | case 2) no longer use them. |
16 | 14 | ||
17 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> | 15 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> |
18 | Link: https://lore.kernel.org/r/20250109015145.158868-3-yukuai1@huaweicloud.com | ||
19 | Signed-off-by: Song Liu <song@kernel.org> | ||
20 | --- | 16 | --- |
21 | drivers/md/md-bitmap.c | 19 ++++++++++--------- | 17 | drivers/md/md-bitmap.c | 19 ++++++++++--------- |
22 | drivers/md/md-bitmap.h | 2 +- | 18 | drivers/md/md-bitmap.h | 2 +- |
23 | drivers/md/raid1.c | 26 +++----------------------- | 19 | drivers/md/raid1.c | 26 +++----------------------- |
24 | drivers/md/raid1.h | 1 - | 20 | drivers/md/raid1.h | 1 - |
... | ... | ||
102 | - set_bit(R1BIO_Degraded, &r1_bio->state); | 98 | - set_bit(R1BIO_Degraded, &r1_bio->state); |
103 | /* Finished with this branch */ | 99 | /* Finished with this branch */ |
104 | r1_bio->bios[mirror] = NULL; | 100 | r1_bio->bios[mirror] = NULL; |
105 | to_put = bio; | 101 | to_put = bio; |
106 | @@ -XXX,XX +XXX,XX @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, | 102 | @@ -XXX,XX +XXX,XX @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, |
107 | break; | 103 | write_behind = true; |
108 | } | 104 | |
109 | r1_bio->bios[i] = NULL; | 105 | r1_bio->bios[i] = NULL; |
110 | - if (!rdev || test_bit(Faulty, &rdev->flags)) { | 106 | - if (!rdev || test_bit(Faulty, &rdev->flags)) { |
111 | - if (i < conf->raid_disks) | 107 | - if (i < conf->raid_disks) |
112 | - set_bit(R1BIO_Degraded, &r1_bio->state); | 108 | - set_bit(R1BIO_Degraded, &r1_bio->state); |
113 | + if (!rdev || test_bit(Faulty, &rdev->flags)) | 109 | + if (!rdev || test_bit(Faulty, &rdev->flags)) |
... | ... | diff view generated by jsdifflib |
1 | From: Yu Kuai <yukuai3@huawei.com> | 1 | From: Yu Kuai <yukuai3@huawei.com> |
---|---|---|---|
2 | |||
3 | commit 0c984a283a3ea3f10bebecd6c57c1d41b2e4f518 upstream. | ||
4 | 2 | ||
5 | This callback will be used in raid5 to convert io ranges from array to | 3 | This callback will be used in raid5 to convert io ranges from array to |
6 | bitmap. | 4 | bitmap. |
7 | 5 | ||
8 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> | 6 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> |
9 | Reviewed-by: Xiao Ni <xni@redhat.com> | 7 | Reviewed-by: Xiao Ni <xni@redhat.com> |
10 | Link: https://lore.kernel.org/r/20250109015145.158868-4-yukuai1@huaweicloud.com | ||
11 | Signed-off-by: Song Liu <song@kernel.org> | ||
12 | --- | 8 | --- |
13 | drivers/md/md.h | 3 +++ | 9 | drivers/md/md.h | 3 +++ |
14 | 1 file changed, 3 insertions(+) | 10 | 1 file changed, 3 insertions(+) |
15 | 11 | ||
16 | diff --git a/drivers/md/md.h b/drivers/md/md.h | 12 | diff --git a/drivers/md/md.h b/drivers/md/md.h |
... | ... | diff view generated by jsdifflib |
1 | From: Yu Kuai <yukuai3@huawei.com> | 1 | From: Yu Kuai <yukuai3@huawei.com> |
---|---|---|---|
2 | |||
3 | commit 9c89f604476cf15c31fbbdb043cff7fbf1dbe0cb upstream. | ||
4 | 2 | ||
5 | Bitmap is used for the whole array for raid1/raid10, hence IO for the | 3 | Bitmap is used for the whole array for raid1/raid10, hence IO for the |
6 | array can be used directly for bitmap. However, bitmap is used for | 4 | array can be used directly for bitmap. However, bitmap is used for |
7 | underlying disks for raid5, hence IO for the array can't be used | 5 | underlying disks for raid5, hence IO for the array can't be used |
8 | directly for bitmap. | 6 | directly for bitmap. |
9 | 7 | ||
10 | Implement pers->bitmap_sector() for raid5 to convert IO ranges from the | 8 | Implement pers->bitmap_sector() for raid5 to convert IO ranges from the |
11 | array to the underlying disks. | 9 | array to the underlying disks. |
12 | 10 | ||
13 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> | 11 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> |
14 | Link: https://lore.kernel.org/r/20250109015145.158868-5-yukuai1@huaweicloud.com | ||
15 | Signed-off-by: Song Liu <song@kernel.org> | ||
16 | --- | 12 | --- |
17 | drivers/md/raid5.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ | 13 | drivers/md/raid5.c | 145 ++++++++++++++++++++++++++++++--------------- |
18 | 1 file changed, 51 insertions(+) | 14 | 1 file changed, 98 insertions(+), 47 deletions(-) |
19 | 15 | ||
20 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | 16 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
21 | index XXXXXXX..XXXXXXX 100644 | 17 | index XXXXXXX..XXXXXXX 100644 |
22 | --- a/drivers/md/raid5.c | 18 | --- a/drivers/md/raid5.c |
23 | +++ b/drivers/md/raid5.c | 19 | +++ b/drivers/md/raid5.c |
24 | @@ -XXX,XX +XXX,XX @@ static enum reshape_loc get_reshape_loc(struct mddev *mddev, | 20 | @@ -XXX,XX +XXX,XX @@ |
25 | return LOC_BEHIND_RESHAPE; | 21 | |
22 | #define RAID5_MAX_REQ_STRIPES 256 | ||
23 | |||
24 | +enum reshape_loc { | ||
25 | + LOC_NO_RESHAPE, | ||
26 | + LOC_AHEAD_OF_RESHAPE, | ||
27 | + LOC_INSIDE_RESHAPE, | ||
28 | + LOC_BEHIND_RESHAPE, | ||
29 | +}; | ||
30 | + | ||
31 | static bool devices_handle_discard_safely = false; | ||
32 | module_param(devices_handle_discard_safely, bool, 0644); | ||
33 | MODULE_PARM_DESC(devices_handle_discard_safely, | ||
34 | @@ -XXX,XX +XXX,XX @@ static void raid5_error(struct mddev *mddev, struct md_rdev *rdev) | ||
35 | r5c_update_on_rdev_error(mddev, rdev); | ||
26 | } | 36 | } |
27 | 37 | ||
38 | +static bool ahead_of_reshape(struct mddev *mddev, sector_t sector, | ||
39 | + sector_t reshape_sector) | ||
40 | +{ | ||
41 | + return mddev->reshape_backwards ? sector < reshape_sector : | ||
42 | + sector >= reshape_sector; | ||
43 | +} | ||
44 | + | ||
45 | +static bool range_ahead_of_reshape(struct mddev *mddev, sector_t min, | ||
46 | + sector_t max, sector_t reshape_sector) | ||
47 | +{ | ||
48 | + return mddev->reshape_backwards ? max < reshape_sector : | ||
49 | + min >= reshape_sector; | ||
50 | +} | ||
51 | + | ||
52 | +static enum reshape_loc get_reshape_loc(struct mddev *mddev, | ||
53 | + struct r5conf *conf, sector_t logical_sector) | ||
54 | +{ | ||
55 | + sector_t reshape_progress, reshape_safe; | ||
56 | + /* | ||
57 | + * Spinlock is needed as reshape_progress may be | ||
58 | + * 64bit on a 32bit platform, and so it might be | ||
59 | + * possible to see a half-updated value | ||
60 | + * Of course reshape_progress could change after | ||
61 | + * the lock is dropped, so once we get a reference | ||
62 | + * to the stripe that we think it is, we will have | ||
63 | + * to check again. | ||
64 | + */ | ||
65 | + spin_lock_irq(&conf->device_lock); | ||
66 | + reshape_progress = conf->reshape_progress; | ||
67 | + reshape_safe = conf->reshape_safe; | ||
68 | + spin_unlock_irq(&conf->device_lock); | ||
69 | + if (reshape_progress == MaxSector) | ||
70 | + return LOC_NO_RESHAPE; | ||
71 | + if (ahead_of_reshape(mddev, logical_sector, reshape_progress)) | ||
72 | + return LOC_AHEAD_OF_RESHAPE; | ||
73 | + if (ahead_of_reshape(mddev, logical_sector, reshape_safe)) | ||
74 | + return LOC_INSIDE_RESHAPE; | ||
75 | + return LOC_BEHIND_RESHAPE; | ||
76 | +} | ||
77 | + | ||
28 | +static void raid5_bitmap_sector(struct mddev *mddev, sector_t *offset, | 78 | +static void raid5_bitmap_sector(struct mddev *mddev, sector_t *offset, |
29 | + unsigned long *sectors) | 79 | + unsigned long *sectors) |
30 | +{ | 80 | +{ |
31 | + struct r5conf *conf = mddev->private; | 81 | + struct r5conf *conf = mddev->private; |
32 | + sector_t start = *offset; | 82 | + sector_t start = *offset; |
... | ... | ||
71 | + */ | 121 | + */ |
72 | + *offset = min(start, prev_start); | 122 | + *offset = min(start, prev_start); |
73 | + *sectors = max(end, prev_end) - *offset; | 123 | + *sectors = max(end, prev_end) - *offset; |
74 | +} | 124 | +} |
75 | + | 125 | + |
126 | /* | ||
127 | * Input: a 'big' sector number, | ||
128 | * Output: index of the data and parity disk, and the sector # in them. | ||
129 | @@ -XXX,XX +XXX,XX @@ static void make_discard_request(struct mddev *mddev, struct bio *bi) | ||
130 | bio_endio(bi); | ||
131 | } | ||
132 | |||
133 | -static bool ahead_of_reshape(struct mddev *mddev, sector_t sector, | ||
134 | - sector_t reshape_sector) | ||
135 | -{ | ||
136 | - return mddev->reshape_backwards ? sector < reshape_sector : | ||
137 | - sector >= reshape_sector; | ||
138 | -} | ||
139 | - | ||
140 | -static bool range_ahead_of_reshape(struct mddev *mddev, sector_t min, | ||
141 | - sector_t max, sector_t reshape_sector) | ||
142 | -{ | ||
143 | - return mddev->reshape_backwards ? max < reshape_sector : | ||
144 | - min >= reshape_sector; | ||
145 | -} | ||
146 | - | ||
147 | static bool stripe_ahead_of_reshape(struct mddev *mddev, struct r5conf *conf, | ||
148 | struct stripe_head *sh) | ||
149 | { | ||
150 | @@ -XXX,XX +XXX,XX @@ static int add_all_stripe_bios(struct r5conf *conf, | ||
151 | return 1; | ||
152 | } | ||
153 | |||
154 | -enum reshape_loc { | ||
155 | - LOC_NO_RESHAPE, | ||
156 | - LOC_AHEAD_OF_RESHAPE, | ||
157 | - LOC_INSIDE_RESHAPE, | ||
158 | - LOC_BEHIND_RESHAPE, | ||
159 | -}; | ||
160 | - | ||
161 | -static enum reshape_loc get_reshape_loc(struct mddev *mddev, | ||
162 | - struct r5conf *conf, sector_t logical_sector) | ||
163 | -{ | ||
164 | - sector_t reshape_progress, reshape_safe; | ||
165 | - /* | ||
166 | - * Spinlock is needed as reshape_progress may be | ||
167 | - * 64bit on a 32bit platform, and so it might be | ||
168 | - * possible to see a half-updated value | ||
169 | - * Of course reshape_progress could change after | ||
170 | - * the lock is dropped, so once we get a reference | ||
171 | - * to the stripe that we think it is, we will have | ||
172 | - * to check again. | ||
173 | - */ | ||
174 | - spin_lock_irq(&conf->device_lock); | ||
175 | - reshape_progress = conf->reshape_progress; | ||
176 | - reshape_safe = conf->reshape_safe; | ||
177 | - spin_unlock_irq(&conf->device_lock); | ||
178 | - if (reshape_progress == MaxSector) | ||
179 | - return LOC_NO_RESHAPE; | ||
180 | - if (ahead_of_reshape(mddev, logical_sector, reshape_progress)) | ||
181 | - return LOC_AHEAD_OF_RESHAPE; | ||
182 | - if (ahead_of_reshape(mddev, logical_sector, reshape_safe)) | ||
183 | - return LOC_INSIDE_RESHAPE; | ||
184 | - return LOC_BEHIND_RESHAPE; | ||
185 | -} | ||
186 | - | ||
76 | static enum stripe_result make_stripe_request(struct mddev *mddev, | 187 | static enum stripe_result make_stripe_request(struct mddev *mddev, |
77 | struct r5conf *conf, struct stripe_request_ctx *ctx, | 188 | struct r5conf *conf, struct stripe_request_ctx *ctx, |
78 | sector_t logical_sector, struct bio *bi) | 189 | sector_t logical_sector, struct bio *bi) |
79 | @@ -XXX,XX +XXX,XX @@ static struct md_personality raid6_personality = | 190 | @@ -XXX,XX +XXX,XX @@ static struct md_personality raid6_personality = |
80 | .takeover = raid6_takeover, | 191 | .takeover = raid6_takeover, |
... | ... | diff view generated by jsdifflib |
1 | From: Yu Kuai <yukuai3@huawei.com> | 1 | From: Yu Kuai <yukuai3@huawei.com> |
---|---|---|---|
2 | |||
3 | commit cd5fc653381811f1e0ba65f5d169918cab61476f upstream. | ||
4 | 2 | ||
5 | There are two BUG reports that raid5 will hang at | 3 | There are two BUG reports that raid5 will hang at |
6 | bitmap_startwrite([1],[2]), root cause is that bitmap start write and end | 4 | bitmap_startwrite([1],[2]), root cause is that bitmap start write and end |
7 | write is unbalanced, it's not quite clear where, and while reviewing raid5 | 5 | write is unbalanced, it's not quite clear where, and while reviewing raid5 |
8 | code, it's found that bitmap operations can be optimized. For example, | 6 | code, it's found that bitmap operations can be optimized. For example, |
... | ... | ||
48 | 46 | ||
49 | Also remove STRIPE_BITMAP_PENDING since it's not used anymore. | 47 | Also remove STRIPE_BITMAP_PENDING since it's not used anymore. |
50 | 48 | ||
51 | [1] https://lore.kernel.org/all/CAJpMwyjmHQLvm6zg1cmQErttNNQPDAAXPKM3xgTjMhbfts986Q@mail.gmail.com/ | 49 | [1] https://lore.kernel.org/all/CAJpMwyjmHQLvm6zg1cmQErttNNQPDAAXPKM3xgTjMhbfts986Q@mail.gmail.com/ |
52 | [2] https://lore.kernel.org/all/ADF7D720-5764-4AF3-B68E-1845988737AA@flyingcircus.io/ | 50 | [2] https://lore.kernel.org/all/ADF7D720-5764-4AF3-B68E-1845988737AA@flyingcircus.io/ |
53 | |||
54 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> | 51 | Signed-off-by: Yu Kuai <yukuai3@huawei.com> |
55 | Link: https://lore.kernel.org/r/20250109015145.158868-6-yukuai1@huaweicloud.com | ||
56 | Signed-off-by: Song Liu <song@kernel.org> | ||
57 | --- | 52 | --- |
58 | drivers/md/md.c | 29 +++++++++++++++++++++++ | 53 | drivers/md/md.c | 29 +++++++++++++++++++++++ |
59 | drivers/md/md.h | 2 ++ | 54 | drivers/md/md.h | 2 ++ |
60 | drivers/md/raid1.c | 4 ---- | 55 | drivers/md/raid1.c | 4 ---- |
61 | drivers/md/raid10.c | 3 --- | 56 | drivers/md/raid10.c | 3 --- |
... | ... | diff view generated by jsdifflib |