[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230614084740.1493969-4-linan666@huaweicloud.com>
Date: Wed, 14 Jun 2023 16:47:40 +0800
From: linan666@...weicloud.com
To: song@...nel.org, neilb@...e.de
Cc: linux-raid@...r.kernel.org, linux-kernel@...r.kernel.org,
linan122@...wei.com, yukuai3@...wei.com, yi.zhang@...wei.com,
houtao1@...wei.com, yangerkun@...wei.com
Subject: [PATCH 3/3] md/raid10: improve raid10_end_write_request()
From: Li Nan <linan122@...wei.com>
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@...wei.com>
---
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
Powered by blists - more mailing lists