diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 174 |
1 files changed, 131 insertions, 43 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index ede2461e79c5..cc24f0cb7ee3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -135,7 +135,7 @@ out_free_pages: | |||
135 | put_page(r1_bio->bios[j]->bi_io_vec[i].bv_page); | 135 | put_page(r1_bio->bios[j]->bi_io_vec[i].bv_page); |
136 | j = -1; | 136 | j = -1; |
137 | out_free_bio: | 137 | out_free_bio: |
138 | while ( ++j < pi->raid_disks ) | 138 | while (++j < pi->raid_disks) |
139 | bio_put(r1_bio->bios[j]); | 139 | bio_put(r1_bio->bios[j]); |
140 | r1bio_pool_free(r1_bio, data); | 140 | r1bio_pool_free(r1_bio, data); |
141 | return NULL; | 141 | return NULL; |
@@ -164,7 +164,7 @@ static void put_all_bios(struct r1conf *conf, struct r1bio *r1_bio) | |||
164 | { | 164 | { |
165 | int i; | 165 | int i; |
166 | 166 | ||
167 | for (i = 0; i < conf->raid_disks; i++) { | 167 | for (i = 0; i < conf->raid_disks * 2; i++) { |
168 | struct bio **bio = r1_bio->bios + i; | 168 | struct bio **bio = r1_bio->bios + i; |
169 | if (!BIO_SPECIAL(*bio)) | 169 | if (!BIO_SPECIAL(*bio)) |
170 | bio_put(*bio); | 170 | bio_put(*bio); |
@@ -185,7 +185,7 @@ static void put_buf(struct r1bio *r1_bio) | |||
185 | struct r1conf *conf = r1_bio->mddev->private; | 185 | struct r1conf *conf = r1_bio->mddev->private; |
186 | int i; | 186 | int i; |
187 | 187 | ||
188 | for (i=0; i<conf->raid_disks; i++) { | 188 | for (i = 0; i < conf->raid_disks * 2; i++) { |
189 | struct bio *bio = r1_bio->bios[i]; | 189 | struct bio *bio = r1_bio->bios[i]; |
190 | if (bio->bi_end_io) | 190 | if (bio->bi_end_io) |
191 | rdev_dec_pending(conf->mirrors[i].rdev, r1_bio->mddev); | 191 | rdev_dec_pending(conf->mirrors[i].rdev, r1_bio->mddev); |
@@ -277,13 +277,14 @@ static inline void update_head_pos(int disk, struct r1bio *r1_bio) | |||
277 | static int find_bio_disk(struct r1bio *r1_bio, struct bio *bio) | 277 | static int find_bio_disk(struct r1bio *r1_bio, struct bio *bio) |
278 | { | 278 | { |
279 | int mirror; | 279 | int mirror; |
280 | int raid_disks = r1_bio->mddev->raid_disks; | 280 | struct r1conf *conf = r1_bio->mddev->private; |
281 | int raid_disks = conf->raid_disks; | ||
281 | 282 | ||
282 | for (mirror = 0; mirror < raid_disks; mirror++) | 283 | for (mirror = 0; mirror < raid_disks * 2; mirror++) |
283 | if (r1_bio->bios[mirror] == bio) | 284 | if (r1_bio->bios[mirror] == bio) |
284 | break; | 285 | break; |
285 | 286 | ||
286 | BUG_ON(mirror == raid_disks); | 287 | BUG_ON(mirror == raid_disks * 2); |
287 | update_head_pos(mirror, r1_bio); | 288 | update_head_pos(mirror, r1_bio); |
288 | 289 | ||
289 | return mirror; | 290 | return mirror; |
@@ -390,6 +391,11 @@ static void raid1_end_write_request(struct bio *bio, int error) | |||
390 | if (!uptodate) { | 391 | if (!uptodate) { |
391 | set_bit(WriteErrorSeen, | 392 | set_bit(WriteErrorSeen, |
392 | &conf->mirrors[mirror].rdev->flags); | 393 | &conf->mirrors[mirror].rdev->flags); |
394 | if (!test_and_set_bit(WantReplacement, | ||
395 | &conf->mirrors[mirror].rdev->flags)) | ||
396 | set_bit(MD_RECOVERY_NEEDED, & | ||
397 | conf->mddev->recovery); | ||
398 | |||
393 | set_bit(R1BIO_WriteError, &r1_bio->state); | 399 | set_bit(R1BIO_WriteError, &r1_bio->state); |
394 | } else { | 400 | } else { |
395 | /* | 401 | /* |
@@ -505,7 +511,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect | |||
505 | start_disk = conf->last_used; | 511 | start_disk = conf->last_used; |
506 | } | 512 | } |
507 | 513 | ||
508 | for (i = 0 ; i < conf->raid_disks ; i++) { | 514 | for (i = 0 ; i < conf->raid_disks * 2 ; i++) { |
509 | sector_t dist; | 515 | sector_t dist; |
510 | sector_t first_bad; | 516 | sector_t first_bad; |
511 | int bad_sectors; | 517 | int bad_sectors; |
@@ -609,7 +615,7 @@ int md_raid1_congested(struct mddev *mddev, int bits) | |||
609 | return 1; | 615 | return 1; |
610 | 616 | ||
611 | rcu_read_lock(); | 617 | rcu_read_lock(); |
612 | for (i = 0; i < mddev->raid_disks; i++) { | 618 | for (i = 0; i < conf->raid_disks; i++) { |
613 | struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); | 619 | struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); |
614 | if (rdev && !test_bit(Faulty, &rdev->flags)) { | 620 | if (rdev && !test_bit(Faulty, &rdev->flags)) { |
615 | struct request_queue *q = bdev_get_queue(rdev->bdev); | 621 | struct request_queue *q = bdev_get_queue(rdev->bdev); |
@@ -974,7 +980,7 @@ read_again: | |||
974 | */ | 980 | */ |
975 | plugged = mddev_check_plugged(mddev); | 981 | plugged = mddev_check_plugged(mddev); |
976 | 982 | ||
977 | disks = conf->raid_disks; | 983 | disks = conf->raid_disks * 2; |
978 | retry_write: | 984 | retry_write: |
979 | blocked_rdev = NULL; | 985 | blocked_rdev = NULL; |
980 | rcu_read_lock(); | 986 | rcu_read_lock(); |
@@ -988,7 +994,8 @@ read_again: | |||
988 | } | 994 | } |
989 | r1_bio->bios[i] = NULL; | 995 | r1_bio->bios[i] = NULL; |
990 | if (!rdev || test_bit(Faulty, &rdev->flags)) { | 996 | if (!rdev || test_bit(Faulty, &rdev->flags)) { |
991 | set_bit(R1BIO_Degraded, &r1_bio->state); | 997 | if (i < conf->raid_disks) |
998 | set_bit(R1BIO_Degraded, &r1_bio->state); | ||
992 | continue; | 999 | continue; |
993 | } | 1000 | } |
994 | 1001 | ||
@@ -1263,6 +1270,25 @@ static int raid1_spare_active(struct mddev *mddev) | |||
1263 | */ | 1270 | */ |
1264 | for (i = 0; i < conf->raid_disks; i++) { | 1271 | for (i = 0; i < conf->raid_disks; i++) { |
1265 | struct md_rdev *rdev = conf->mirrors[i].rdev; | 1272 | struct md_rdev *rdev = conf->mirrors[i].rdev; |
1273 | struct md_rdev *repl = conf->mirrors[conf->raid_disks + i].rdev; | ||
1274 | if (repl | ||
1275 | && repl->recovery_offset == MaxSector | ||
1276 | && !test_bit(Faulty, &repl->flags) | ||
1277 | && !test_and_set_bit(In_sync, &repl->flags)) { | ||
1278 | /* replacement has just become active */ | ||
1279 | if (!rdev || | ||
1280 | !test_and_clear_bit(In_sync, &rdev->flags)) | ||
1281 | count++; | ||
1282 | if (rdev) { | ||
1283 | /* Replaced device not technically | ||
1284 | * faulty, but we need to be sure | ||
1285 | * it gets removed and never re-added | ||
1286 | */ | ||
1287 | set_bit(Faulty, &rdev->flags); | ||
1288 | sysfs_notify_dirent_safe( | ||
1289 | rdev->sysfs_state); | ||
1290 | } | ||
1291 | } | ||
1266 | if (rdev | 1292 | if (rdev |
1267 | && !test_bit(Faulty, &rdev->flags) | 1293 | && !test_bit(Faulty, &rdev->flags) |
1268 | && !test_and_set_bit(In_sync, &rdev->flags)) { | 1294 | && !test_and_set_bit(In_sync, &rdev->flags)) { |
@@ -1286,7 +1312,7 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) | |||
1286 | int mirror = 0; | 1312 | int mirror = 0; |
1287 | struct mirror_info *p; | 1313 | struct mirror_info *p; |
1288 | int first = 0; | 1314 | int first = 0; |
1289 | int last = mddev->raid_disks - 1; | 1315 | int last = conf->raid_disks - 1; |
1290 | 1316 | ||
1291 | if (mddev->recovery_disabled == conf->recovery_disabled) | 1317 | if (mddev->recovery_disabled == conf->recovery_disabled) |
1292 | return -EBUSY; | 1318 | return -EBUSY; |
@@ -1294,8 +1320,9 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) | |||
1294 | if (rdev->raid_disk >= 0) | 1320 | if (rdev->raid_disk >= 0) |
1295 | first = last = rdev->raid_disk; | 1321 | first = last = rdev->raid_disk; |
1296 | 1322 | ||
1297 | for (mirror = first; mirror <= last; mirror++) | 1323 | for (mirror = first; mirror <= last; mirror++) { |
1298 | if ( !(p=conf->mirrors+mirror)->rdev) { | 1324 | p = conf->mirrors+mirror; |
1325 | if (!p->rdev) { | ||
1299 | 1326 | ||
1300 | disk_stack_limits(mddev->gendisk, rdev->bdev, | 1327 | disk_stack_limits(mddev->gendisk, rdev->bdev, |
1301 | rdev->data_offset << 9); | 1328 | rdev->data_offset << 9); |
@@ -1322,21 +1349,35 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) | |||
1322 | rcu_assign_pointer(p->rdev, rdev); | 1349 | rcu_assign_pointer(p->rdev, rdev); |
1323 | break; | 1350 | break; |
1324 | } | 1351 | } |
1352 | if (test_bit(WantReplacement, &p->rdev->flags) && | ||
1353 | p[conf->raid_disks].rdev == NULL) { | ||
1354 | /* Add this device as a replacement */ | ||
1355 | clear_bit(In_sync, &rdev->flags); | ||
1356 | set_bit(Replacement, &rdev->flags); | ||
1357 | rdev->raid_disk = mirror; | ||
1358 | err = 0; | ||
1359 | conf->fullsync = 1; | ||
1360 | rcu_assign_pointer(p[conf->raid_disks].rdev, rdev); | ||
1361 | break; | ||
1362 | } | ||
1363 | } | ||
1325 | md_integrity_add_rdev(rdev, mddev); | 1364 | md_integrity_add_rdev(rdev, mddev); |
1326 | print_conf(conf); | 1365 | print_conf(conf); |
1327 | return err; | 1366 | return err; |
1328 | } | 1367 | } |
1329 | 1368 | ||
1330 | static int raid1_remove_disk(struct mddev *mddev, int number) | 1369 | static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev) |
1331 | { | 1370 | { |
1332 | struct r1conf *conf = mddev->private; | 1371 | struct r1conf *conf = mddev->private; |
1333 | int err = 0; | 1372 | int err = 0; |
1334 | struct md_rdev *rdev; | 1373 | int number = rdev->raid_disk; |
1335 | struct mirror_info *p = conf->mirrors+ number; | 1374 | struct mirror_info *p = conf->mirrors+ number; |
1336 | 1375 | ||
1376 | if (rdev != p->rdev) | ||
1377 | p = conf->mirrors + conf->raid_disks + number; | ||
1378 | |||
1337 | print_conf(conf); | 1379 | print_conf(conf); |
1338 | rdev = p->rdev; | 1380 | if (rdev == p->rdev) { |
1339 | if (rdev) { | ||
1340 | if (test_bit(In_sync, &rdev->flags) || | 1381 | if (test_bit(In_sync, &rdev->flags) || |
1341 | atomic_read(&rdev->nr_pending)) { | 1382 | atomic_read(&rdev->nr_pending)) { |
1342 | err = -EBUSY; | 1383 | err = -EBUSY; |
@@ -1358,7 +1399,21 @@ static int raid1_remove_disk(struct mddev *mddev, int number) | |||
1358 | err = -EBUSY; | 1399 | err = -EBUSY; |
1359 | p->rdev = rdev; | 1400 | p->rdev = rdev; |
1360 | goto abort; | 1401 | goto abort; |
1361 | } | 1402 | } else if (conf->mirrors[conf->raid_disks + number].rdev) { |
1403 | /* We just removed a device that is being replaced. | ||
1404 | * Move down the replacement. We drain all IO before | ||
1405 | * doing this to avoid confusion. | ||
1406 | */ | ||
1407 | struct md_rdev *repl = | ||
1408 | conf->mirrors[conf->raid_disks + number].rdev; | ||
1409 | raise_barrier(conf); | ||
1410 | clear_bit(Replacement, &repl->flags); | ||
1411 | p->rdev = repl; | ||
1412 | conf->mirrors[conf->raid_disks + number].rdev = NULL; | ||
1413 | lower_barrier(conf); | ||
1414 | clear_bit(WantReplacement, &rdev->flags); | ||
1415 | } else | ||
1416 | clear_bit(WantReplacement, &rdev->flags); | ||
1362 | err = md_integrity_register(mddev); | 1417 | err = md_integrity_register(mddev); |
1363 | } | 1418 | } |
1364 | abort: | 1419 | abort: |
@@ -1411,6 +1466,10 @@ static void end_sync_write(struct bio *bio, int error) | |||
1411 | } while (sectors_to_go > 0); | 1466 | } while (sectors_to_go > 0); |
1412 | set_bit(WriteErrorSeen, | 1467 | set_bit(WriteErrorSeen, |
1413 | &conf->mirrors[mirror].rdev->flags); | 1468 | &conf->mirrors[mirror].rdev->flags); |
1469 | if (!test_and_set_bit(WantReplacement, | ||
1470 | &conf->mirrors[mirror].rdev->flags)) | ||
1471 | set_bit(MD_RECOVERY_NEEDED, & | ||
1472 | mddev->recovery); | ||
1414 | set_bit(R1BIO_WriteError, &r1_bio->state); | 1473 | set_bit(R1BIO_WriteError, &r1_bio->state); |
1415 | } else if (is_badblock(conf->mirrors[mirror].rdev, | 1474 | } else if (is_badblock(conf->mirrors[mirror].rdev, |
1416 | r1_bio->sector, | 1475 | r1_bio->sector, |
@@ -1441,8 +1500,13 @@ static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, | |||
1441 | if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) | 1500 | if (sync_page_io(rdev, sector, sectors << 9, page, rw, false)) |
1442 | /* success */ | 1501 | /* success */ |
1443 | return 1; | 1502 | return 1; |
1444 | if (rw == WRITE) | 1503 | if (rw == WRITE) { |
1445 | set_bit(WriteErrorSeen, &rdev->flags); | 1504 | set_bit(WriteErrorSeen, &rdev->flags); |
1505 | if (!test_and_set_bit(WantReplacement, | ||
1506 | &rdev->flags)) | ||
1507 | set_bit(MD_RECOVERY_NEEDED, & | ||
1508 | rdev->mddev->recovery); | ||
1509 | } | ||
1446 | /* need to record an error - either for the block or the device */ | 1510 | /* need to record an error - either for the block or the device */ |
1447 | if (!rdev_set_badblocks(rdev, sector, sectors, 0)) | 1511 | if (!rdev_set_badblocks(rdev, sector, sectors, 0)) |
1448 | md_error(rdev->mddev, rdev); | 1512 | md_error(rdev->mddev, rdev); |
@@ -1493,7 +1557,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) | |||
1493 | } | 1557 | } |
1494 | } | 1558 | } |
1495 | d++; | 1559 | d++; |
1496 | if (d == conf->raid_disks) | 1560 | if (d == conf->raid_disks * 2) |
1497 | d = 0; | 1561 | d = 0; |
1498 | } while (!success && d != r1_bio->read_disk); | 1562 | } while (!success && d != r1_bio->read_disk); |
1499 | 1563 | ||
@@ -1510,7 +1574,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) | |||
1510 | mdname(mddev), | 1574 | mdname(mddev), |
1511 | bdevname(bio->bi_bdev, b), | 1575 | bdevname(bio->bi_bdev, b), |
1512 | (unsigned long long)r1_bio->sector); | 1576 | (unsigned long long)r1_bio->sector); |
1513 | for (d = 0; d < conf->raid_disks; d++) { | 1577 | for (d = 0; d < conf->raid_disks * 2; d++) { |
1514 | rdev = conf->mirrors[d].rdev; | 1578 | rdev = conf->mirrors[d].rdev; |
1515 | if (!rdev || test_bit(Faulty, &rdev->flags)) | 1579 | if (!rdev || test_bit(Faulty, &rdev->flags)) |
1516 | continue; | 1580 | continue; |
@@ -1536,7 +1600,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) | |||
1536 | /* write it back and re-read */ | 1600 | /* write it back and re-read */ |
1537 | while (d != r1_bio->read_disk) { | 1601 | while (d != r1_bio->read_disk) { |
1538 | if (d == 0) | 1602 | if (d == 0) |
1539 | d = conf->raid_disks; | 1603 | d = conf->raid_disks * 2; |
1540 | d--; | 1604 | d--; |
1541 | if (r1_bio->bios[d]->bi_end_io != end_sync_read) | 1605 | if (r1_bio->bios[d]->bi_end_io != end_sync_read) |
1542 | continue; | 1606 | continue; |
@@ -1551,7 +1615,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) | |||
1551 | d = start; | 1615 | d = start; |
1552 | while (d != r1_bio->read_disk) { | 1616 | while (d != r1_bio->read_disk) { |
1553 | if (d == 0) | 1617 | if (d == 0) |
1554 | d = conf->raid_disks; | 1618 | d = conf->raid_disks * 2; |
1555 | d--; | 1619 | d--; |
1556 | if (r1_bio->bios[d]->bi_end_io != end_sync_read) | 1620 | if (r1_bio->bios[d]->bi_end_io != end_sync_read) |
1557 | continue; | 1621 | continue; |
@@ -1584,7 +1648,7 @@ static int process_checks(struct r1bio *r1_bio) | |||
1584 | int primary; | 1648 | int primary; |
1585 | int i; | 1649 | int i; |
1586 | 1650 | ||
1587 | for (primary = 0; primary < conf->raid_disks; primary++) | 1651 | for (primary = 0; primary < conf->raid_disks * 2; primary++) |
1588 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && | 1652 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && |
1589 | test_bit(BIO_UPTODATE, &r1_bio->bios[primary]->bi_flags)) { | 1653 | test_bit(BIO_UPTODATE, &r1_bio->bios[primary]->bi_flags)) { |
1590 | r1_bio->bios[primary]->bi_end_io = NULL; | 1654 | r1_bio->bios[primary]->bi_end_io = NULL; |
@@ -1592,7 +1656,7 @@ static int process_checks(struct r1bio *r1_bio) | |||
1592 | break; | 1656 | break; |
1593 | } | 1657 | } |
1594 | r1_bio->read_disk = primary; | 1658 | r1_bio->read_disk = primary; |
1595 | for (i = 0; i < conf->raid_disks; i++) { | 1659 | for (i = 0; i < conf->raid_disks * 2; i++) { |
1596 | int j; | 1660 | int j; |
1597 | int vcnt = r1_bio->sectors >> (PAGE_SHIFT- 9); | 1661 | int vcnt = r1_bio->sectors >> (PAGE_SHIFT- 9); |
1598 | struct bio *pbio = r1_bio->bios[primary]; | 1662 | struct bio *pbio = r1_bio->bios[primary]; |
@@ -1656,7 +1720,7 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) | |||
1656 | { | 1720 | { |
1657 | struct r1conf *conf = mddev->private; | 1721 | struct r1conf *conf = mddev->private; |
1658 | int i; | 1722 | int i; |
1659 | int disks = conf->raid_disks; | 1723 | int disks = conf->raid_disks * 2; |
1660 | struct bio *bio, *wbio; | 1724 | struct bio *bio, *wbio; |
1661 | 1725 | ||
1662 | bio = r1_bio->bios[r1_bio->read_disk]; | 1726 | bio = r1_bio->bios[r1_bio->read_disk]; |
@@ -1737,7 +1801,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, | |||
1737 | success = 1; | 1801 | success = 1; |
1738 | else { | 1802 | else { |
1739 | d++; | 1803 | d++; |
1740 | if (d == conf->raid_disks) | 1804 | if (d == conf->raid_disks * 2) |
1741 | d = 0; | 1805 | d = 0; |
1742 | } | 1806 | } |
1743 | } while (!success && d != read_disk); | 1807 | } while (!success && d != read_disk); |
@@ -1753,7 +1817,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, | |||
1753 | start = d; | 1817 | start = d; |
1754 | while (d != read_disk) { | 1818 | while (d != read_disk) { |
1755 | if (d==0) | 1819 | if (d==0) |
1756 | d = conf->raid_disks; | 1820 | d = conf->raid_disks * 2; |
1757 | d--; | 1821 | d--; |
1758 | rdev = conf->mirrors[d].rdev; | 1822 | rdev = conf->mirrors[d].rdev; |
1759 | if (rdev && | 1823 | if (rdev && |
@@ -1765,7 +1829,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, | |||
1765 | while (d != read_disk) { | 1829 | while (d != read_disk) { |
1766 | char b[BDEVNAME_SIZE]; | 1830 | char b[BDEVNAME_SIZE]; |
1767 | if (d==0) | 1831 | if (d==0) |
1768 | d = conf->raid_disks; | 1832 | d = conf->raid_disks * 2; |
1769 | d--; | 1833 | d--; |
1770 | rdev = conf->mirrors[d].rdev; | 1834 | rdev = conf->mirrors[d].rdev; |
1771 | if (rdev && | 1835 | if (rdev && |
@@ -1887,7 +1951,7 @@ static void handle_sync_write_finished(struct r1conf *conf, struct r1bio *r1_bio | |||
1887 | { | 1951 | { |
1888 | int m; | 1952 | int m; |
1889 | int s = r1_bio->sectors; | 1953 | int s = r1_bio->sectors; |
1890 | for (m = 0; m < conf->raid_disks ; m++) { | 1954 | for (m = 0; m < conf->raid_disks * 2 ; m++) { |
1891 | struct md_rdev *rdev = conf->mirrors[m].rdev; | 1955 | struct md_rdev *rdev = conf->mirrors[m].rdev; |
1892 | struct bio *bio = r1_bio->bios[m]; | 1956 | struct bio *bio = r1_bio->bios[m]; |
1893 | if (bio->bi_end_io == NULL) | 1957 | if (bio->bi_end_io == NULL) |
@@ -1909,7 +1973,7 @@ static void handle_sync_write_finished(struct r1conf *conf, struct r1bio *r1_bio | |||
1909 | static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio) | 1973 | static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio) |
1910 | { | 1974 | { |
1911 | int m; | 1975 | int m; |
1912 | for (m = 0; m < conf->raid_disks ; m++) | 1976 | for (m = 0; m < conf->raid_disks * 2 ; m++) |
1913 | if (r1_bio->bios[m] == IO_MADE_GOOD) { | 1977 | if (r1_bio->bios[m] == IO_MADE_GOOD) { |
1914 | struct md_rdev *rdev = conf->mirrors[m].rdev; | 1978 | struct md_rdev *rdev = conf->mirrors[m].rdev; |
1915 | rdev_clear_badblocks(rdev, | 1979 | rdev_clear_badblocks(rdev, |
@@ -2184,7 +2248,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp | |||
2184 | r1_bio->state = 0; | 2248 | r1_bio->state = 0; |
2185 | set_bit(R1BIO_IsSync, &r1_bio->state); | 2249 | set_bit(R1BIO_IsSync, &r1_bio->state); |
2186 | 2250 | ||
2187 | for (i=0; i < conf->raid_disks; i++) { | 2251 | for (i = 0; i < conf->raid_disks * 2; i++) { |
2188 | struct md_rdev *rdev; | 2252 | struct md_rdev *rdev; |
2189 | bio = r1_bio->bios[i]; | 2253 | bio = r1_bio->bios[i]; |
2190 | 2254 | ||
@@ -2203,7 +2267,8 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp | |||
2203 | rdev = rcu_dereference(conf->mirrors[i].rdev); | 2267 | rdev = rcu_dereference(conf->mirrors[i].rdev); |
2204 | if (rdev == NULL || | 2268 | if (rdev == NULL || |
2205 | test_bit(Faulty, &rdev->flags)) { | 2269 | test_bit(Faulty, &rdev->flags)) { |
2206 | still_degraded = 1; | 2270 | if (i < conf->raid_disks) |
2271 | still_degraded = 1; | ||
2207 | } else if (!test_bit(In_sync, &rdev->flags)) { | 2272 | } else if (!test_bit(In_sync, &rdev->flags)) { |
2208 | bio->bi_rw = WRITE; | 2273 | bio->bi_rw = WRITE; |
2209 | bio->bi_end_io = end_sync_write; | 2274 | bio->bi_end_io = end_sync_write; |
@@ -2254,7 +2319,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp | |||
2254 | * need to mark them bad on all write targets | 2319 | * need to mark them bad on all write targets |
2255 | */ | 2320 | */ |
2256 | int ok = 1; | 2321 | int ok = 1; |
2257 | for (i = 0 ; i < conf->raid_disks ; i++) | 2322 | for (i = 0 ; i < conf->raid_disks * 2 ; i++) |
2258 | if (r1_bio->bios[i]->bi_end_io == end_sync_write) { | 2323 | if (r1_bio->bios[i]->bi_end_io == end_sync_write) { |
2259 | struct md_rdev *rdev = | 2324 | struct md_rdev *rdev = |
2260 | rcu_dereference(conf->mirrors[i].rdev); | 2325 | rcu_dereference(conf->mirrors[i].rdev); |
@@ -2323,7 +2388,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp | |||
2323 | len = sync_blocks<<9; | 2388 | len = sync_blocks<<9; |
2324 | } | 2389 | } |
2325 | 2390 | ||
2326 | for (i=0 ; i < conf->raid_disks; i++) { | 2391 | for (i = 0 ; i < conf->raid_disks * 2; i++) { |
2327 | bio = r1_bio->bios[i]; | 2392 | bio = r1_bio->bios[i]; |
2328 | if (bio->bi_end_io) { | 2393 | if (bio->bi_end_io) { |
2329 | page = bio->bi_io_vec[bio->bi_vcnt].bv_page; | 2394 | page = bio->bi_io_vec[bio->bi_vcnt].bv_page; |
@@ -2356,7 +2421,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp | |||
2356 | */ | 2421 | */ |
2357 | if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { | 2422 | if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { |
2358 | atomic_set(&r1_bio->remaining, read_targets); | 2423 | atomic_set(&r1_bio->remaining, read_targets); |
2359 | for (i=0; i<conf->raid_disks; i++) { | 2424 | for (i = 0; i < conf->raid_disks * 2; i++) { |
2360 | bio = r1_bio->bios[i]; | 2425 | bio = r1_bio->bios[i]; |
2361 | if (bio->bi_end_io == end_sync_read) { | 2426 | if (bio->bi_end_io == end_sync_read) { |
2362 | md_sync_acct(bio->bi_bdev, nr_sectors); | 2427 | md_sync_acct(bio->bi_bdev, nr_sectors); |
@@ -2393,7 +2458,8 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2393 | if (!conf) | 2458 | if (!conf) |
2394 | goto abort; | 2459 | goto abort; |
2395 | 2460 | ||
2396 | conf->mirrors = kzalloc(sizeof(struct mirror_info)*mddev->raid_disks, | 2461 | conf->mirrors = kzalloc(sizeof(struct mirror_info) |
2462 | * mddev->raid_disks * 2, | ||
2397 | GFP_KERNEL); | 2463 | GFP_KERNEL); |
2398 | if (!conf->mirrors) | 2464 | if (!conf->mirrors) |
2399 | goto abort; | 2465 | goto abort; |
@@ -2405,7 +2471,7 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2405 | conf->poolinfo = kzalloc(sizeof(*conf->poolinfo), GFP_KERNEL); | 2471 | conf->poolinfo = kzalloc(sizeof(*conf->poolinfo), GFP_KERNEL); |
2406 | if (!conf->poolinfo) | 2472 | if (!conf->poolinfo) |
2407 | goto abort; | 2473 | goto abort; |
2408 | conf->poolinfo->raid_disks = mddev->raid_disks; | 2474 | conf->poolinfo->raid_disks = mddev->raid_disks * 2; |
2409 | conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, | 2475 | conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, |
2410 | r1bio_pool_free, | 2476 | r1bio_pool_free, |
2411 | conf->poolinfo); | 2477 | conf->poolinfo); |
@@ -2414,14 +2480,20 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2414 | 2480 | ||
2415 | conf->poolinfo->mddev = mddev; | 2481 | conf->poolinfo->mddev = mddev; |
2416 | 2482 | ||
2483 | err = -EINVAL; | ||
2417 | spin_lock_init(&conf->device_lock); | 2484 | spin_lock_init(&conf->device_lock); |
2418 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2485 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
2419 | int disk_idx = rdev->raid_disk; | 2486 | int disk_idx = rdev->raid_disk; |
2420 | if (disk_idx >= mddev->raid_disks | 2487 | if (disk_idx >= mddev->raid_disks |
2421 | || disk_idx < 0) | 2488 | || disk_idx < 0) |
2422 | continue; | 2489 | continue; |
2423 | disk = conf->mirrors + disk_idx; | 2490 | if (test_bit(Replacement, &rdev->flags)) |
2491 | disk = conf->mirrors + conf->raid_disks + disk_idx; | ||
2492 | else | ||
2493 | disk = conf->mirrors + disk_idx; | ||
2424 | 2494 | ||
2495 | if (disk->rdev) | ||
2496 | goto abort; | ||
2425 | disk->rdev = rdev; | 2497 | disk->rdev = rdev; |
2426 | 2498 | ||
2427 | disk->head_position = 0; | 2499 | disk->head_position = 0; |
@@ -2437,11 +2509,27 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2437 | conf->pending_count = 0; | 2509 | conf->pending_count = 0; |
2438 | conf->recovery_disabled = mddev->recovery_disabled - 1; | 2510 | conf->recovery_disabled = mddev->recovery_disabled - 1; |
2439 | 2511 | ||
2512 | err = -EIO; | ||
2440 | conf->last_used = -1; | 2513 | conf->last_used = -1; |
2441 | for (i = 0; i < conf->raid_disks; i++) { | 2514 | for (i = 0; i < conf->raid_disks * 2; i++) { |
2442 | 2515 | ||
2443 | disk = conf->mirrors + i; | 2516 | disk = conf->mirrors + i; |
2444 | 2517 | ||
2518 | if (i < conf->raid_disks && | ||
2519 | disk[conf->raid_disks].rdev) { | ||
2520 | /* This slot has a replacement. */ | ||
2521 | if (!disk->rdev) { | ||
2522 | /* No original, just make the replacement | ||
2523 | * a recovering spare | ||
2524 | */ | ||
2525 | disk->rdev = | ||
2526 | disk[conf->raid_disks].rdev; | ||
2527 | disk[conf->raid_disks].rdev = NULL; | ||
2528 | } else if (!test_bit(In_sync, &disk->rdev->flags)) | ||
2529 | /* Original is not in_sync - bad */ | ||
2530 | goto abort; | ||
2531 | } | ||
2532 | |||
2445 | if (!disk->rdev || | 2533 | if (!disk->rdev || |
2446 | !test_bit(In_sync, &disk->rdev->flags)) { | 2534 | !test_bit(In_sync, &disk->rdev->flags)) { |
2447 | disk->head_position = 0; | 2535 | disk->head_position = 0; |
@@ -2455,7 +2543,6 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2455 | conf->last_used = i; | 2543 | conf->last_used = i; |
2456 | } | 2544 | } |
2457 | 2545 | ||
2458 | err = -EIO; | ||
2459 | if (conf->last_used < 0) { | 2546 | if (conf->last_used < 0) { |
2460 | printk(KERN_ERR "md/raid1:%s: no operational mirrors\n", | 2547 | printk(KERN_ERR "md/raid1:%s: no operational mirrors\n", |
2461 | mdname(mddev)); | 2548 | mdname(mddev)); |
@@ -2665,7 +2752,7 @@ static int raid1_reshape(struct mddev *mddev) | |||
2665 | if (!newpoolinfo) | 2752 | if (!newpoolinfo) |
2666 | return -ENOMEM; | 2753 | return -ENOMEM; |
2667 | newpoolinfo->mddev = mddev; | 2754 | newpoolinfo->mddev = mddev; |
2668 | newpoolinfo->raid_disks = raid_disks; | 2755 | newpoolinfo->raid_disks = raid_disks * 2; |
2669 | 2756 | ||
2670 | newpool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, | 2757 | newpool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, |
2671 | r1bio_pool_free, newpoolinfo); | 2758 | r1bio_pool_free, newpoolinfo); |
@@ -2673,7 +2760,8 @@ static int raid1_reshape(struct mddev *mddev) | |||
2673 | kfree(newpoolinfo); | 2760 | kfree(newpoolinfo); |
2674 | return -ENOMEM; | 2761 | return -ENOMEM; |
2675 | } | 2762 | } |
2676 | newmirrors = kzalloc(sizeof(struct mirror_info) * raid_disks, GFP_KERNEL); | 2763 | newmirrors = kzalloc(sizeof(struct mirror_info) * raid_disks * 2, |
2764 | GFP_KERNEL); | ||
2677 | if (!newmirrors) { | 2765 | if (!newmirrors) { |
2678 | kfree(newpoolinfo); | 2766 | kfree(newpoolinfo); |
2679 | mempool_destroy(newpool); | 2767 | mempool_destroy(newpool); |