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