1267
1267
blocked_rdev = rrdev;
1270
if (rdev && (test_bit(Faulty, &rdev->flags)
1271
|| test_bit(Unmerged, &rdev->flags)))
1270
1273
if (rrdev && (test_bit(Faulty, &rrdev->flags)
1271
1274
|| test_bit(Unmerged, &rrdev->flags)))
1274
1277
r10_bio->devs[i].bio = NULL;
1275
1278
r10_bio->devs[i].repl_bio = NULL;
1276
if (!rdev || test_bit(Faulty, &rdev->flags) ||
1277
test_bit(Unmerged, &rdev->flags)) {
1280
if (!rdev && !rrdev) {
1278
1281
set_bit(R10BIO_Degraded, &r10_bio->state);
1281
if (test_bit(WriteErrorSeen, &rdev->flags)) {
1284
if (rdev && test_bit(WriteErrorSeen, &rdev->flags)) {
1282
1285
sector_t first_bad;
1283
1286
sector_t dev_sector = r10_bio->devs[i].addr;
1284
1287
int bad_sectors;
1377
1382
for (i = 0; i < conf->copies; i++) {
1378
1383
struct bio *mbio;
1379
1384
int d = r10_bio->devs[i].devnum;
1380
if (!r10_bio->devs[i].bio)
1383
mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1384
md_trim_bio(mbio, r10_bio->sector - bio->bi_sector,
1386
r10_bio->devs[i].bio = mbio;
1388
mbio->bi_sector = (r10_bio->devs[i].addr+
1389
choose_data_offset(r10_bio,
1390
conf->mirrors[d].rdev));
1391
mbio->bi_bdev = conf->mirrors[d].rdev->bdev;
1392
mbio->bi_end_io = raid10_end_write_request;
1393
mbio->bi_rw = WRITE | do_sync | do_fua;
1394
mbio->bi_private = r10_bio;
1396
atomic_inc(&r10_bio->remaining);
1397
spin_lock_irqsave(&conf->device_lock, flags);
1398
bio_list_add(&conf->pending_bio_list, mbio);
1399
conf->pending_count++;
1400
spin_unlock_irqrestore(&conf->device_lock, flags);
1401
if (!mddev_check_plugged(mddev))
1402
md_wakeup_thread(mddev->thread);
1404
if (!r10_bio->devs[i].repl_bio)
1407
mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1408
md_trim_bio(mbio, r10_bio->sector - bio->bi_sector,
1410
r10_bio->devs[i].repl_bio = mbio;
1412
/* We are actively writing to the original device
1413
* so it cannot disappear, so the replacement cannot
1416
mbio->bi_sector = (r10_bio->devs[i].addr +
1419
conf->mirrors[d].replacement));
1420
mbio->bi_bdev = conf->mirrors[d].replacement->bdev;
1421
mbio->bi_end_io = raid10_end_write_request;
1422
mbio->bi_rw = WRITE | do_sync | do_fua;
1423
mbio->bi_private = r10_bio;
1425
atomic_inc(&r10_bio->remaining);
1426
spin_lock_irqsave(&conf->device_lock, flags);
1427
bio_list_add(&conf->pending_bio_list, mbio);
1428
conf->pending_count++;
1429
spin_unlock_irqrestore(&conf->device_lock, flags);
1430
if (!mddev_check_plugged(mddev))
1431
md_wakeup_thread(mddev->thread);
1385
if (r10_bio->devs[i].bio) {
1386
struct md_rdev *rdev = conf->mirrors[d].rdev;
1387
mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1388
md_trim_bio(mbio, r10_bio->sector - bio->bi_sector,
1390
r10_bio->devs[i].bio = mbio;
1392
mbio->bi_sector = (r10_bio->devs[i].addr+
1393
choose_data_offset(r10_bio,
1395
mbio->bi_bdev = rdev->bdev;
1396
mbio->bi_end_io = raid10_end_write_request;
1397
mbio->bi_rw = WRITE | do_sync | do_fua;
1398
mbio->bi_private = r10_bio;
1400
atomic_inc(&r10_bio->remaining);
1401
spin_lock_irqsave(&conf->device_lock, flags);
1402
bio_list_add(&conf->pending_bio_list, mbio);
1403
conf->pending_count++;
1404
spin_unlock_irqrestore(&conf->device_lock, flags);
1405
if (!mddev_check_plugged(mddev))
1406
md_wakeup_thread(mddev->thread);
1409
if (r10_bio->devs[i].repl_bio) {
1410
struct md_rdev *rdev = conf->mirrors[d].replacement;
1412
/* Replacement just got moved to main 'rdev' */
1414
rdev = conf->mirrors[d].rdev;
1416
mbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
1417
md_trim_bio(mbio, r10_bio->sector - bio->bi_sector,
1419
r10_bio->devs[i].repl_bio = mbio;
1421
mbio->bi_sector = (r10_bio->devs[i].addr +
1424
mbio->bi_bdev = rdev->bdev;
1425
mbio->bi_end_io = raid10_end_write_request;
1426
mbio->bi_rw = WRITE | do_sync | do_fua;
1427
mbio->bi_private = r10_bio;
1429
atomic_inc(&r10_bio->remaining);
1430
spin_lock_irqsave(&conf->device_lock, flags);
1431
bio_list_add(&conf->pending_bio_list, mbio);
1432
conf->pending_count++;
1433
spin_unlock_irqrestore(&conf->device_lock, flags);
1434
if (!mddev_check_plugged(mddev))
1435
md_wakeup_thread(mddev->thread);
1434
1439
/* Don't remove the bias on 'remaining' (one_write_done) until