diff options
| -rw-r--r-- | drivers/md/raid1.c | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 87bfe9e7d8ca..3b4d69c05623 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -930,10 +930,13 @@ static void status(struct seq_file *seq, mddev_t *mddev) | |||
| 930 | 930 | ||
| 931 | seq_printf(seq, " [%d/%d] [", conf->raid_disks, | 931 | seq_printf(seq, " [%d/%d] [", conf->raid_disks, |
| 932 | conf->working_disks); | 932 | conf->working_disks); |
| 933 | for (i = 0; i < conf->raid_disks; i++) | 933 | rcu_read_lock(); |
| 934 | for (i = 0; i < conf->raid_disks; i++) { | ||
| 935 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); | ||
| 934 | seq_printf(seq, "%s", | 936 | seq_printf(seq, "%s", |
| 935 | conf->mirrors[i].rdev && | 937 | rdev && test_bit(In_sync, &rdev->flags) ? "U" : "_"); |
| 936 | test_bit(In_sync, &conf->mirrors[i].rdev->flags) ? "U" : "_"); | 938 | } |
| 939 | rcu_read_unlock(); | ||
| 937 | seq_printf(seq, "]"); | 940 | seq_printf(seq, "]"); |
| 938 | } | 941 | } |
| 939 | 942 | ||
| @@ -975,7 +978,6 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
| 975 | static void print_conf(conf_t *conf) | 978 | static void print_conf(conf_t *conf) |
| 976 | { | 979 | { |
| 977 | int i; | 980 | int i; |
| 978 | mirror_info_t *tmp; | ||
| 979 | 981 | ||
| 980 | printk("RAID1 conf printout:\n"); | 982 | printk("RAID1 conf printout:\n"); |
| 981 | if (!conf) { | 983 | if (!conf) { |
| @@ -985,14 +987,17 @@ static void print_conf(conf_t *conf) | |||
| 985 | printk(" --- wd:%d rd:%d\n", conf->working_disks, | 987 | printk(" --- wd:%d rd:%d\n", conf->working_disks, |
| 986 | conf->raid_disks); | 988 | conf->raid_disks); |
| 987 | 989 | ||
| 990 | rcu_read_lock(); | ||
| 988 | for (i = 0; i < conf->raid_disks; i++) { | 991 | for (i = 0; i < conf->raid_disks; i++) { |
| 989 | char b[BDEVNAME_SIZE]; | 992 | char b[BDEVNAME_SIZE]; |
| 990 | tmp = conf->mirrors + i; | 993 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); |
| 991 | if (tmp->rdev) | 994 | if (rdev) |
| 992 | printk(" disk %d, wo:%d, o:%d, dev:%s\n", | 995 | printk(" disk %d, wo:%d, o:%d, dev:%s\n", |
| 993 | i, !test_bit(In_sync, &tmp->rdev->flags), !test_bit(Faulty, &tmp->rdev->flags), | 996 | i, !test_bit(In_sync, &rdev->flags), |
| 994 | bdevname(tmp->rdev->bdev,b)); | 997 | !test_bit(Faulty, &rdev->flags), |
| 998 | bdevname(rdev->bdev,b)); | ||
| 995 | } | 999 | } |
| 1000 | rcu_read_unlock(); | ||
| 996 | } | 1001 | } |
| 997 | 1002 | ||
| 998 | static void close_sync(conf_t *conf) | 1003 | static void close_sync(conf_t *conf) |
| @@ -1008,20 +1013,20 @@ static int raid1_spare_active(mddev_t *mddev) | |||
| 1008 | { | 1013 | { |
| 1009 | int i; | 1014 | int i; |
| 1010 | conf_t *conf = mddev->private; | 1015 | conf_t *conf = mddev->private; |
| 1011 | mirror_info_t *tmp; | ||
| 1012 | 1016 | ||
| 1013 | /* | 1017 | /* |
| 1014 | * Find all failed disks within the RAID1 configuration | 1018 | * Find all failed disks within the RAID1 configuration |
| 1015 | * and mark them readable | 1019 | * and mark them readable. |
| 1020 | * Called under mddev lock, so rcu protection not needed. | ||
| 1016 | */ | 1021 | */ |
| 1017 | for (i = 0; i < conf->raid_disks; i++) { | 1022 | for (i = 0; i < conf->raid_disks; i++) { |
| 1018 | tmp = conf->mirrors + i; | 1023 | mdk_rdev_t *rdev = conf->mirrors[i].rdev; |
| 1019 | if (tmp->rdev | 1024 | if (rdev |
| 1020 | && !test_bit(Faulty, &tmp->rdev->flags) | 1025 | && !test_bit(Faulty, &rdev->flags) |
| 1021 | && !test_bit(In_sync, &tmp->rdev->flags)) { | 1026 | && !test_bit(In_sync, &rdev->flags)) { |
| 1022 | conf->working_disks++; | 1027 | conf->working_disks++; |
| 1023 | mddev->degraded--; | 1028 | mddev->degraded--; |
| 1024 | set_bit(In_sync, &tmp->rdev->flags); | 1029 | set_bit(In_sync, &rdev->flags); |
| 1025 | } | 1030 | } |
| 1026 | } | 1031 | } |
| 1027 | 1032 | ||
| @@ -1237,7 +1242,7 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) | |||
| 1237 | /* ouch - failed to read all of that. | 1242 | /* ouch - failed to read all of that. |
| 1238 | * Try some synchronous reads of other devices to get | 1243 | * Try some synchronous reads of other devices to get |
| 1239 | * good data, much like with normal read errors. Only | 1244 | * good data, much like with normal read errors. Only |
| 1240 | * read into the pages we already have so they we don't | 1245 | * read into the pages we already have so we don't |
| 1241 | * need to re-issue the read request. | 1246 | * need to re-issue the read request. |
| 1242 | * We don't need to freeze the array, because being in an | 1247 | * We don't need to freeze the array, because being in an |
| 1243 | * active sync request, there is no normal IO, and | 1248 | * active sync request, there is no normal IO, and |
| @@ -1257,6 +1262,10 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) | |||
| 1257 | s = PAGE_SIZE >> 9; | 1262 | s = PAGE_SIZE >> 9; |
| 1258 | do { | 1263 | do { |
| 1259 | if (r1_bio->bios[d]->bi_end_io == end_sync_read) { | 1264 | if (r1_bio->bios[d]->bi_end_io == end_sync_read) { |
| 1265 | /* No rcu protection needed here devices | ||
| 1266 | * can only be removed when no resync is | ||
| 1267 | * active, and resync is currently active | ||
| 1268 | */ | ||
| 1260 | rdev = conf->mirrors[d].rdev; | 1269 | rdev = conf->mirrors[d].rdev; |
| 1261 | if (sync_page_io(rdev->bdev, | 1270 | if (sync_page_io(rdev->bdev, |
| 1262 | sect + rdev->data_offset, | 1271 | sect + rdev->data_offset, |
| @@ -1463,6 +1472,11 @@ static void raid1d(mddev_t *mddev) | |||
| 1463 | s = PAGE_SIZE >> 9; | 1472 | s = PAGE_SIZE >> 9; |
| 1464 | 1473 | ||
| 1465 | do { | 1474 | do { |
| 1475 | /* Note: no rcu protection needed here | ||
| 1476 | * as this is synchronous in the raid1d thread | ||
| 1477 | * which is the thread that might remove | ||
| 1478 | * a device. If raid1d ever becomes multi-threaded.... | ||
| 1479 | */ | ||
| 1466 | rdev = conf->mirrors[d].rdev; | 1480 | rdev = conf->mirrors[d].rdev; |
| 1467 | if (rdev && | 1481 | if (rdev && |
| 1468 | test_bit(In_sync, &rdev->flags) && | 1482 | test_bit(In_sync, &rdev->flags) && |
| @@ -1486,7 +1500,6 @@ static void raid1d(mddev_t *mddev) | |||
| 1486 | d = conf->raid_disks; | 1500 | d = conf->raid_disks; |
| 1487 | d--; | 1501 | d--; |
| 1488 | rdev = conf->mirrors[d].rdev; | 1502 | rdev = conf->mirrors[d].rdev; |
| 1489 | atomic_add(s, &rdev->corrected_errors); | ||
| 1490 | if (rdev && | 1503 | if (rdev && |
| 1491 | test_bit(In_sync, &rdev->flags)) { | 1504 | test_bit(In_sync, &rdev->flags)) { |
| 1492 | if (sync_page_io(rdev->bdev, | 1505 | if (sync_page_io(rdev->bdev, |
| @@ -1509,9 +1522,11 @@ static void raid1d(mddev_t *mddev) | |||
| 1509 | s<<9, conf->tmppage, READ) == 0) | 1522 | s<<9, conf->tmppage, READ) == 0) |
| 1510 | /* Well, this device is dead */ | 1523 | /* Well, this device is dead */ |
| 1511 | md_error(mddev, rdev); | 1524 | md_error(mddev, rdev); |
| 1512 | else | 1525 | else { |
| 1526 | atomic_add(s, &rdev->corrected_errors); | ||
| 1513 | printk(KERN_INFO "raid1:%s: read error corrected (%d sectors at %llu on %s)\n", | 1527 | printk(KERN_INFO "raid1:%s: read error corrected (%d sectors at %llu on %s)\n", |
| 1514 | mdname(mddev), s, (unsigned long long)(sect + rdev->data_offset), bdevname(rdev->bdev, b)); | 1528 | mdname(mddev), s, (unsigned long long)(sect + rdev->data_offset), bdevname(rdev->bdev, b)); |
| 1529 | } | ||
| 1515 | } | 1530 | } |
| 1516 | } | 1531 | } |
| 1517 | } else { | 1532 | } else { |
| @@ -1787,19 +1802,17 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i | |||
| 1787 | for (i=0; i<conf->raid_disks; i++) { | 1802 | for (i=0; i<conf->raid_disks; i++) { |
| 1788 | bio = r1_bio->bios[i]; | 1803 | bio = r1_bio->bios[i]; |
| 1789 | if (bio->bi_end_io == end_sync_read) { | 1804 | if (bio->bi_end_io == end_sync_read) { |
| 1790 | md_sync_acct(conf->mirrors[i].rdev->bdev, nr_sectors); | 1805 | md_sync_acct(bio->bi_bdev, nr_sectors); |
| 1791 | generic_make_request(bio); | 1806 | generic_make_request(bio); |
| 1792 | } | 1807 | } |
| 1793 | } | 1808 | } |
| 1794 | } else { | 1809 | } else { |
| 1795 | atomic_set(&r1_bio->remaining, 1); | 1810 | atomic_set(&r1_bio->remaining, 1); |
| 1796 | bio = r1_bio->bios[r1_bio->read_disk]; | 1811 | bio = r1_bio->bios[r1_bio->read_disk]; |
| 1797 | md_sync_acct(conf->mirrors[r1_bio->read_disk].rdev->bdev, | 1812 | md_sync_acct(bio->bi_bdev, nr_sectors); |
| 1798 | nr_sectors); | ||
| 1799 | generic_make_request(bio); | 1813 | generic_make_request(bio); |
| 1800 | 1814 | ||
| 1801 | } | 1815 | } |
| 1802 | |||
| 1803 | return nr_sectors; | 1816 | return nr_sectors; |
| 1804 | } | 1817 | } |
| 1805 | 1818 | ||
