@@ -1285,50 +1285,46 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
1285
1285
1286
1286
static void wait_blocked_dev (struct mddev * mddev , struct r10bio * r10_bio )
1287
1287
{
1288
- int i ;
1289
1288
struct r10conf * conf = mddev -> private ;
1290
1289
struct md_rdev * blocked_rdev ;
1290
+ int i ;
1291
1291
1292
1292
retry_wait :
1293
1293
blocked_rdev = NULL ;
1294
1294
for (i = 0 ; i < conf -> copies ; i ++ ) {
1295
1295
struct md_rdev * rdev , * rrdev ;
1296
1296
1297
1297
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 ) {
1311
1299
sector_t dev_sector = r10_bio -> devs [i ].addr ;
1312
1300
1313
1301
/*
1314
1302
* Discard request doesn't care the write result
1315
1303
* so it doesn't need to wait blocked disk here.
1316
1304
*/
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 )
1322
1309
/*
1323
- * Mustn't write here until the bad block
1324
- * is acknowledged
1310
+ * Mustn't write here until the bad
1311
+ * block is acknowledged
1325
1312
*/
1326
- atomic_inc (& rdev -> nr_pending );
1327
1313
set_bit (BlockedBadBlocks , & rdev -> flags );
1314
+
1315
+ if (rdev_blocked (rdev )) {
1328
1316
blocked_rdev = rdev ;
1317
+ atomic_inc (& rdev -> nr_pending );
1329
1318
break ;
1330
1319
}
1331
1320
}
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
+ }
1332
1328
}
1333
1329
1334
1330
if (unlikely (blocked_rdev )) {
0 commit comments