* [PATCH 0/3] md: raid helper cleanups
@ 2026-08-27 7:56 Li Youhong
2026-08-27 7:56 ` [PATCH 1/3] md: add rdev_record_write_error() helper Li Youhong
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Li Youhong @ 2026-08-27 7:56 UTC (permalink / raw)
To: song, yukuai; +Cc: magiclinan, xiao, linux-raid, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
This series factors a few repeated md/raid patterns into small helpers.
There is no intentional behaviour change; each patch is a mechanical
extract of existing logic.
Patch 1 adds rdev_record_write_error() in md.h for the
WriteErrorSeen + WantReplacement + MD_RECOVERY_NEEDED sequence shared by
raid1, raid10 and raid5.
Patches 2 and 3 move raid1/raid10-only helpers into raid1-10.c, which is
#included by both drivers:
- rdev_bb_block_sectors() for the badblocks-aligned block size used in
narrow_write_error()
- flush_bio_list() for the bitmap plug flush path previously duplicated
in raid10's flush_pending_writes() and raid10_unplug()
The helpers in raid1-10.c follow the existing static inline convention
used by raid1_submit_write(), check_decay_read_errors(), and others in
that file.
Li Youhong (3):
md: add rdev_record_write_error() helper
md/raid1-10: add rdev_bb_block_sectors() helper
md/raid1-10: share flush_bio_list between raid1 and raid10
---
drivers/md/md.h | 7 +++++++
drivers/md/raid1-10.c | 27 +++++++++++++++++++++++++++
drivers/md/raid1.c | 42 +++++++-----------------------------------
drivers/md/raid10.c | 50 +++++++-------------------------------------------
drivers/md/raid5.c | 5 +----
5 files changed, 48 insertions(+), 83 deletions(-)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] md: add rdev_record_write_error() helper
2026-08-27 7:56 [PATCH 0/3] md: raid helper cleanups Li Youhong
@ 2026-08-27 7:56 ` Li Youhong
2026-08-27 7:56 ` [PATCH 2/3] md/raid1-10: add rdev_bb_block_sectors() helper Li Youhong
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Li Youhong @ 2026-08-27 7:56 UTC (permalink / raw)
To: song, yukuai; +Cc: magiclinan, xiao, linux-raid, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
The WriteErrorSeen + WantReplacement + MD_RECOVERY_NEEDED sequence is
duplicated across raid1, raid10 and raid5. Factor it into a small
inline helper for readability. No functional change.
Signed-off-by: Li Youhong <liyouhong@kylinos.cn>
---
drivers/md/md.h | 7 +++++++
drivers/md/raid1.c | 16 +++-------------
drivers/md/raid10.c | 21 ++++-----------------
drivers/md/raid5.c | 5 +----
4 files changed, 15 insertions(+), 34 deletions(-)
diff --git a/drivers/md/md.h b/drivers/md/md.h
index b6d2e8929a0f..6440da292105 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -989,6 +989,13 @@ static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
}
}
+static inline void rdev_record_write_error(struct md_rdev *rdev)
+{
+ set_bit(WriteErrorSeen, &rdev->flags);
+ if (!test_and_set_bit(WantReplacement, &rdev->flags))
+ set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
+}
+
static inline int mddev_is_clustered(struct mddev *mddev)
{
return mddev->cluster_info && mddev->bitmap_info.nodes > 1;
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index f0646fb24371..9d8441348f14 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -483,10 +483,7 @@ static void raid1_end_write_request(struct bio *bio)
* 'one mirror IO has finished' event handler:
*/
if (bio->bi_status && !ignore_error) {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED, &
- conf->mddev->recovery);
+ rdev_record_write_error(rdev);
if (test_bit(FailFast, &rdev->flags) &&
(bio->bi_opf & MD_FAILFAST) &&
@@ -2067,10 +2064,7 @@ static void end_sync_write(struct bio *bio)
if (bio->bi_status) {
abort_sync_write(mddev, r1_bio);
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED, &
- mddev->recovery);
+ rdev_record_write_error(rdev);
set_bit(R1BIO_WriteError, &r1_bio->state);
} else if (rdev_has_badblock(rdev, r1_bio->sector, r1_bio->sectors) &&
!rdev_has_badblock(conf->mirrors[r1_bio->read_disk].rdev,
@@ -2088,11 +2082,7 @@ static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector,
/* success */
return 1;
if (rw == REQ_OP_WRITE) {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement,
- &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED, &
- rdev->mddev->recovery);
+ rdev_record_write_error(rdev);
}
/* need to record an error - either for the block or the device */
rdev_set_badblocks(rdev, sector, sectors, 0);
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 1093c798d9dd..c4218d6483ed 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -496,10 +496,7 @@ static void raid10_end_write_request(struct bio *bio)
*/
md_error(rdev->mddev, rdev);
else {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED,
- &rdev->mddev->recovery);
+ rdev_record_write_error(rdev);
dec_rdev = 0;
if (test_bit(FailFast, &rdev->flags) &&
@@ -2299,10 +2296,7 @@ static void end_sync_write(struct bio *bio)
if (repl)
md_error(mddev, rdev);
else {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED,
- &rdev->mddev->recovery);
+ rdev_record_write_error(rdev);
set_bit(R10BIO_WriteError, &r10_bio->state);
}
} else if (rdev_has_badblock(rdev, r10_bio->devs[slot].addr,
@@ -2500,11 +2494,7 @@ static void fix_recovery_read_error(struct r10bio *r10_bio)
pages[idx],
REQ_OP_WRITE, false);
if (!ok) {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement,
- &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED,
- &rdev->mddev->recovery);
+ rdev_record_write_error(rdev);
}
}
if (!ok) {
@@ -2585,10 +2575,7 @@ static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
/* success */
return 1;
if (op == REQ_OP_WRITE) {
- set_bit(WriteErrorSeen, &rdev->flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED,
- &rdev->mddev->recovery);
+ rdev_record_write_error(rdev);
}
/* need to record an error - either for the block or the device */
rdev_set_badblocks(rdev, sector, sectors, 0);
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index b91545ce090d..caacc06c52c5 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -2888,11 +2888,8 @@ static void raid5_end_write_request(struct bio *bi)
set_bit(R5_MadeGoodRepl, &sh->dev[i].flags);
} else {
if (bi->bi_status) {
- set_bit(WriteErrorSeen, &rdev->flags);
+ rdev_record_write_error(rdev);
set_bit(R5_WriteError, &sh->dev[i].flags);
- if (!test_and_set_bit(WantReplacement, &rdev->flags))
- set_bit(MD_RECOVERY_NEEDED,
- &rdev->mddev->recovery);
} else if (rdev_has_badblock(rdev, sh->sector,
RAID5_STRIPE_SECTORS(conf))) {
set_bit(R5_MadeGood, &sh->dev[i].flags);
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] md/raid1-10: add rdev_bb_block_sectors() helper
2026-08-27 7:56 [PATCH 0/3] md: raid helper cleanups Li Youhong
2026-08-27 7:56 ` [PATCH 1/3] md: add rdev_record_write_error() helper Li Youhong
@ 2026-08-27 7:56 ` Li Youhong
2026-08-27 8:15 ` sashiko-bot
2026-08-27 7:56 ` [PATCH 3/3] md/raid1-10: share flush_bio_list between raid1 and raid10 Li Youhong
2026-09-05 2:43 ` [PATCH 0/3] md: raid helper cleanups yu kuai
3 siblings, 1 reply; 6+ messages in thread
From: Li Youhong @ 2026-08-27 7:56 UTC (permalink / raw)
To: song, yukuai; +Cc: magiclinan, xiao, linux-raid, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
raid1 and raid10 narrow_write_error() use the same logic to compute the
badblocks-aligned block size. Factor it into an inline helper in
raid1-10.c. No functional change.
Signed-off-by: Li Youhong <liyouhong@kylinos.cn>
---
drivers/md/raid1-10.c | 10 ++++++++++
drivers/md/raid1.c | 7 +------
drivers/md/raid10.c | 7 +------
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c
index 3b0e230692ba..c7ddf136771d 100644
--- a/drivers/md/raid1-10.c
+++ b/drivers/md/raid1-10.c
@@ -155,6 +155,16 @@ static inline bool raid1_add_bio_to_plug(struct mddev *mddev, struct bio *bio,
return true;
}
+/* Block size used when narrowing a write error down to badblocks granularity. */
+static inline int rdev_bb_block_sectors(struct md_rdev *rdev)
+{
+ int lbs = bdev_logical_block_size(rdev->bdev) >> 9;
+
+ if (rdev->badblocks.shift < 0)
+ return lbs;
+ return roundup(1 << rdev->badblocks.shift, lbs);
+}
+
/*
* current->bio_list will be set under submit_bio() context, in this case bitmap
* io will be added to the list and wait for current io submission to finish,
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 9d8441348f14..8a40c69d70a3 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -2465,16 +2465,11 @@ static void narrow_write_error(struct r1bio *r1_bio, int i)
* We currently own a reference on the rdev.
*/
- int block_sectors, lbs = bdev_logical_block_size(rdev->bdev) >> 9;
+ int block_sectors = rdev_bb_block_sectors(rdev);
sector_t sector;
int sectors;
int sect_to_write = r1_bio->sectors;
- if (rdev->badblocks.shift < 0)
- block_sectors = lbs;
- else
- block_sectors = roundup(1 << rdev->badblocks.shift, lbs);
-
sector = r1_bio->sector;
sectors = ((sector + block_sectors)
& ~(sector_t)(block_sectors - 1))
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index c4218d6483ed..5b1dbb0b7f5a 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -2762,16 +2762,11 @@ static void narrow_write_error(struct r10bio *r10_bio, int i)
* We currently own a reference to the rdev.
*/
- int block_sectors, lbs = bdev_logical_block_size(rdev->bdev) >> 9;
+ int block_sectors = rdev_bb_block_sectors(rdev);
sector_t sector;
int sectors;
int sect_to_write = r10_bio->sectors;
- if (rdev->badblocks.shift < 0)
- block_sectors = lbs;
- else
- block_sectors = roundup(1 << rdev->badblocks.shift, lbs);
-
sector = r10_bio->sector;
sectors = ((r10_bio->sector + block_sectors)
& ~(sector_t)(block_sectors - 1))
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] md/raid1-10: share flush_bio_list between raid1 and raid10
2026-08-27 7:56 [PATCH 0/3] md: raid helper cleanups Li Youhong
2026-08-27 7:56 ` [PATCH 1/3] md: add rdev_record_write_error() helper Li Youhong
2026-08-27 7:56 ` [PATCH 2/3] md/raid1-10: add rdev_bb_block_sectors() helper Li Youhong
@ 2026-08-27 7:56 ` Li Youhong
2026-09-05 2:43 ` [PATCH 0/3] md: raid helper cleanups yu kuai
3 siblings, 0 replies; 6+ messages in thread
From: Li Youhong @ 2026-08-27 7:56 UTC (permalink / raw)
To: song, yukuai; +Cc: magiclinan, xiao, linux-raid, Li Youhong
From: Li Youhong <liyouhong@kylinos.cn>
raid1 already had flush_bio_list(); raid10 open-coded the same
prepare/wake/submit loop in flush_pending_writes() and
raid10_unplug(). Move a shared helper into raid1-10.c.
The shared helper uses wq_has_sleeper() before wake_up(), matching
raid1's wake_up_barrier() and raid10_unplug(). No intentional
functional change.
Signed-off-by: Li Youhong <liyouhong@kylinos.cn>
---
drivers/md/raid1-10.c | 17 +++++++++++++++++
drivers/md/raid1.c | 19 ++-----------------
drivers/md/raid10.c | 22 ++--------------------
3 files changed, 21 insertions(+), 37 deletions(-)
diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c
index c7ddf136771d..476682110ea3 100644
--- a/drivers/md/raid1-10.c
+++ b/drivers/md/raid1-10.c
@@ -176,6 +176,23 @@ static inline void raid1_prepare_flush_writes(struct mddev *mddev)
mddev->bitmap_ops->unplug(mddev, current->bio_list == NULL);
}
+static inline void flush_bio_list(struct mddev *mddev, struct bio *bio,
+ wait_queue_head_t *wait)
+{
+ /* flush any pending bitmap writes to disk before proceeding w/ I/O */
+ raid1_prepare_flush_writes(mddev);
+ if (wq_has_sleeper(wait))
+ wake_up(wait);
+
+ while (bio) { /* submit pending writes */
+ struct bio *next = bio->bi_next;
+
+ raid1_submit_write(bio);
+ bio = next;
+ cond_resched();
+ }
+}
+
/*
* Used by fix_read_error() to decay the per rdev read_errors.
* We halve the read error count for every hour that has elapsed
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 8a40c69d70a3..894efb50c6d5 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -919,21 +919,6 @@ static void wake_up_barrier(struct r1conf *conf)
wake_up(&conf->wait_barrier);
}
-static void flush_bio_list(struct r1conf *conf, struct bio *bio)
-{
- /* flush any pending bitmap writes to disk before proceeding w/ I/O */
- raid1_prepare_flush_writes(conf->mddev);
- wake_up_barrier(conf);
-
- while (bio) { /* submit pending writes */
- struct bio *next = bio->bi_next;
-
- raid1_submit_write(bio);
- bio = next;
- cond_resched();
- }
-}
-
static void flush_pending_writes(struct r1conf *conf)
{
/* Any writes that have been queued but are awaiting
@@ -959,7 +944,7 @@ static void flush_pending_writes(struct r1conf *conf)
*/
__set_current_state(TASK_RUNNING);
blk_start_plug(&plug);
- flush_bio_list(conf, bio);
+ flush_bio_list(conf->mddev, bio, &conf->wait_barrier);
blk_finish_plug(&plug);
} else
spin_unlock_irq(&conf->device_lock);
@@ -1289,7 +1274,7 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule)
/* we aren't scheduling, so we can do the write-out directly. */
bio = bio_list_get(&plug->pending);
- flush_bio_list(conf, bio);
+ flush_bio_list(conf->mddev, bio, &conf->wait_barrier);
kfree(plug);
}
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 5b1dbb0b7f5a..85d2c9364565 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -895,16 +895,7 @@ static void flush_pending_writes(struct r10conf *conf)
__set_current_state(TASK_RUNNING);
blk_start_plug(&plug);
- raid1_prepare_flush_writes(conf->mddev);
- wake_up(&conf->wait_barrier);
-
- while (bio) { /* submit pending writes */
- struct bio *next = bio->bi_next;
-
- raid1_submit_write(bio);
- bio = next;
- cond_resched();
- }
+ flush_bio_list(conf->mddev, bio, &conf->wait_barrier);
blk_finish_plug(&plug);
} else
spin_unlock_irq(&conf->device_lock);
@@ -1101,16 +1092,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule)
/* we aren't scheduling, so we can do the write-out directly. */
bio = bio_list_get(&plug->pending);
- raid1_prepare_flush_writes(mddev);
- wake_up_barrier(conf);
-
- while (bio) { /* submit pending writes */
- struct bio *next = bio->bi_next;
-
- raid1_submit_write(bio);
- bio = next;
- cond_resched();
- }
+ flush_bio_list(mddev, bio, &conf->wait_barrier);
kfree(plug);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/3] md/raid1-10: add rdev_bb_block_sectors() helper
2026-08-27 7:56 ` [PATCH 2/3] md/raid1-10: add rdev_bb_block_sectors() helper Li Youhong
@ 2026-08-27 8:15 ` sashiko-bot
0 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-08-27 8:15 UTC (permalink / raw)
To: Li Youhong; +Cc: linux-raid, yukuai
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Converting a data-less bio (e.g., REQ_OP_SECURE_ERASE) to REQ_OP_WRITE causes a NULL pointer dereference in error handling.
--
commit 7d28d3b35b9395eb9bc70edade7e6a8cd0c8563e
Author: Li Youhong <liyouhong@kylinos.cn>
md/raid1-10: add rdev_bb_block_sectors() helper
This commit factors out the badblocks-aligned block size computation
logic used in both RAID1 and RAID10 into a new inline helper function,
rdev_bb_block_sectors(). The refactoring simplifies narrow_write_error()
in both drivers.
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index 9d8441348f14a..8a40c69d70a37 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -2465,16 +2465,11 @@ static void narrow_write_error(struct r1bio *r1_bio, int i)
> * We currently own a reference on the rdev.
> */
>
> - int block_sectors, lbs = bdev_logical_block_size(rdev->bdev) >> 9;
> + int block_sectors = rdev_bb_block_sectors(rdev);
[Severity: High]
This is a pre-existing issue, but while reviewing the refactoring in
narrow_write_error(), I noticed a potential problem further down in the
function.
If a dataless write operation such as REQ_OP_SECURE_ERASE is issued and fails
on an underlying drive, the error handling path clones the failing dataless
master bio (which lacks data buffers and has bi_io_vec == NULL) and does the
following:
drivers/md/raid1.c:narrow_write_error() {
...
wbio->bi_opf = REQ_OP_WRITE;
wbio->bi_iter.bi_sector = r1_bio->sector;
wbio->bi_iter.bi_size = r1_bio->sectors << 9;
...
}
By unconditionally setting REQ_OP_WRITE without providing a data vector, does
this turn a dataless operation into an illegal write?
When this modified bio is trimmed or submitted to the block layer, the block
core and underlying drivers will treat it as a standard data-carrying write
and attempt to iterate over its missing data bvecs. Can this cause a NULL
pointer dereference and kernel panic?
The exact same buggy behavior also exists in raid10 error handling:
drivers/md/raid10.c:narrow_write_error() {
...
wbio->bi_iter.bi_sector = wsector +
choose_data_offset(r10_bio, rdev);
wbio->bi_opf = REQ_OP_WRITE;
...
}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260827075620.3599227-1-dayou5941@163.com?part=2
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 0/3] md: raid helper cleanups
2026-08-27 7:56 [PATCH 0/3] md: raid helper cleanups Li Youhong
` (2 preceding siblings ...)
2026-08-27 7:56 ` [PATCH 3/3] md/raid1-10: share flush_bio_list between raid1 and raid10 Li Youhong
@ 2026-09-05 2:43 ` yu kuai
3 siblings, 0 replies; 6+ messages in thread
From: yu kuai @ 2026-09-05 2:43 UTC (permalink / raw)
To: Li Youhong, song, yu kuai; +Cc: magiclinan, xiao, linux-raid, Li Youhong
在 2026/8/27 15:56, Li Youhong 写道:
> From: Li Youhong <liyouhong@kylinos.cn>
>
> This series factors a few repeated md/raid patterns into small helpers.
> There is no intentional behaviour change; each patch is a mechanical
> extract of existing logic.
>
> Patch 1 adds rdev_record_write_error() in md.h for the
> WriteErrorSeen + WantReplacement + MD_RECOVERY_NEEDED sequence shared by
> raid1, raid10 and raid5.
>
> Patches 2 and 3 move raid1/raid10-only helpers into raid1-10.c, which is
> #included by both drivers:
>
> - rdev_bb_block_sectors() for the badblocks-aligned block size used in
> narrow_write_error()
> - flush_bio_list() for the bitmap plug flush path previously duplicated
> in raid10's flush_pending_writes() and raid10_unplug()
>
> The helpers in raid1-10.c follow the existing static inline convention
> used by raid1_submit_write(), check_decay_read_errors(), and others in
> that file.
>
> Li Youhong (3):
> md: add rdev_record_write_error() helper
> md/raid1-10: add rdev_bb_block_sectors() helper
> md/raid1-10: share flush_bio_list between raid1 and raid10
> ---
> drivers/md/md.h | 7 +++++++
> drivers/md/raid1-10.c | 27 +++++++++++++++++++++++++++
> drivers/md/raid1.c | 42 +++++++-----------------------------------
> drivers/md/raid10.c | 50 +++++++-------------------------------------------
> drivers/md/raid5.c | 5 +----
> 5 files changed, 48 insertions(+), 83 deletions(-)
Reviewed-by: Yu Kuai <yukuai@fygo.io>
Noted only bug fix can be accepted for current merge window, cleanup patches
will be applied later for 6.4.
--
Thanks,
Kuai
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-05 2:44 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-27 7:56 [PATCH 0/3] md: raid helper cleanups Li Youhong
2026-08-27 7:56 ` [PATCH 1/3] md: add rdev_record_write_error() helper Li Youhong
2026-08-27 7:56 ` [PATCH 2/3] md/raid1-10: add rdev_bb_block_sectors() helper Li Youhong
2026-08-27 8:15 ` sashiko-bot
2026-08-27 7:56 ` [PATCH 3/3] md/raid1-10: share flush_bio_list between raid1 and raid10 Li Youhong
2026-09-05 2:43 ` [PATCH 0/3] md: raid helper cleanups yu kuai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox