Skip to content

Commit d419284

Browse files
YuKuai-huaweiliu-song-6
authored andcommitted
md/raid10: don't wait for Faulty rdev in wait_blocked_rdev()
Faulty rdev should never be accessed anymore, hence there is no point to wait for bad block to be acknowledged in this case while handling write request. Signed-off-by: Yu Kuai <[email protected]> Tested-by: Mariusz Tkaczyk <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Song Liu <[email protected]>
1 parent ff31a7e commit d419284

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

drivers/md/raid10.c

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,50 +1285,46 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
12851285

12861286
static void wait_blocked_dev(struct mddev *mddev, struct r10bio *r10_bio)
12871287
{
1288-
int i;
12891288
struct r10conf *conf = mddev->private;
12901289
struct md_rdev *blocked_rdev;
1290+
int i;
12911291

12921292
retry_wait:
12931293
blocked_rdev = NULL;
12941294
for (i = 0; i < conf->copies; i++) {
12951295
struct md_rdev *rdev, *rrdev;
12961296

12971297
rdev = conf->mirrors[i].rdev;
1298-
rrdev = conf->mirrors[i].replacement;
1299-
if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
1300-
atomic_inc(&rdev->nr_pending);
1301-
blocked_rdev = rdev;
1302-
break;
1303-
}
1304-
if (rrdev && unlikely(test_bit(Blocked, &rrdev->flags))) {
1305-
atomic_inc(&rrdev->nr_pending);
1306-
blocked_rdev = rrdev;
1307-
break;
1308-
}
1309-
1310-
if (rdev && test_bit(WriteErrorSeen, &rdev->flags)) {
1298+
if (rdev) {
13111299
sector_t dev_sector = r10_bio->devs[i].addr;
13121300

13131301
/*
13141302
* Discard request doesn't care the write result
13151303
* so it doesn't need to wait blocked disk here.
13161304
*/
1317-
if (!r10_bio->sectors)
1318-
continue;
1319-
1320-
if (rdev_has_badblock(rdev, dev_sector,
1321-
r10_bio->sectors) < 0) {
1305+
if (test_bit(WriteErrorSeen, &rdev->flags) &&
1306+
r10_bio->sectors &&
1307+
rdev_has_badblock(rdev, dev_sector,
1308+
r10_bio->sectors) < 0)
13221309
/*
1323-
* Mustn't write here until the bad block
1324-
* is acknowledged
1310+
* Mustn't write here until the bad
1311+
* block is acknowledged
13251312
*/
1326-
atomic_inc(&rdev->nr_pending);
13271313
set_bit(BlockedBadBlocks, &rdev->flags);
1314+
1315+
if (rdev_blocked(rdev)) {
13281316
blocked_rdev = rdev;
1317+
atomic_inc(&rdev->nr_pending);
13291318
break;
13301319
}
13311320
}
1321+
1322+
rrdev = conf->mirrors[i].replacement;
1323+
if (rrdev && rdev_blocked(rrdev)) {
1324+
atomic_inc(&rrdev->nr_pending);
1325+
blocked_rdev = rrdev;
1326+
break;
1327+
}
13321328
}
13331329

13341330
if (unlikely(blocked_rdev)) {

0 commit comments

Comments
 (0)