[PATCH 3/3] md/raid10: improve raid10_end_write_request()

From: linan666
Date: Wed Jun 14 2023 - 04:52:59 EST


From: Li Nan <linan122@xxxxxxxxxx>

Improving the code to prevent excessive nesting by repeated checks of
'repl'. And putting bio after it has been set to IO_MADE_GOOD is more
reasonable.

Signed-off-by: Li Nan <linan122@xxxxxxxxxx>
---
drivers/md/raid10.c | 74 ++++++++++++++++++++++++---------------------
1 file changed, 39 insertions(+), 35 deletions(-)

diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 56206cbd169d..b9f2c841dd9f 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -467,48 +467,51 @@ static void raid10_end_write_request(struct bio *bio)

dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl);

- if (repl)
+ if (repl) {
rdev = r10_bio->devs[slot].replacement;
- else
+ /* replacement may have replaced rdev */
+ if (rdev == conf->mirrors[dev].replacement) {
+ if (bio->bi_status && !discard_error) {
+ /*
+ * Never record new bad blocks to replacement,
+ * just fail it.
+ */
+ md_error(rdev->mddev, rdev);
+ goto out;
+ }
+ }
+ } else {
rdev = r10_bio->devs[slot].rdev;
+ }
/*
* this branch is our 'one mirror IO has finished' event handler:
*/
if (bio->bi_status && !discard_error) {
- /* replacement may have replaced rdev */
- if (repl && rdev == conf->mirrors[dev].replacement)
- /* Never record new bad blocks to replacement,
- * just fail it.
- */
- 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);
+ set_bit(WriteErrorSeen, &rdev->flags);
+ if (!test_and_set_bit(WantReplacement, &rdev->flags))
+ set_bit(MD_RECOVERY_NEEDED,
+ &rdev->mddev->recovery);

- dec_rdev = 0;
- if (test_bit(FailFast, &rdev->flags) &&
- (bio->bi_opf & MD_FAILFAST)) {
- md_error(rdev->mddev, rdev);
- }
+ dec_rdev = 0;
+ if (test_bit(FailFast, &rdev->flags) &&
+ (bio->bi_opf & MD_FAILFAST))
+ md_error(rdev->mddev, rdev);

- /*
- * When the device is faulty, it is not necessary to
- * handle write error.
- */
- if (!test_bit(Faulty, &rdev->flags))
- set_bit(R10BIO_WriteError, &r10_bio->state);
- else {
- /* Fail the request */
- set_bit(R10BIO_Degraded, &r10_bio->state);
- if (repl)
- r10_bio->devs[slot].repl_bio = NULL;
- else
- r10_bio->devs[slot].bio = NULL;
- to_put = bio;
- dec_rdev = 1;
- }
+ /*
+ * When the device is faulty, it is not necessary to
+ * handle write error.
+ */
+ if (!test_bit(Faulty, &rdev->flags)) {
+ set_bit(R10BIO_WriteError, &r10_bio->state);
+ } else {
+ /* Fail the request */
+ set_bit(R10BIO_Degraded, &r10_bio->state);
+ if (repl)
+ r10_bio->devs[slot].repl_bio = NULL;
+ else
+ r10_bio->devs[slot].bio = NULL;
+ to_put = bio;
+ dec_rdev = 1;
}
} else {
/*
@@ -540,16 +543,17 @@ static void raid10_end_write_request(struct bio *bio)
r10_bio->devs[slot].addr,
r10_bio->sectors,
&first_bad, &bad_sectors) && !discard_error) {
- bio_put(bio);
if (repl)
r10_bio->devs[slot].repl_bio = IO_MADE_GOOD;
else
r10_bio->devs[slot].bio = IO_MADE_GOOD;
+ bio_put(bio);
dec_rdev = 0;
set_bit(R10BIO_MadeGood, &r10_bio->state);
}
}

+out:
/*
*
* Let's see if all mirrored write operations have finished
--
2.39.2