diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-15 03:07:36 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-15 03:07:36 -0500 |
commit | 1a60864fc1c3b268a921549bcfc707c98083260b (patch) | |
tree | c38dc16671a83c9cac9860e50d02f39ad21cc298 /drivers/md/md.c | |
parent | 145830dfb005961cb507a578c9d2e7622f0b3716 (diff) | |
parent | 8313b8e57f55b15e5b7f7fc5d1630bbf686a9a97 (diff) |
Merge tag 'md/3.13-fixes' of git://neil.brown.name/md
Pull late md fixes from Neil Brown:
"Half a dozen md bug fixes.
All of these fix real bugs the people have hit, and are tagged for
-stable. Sorry they are late .... Christmas holidays and all that.
Hopefully they can still squeak into 3.13"
* tag 'md/3.13-fixes' of git://neil.brown.name/md:
md: fix problem when adding device to read-only array with bitmap.
md/raid10: fix bug when raid10 recovery fails to recover a block.
md/raid5: fix a recently broken BUG_ON().
md/raid1: fix request counting bug in new 'barrier' code.
md/raid10: fix two bugs in handling of known-bad-blocks.
md/raid5: Fix possible confusion when multiple write errors occur.
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 21f4d7ff0da2..369d919bdafe 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1077,6 +1077,7 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
1077 | rdev->raid_disk = -1; | 1077 | rdev->raid_disk = -1; |
1078 | clear_bit(Faulty, &rdev->flags); | 1078 | clear_bit(Faulty, &rdev->flags); |
1079 | clear_bit(In_sync, &rdev->flags); | 1079 | clear_bit(In_sync, &rdev->flags); |
1080 | clear_bit(Bitmap_sync, &rdev->flags); | ||
1080 | clear_bit(WriteMostly, &rdev->flags); | 1081 | clear_bit(WriteMostly, &rdev->flags); |
1081 | 1082 | ||
1082 | if (mddev->raid_disks == 0) { | 1083 | if (mddev->raid_disks == 0) { |
@@ -1155,6 +1156,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
1155 | */ | 1156 | */ |
1156 | if (ev1 < mddev->bitmap->events_cleared) | 1157 | if (ev1 < mddev->bitmap->events_cleared) |
1157 | return 0; | 1158 | return 0; |
1159 | if (ev1 < mddev->events) | ||
1160 | set_bit(Bitmap_sync, &rdev->flags); | ||
1158 | } else { | 1161 | } else { |
1159 | if (ev1 < mddev->events) | 1162 | if (ev1 < mddev->events) |
1160 | /* just a hot-add of a new device, leave raid_disk at -1 */ | 1163 | /* just a hot-add of a new device, leave raid_disk at -1 */ |
@@ -1563,6 +1566,7 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
1563 | rdev->raid_disk = -1; | 1566 | rdev->raid_disk = -1; |
1564 | clear_bit(Faulty, &rdev->flags); | 1567 | clear_bit(Faulty, &rdev->flags); |
1565 | clear_bit(In_sync, &rdev->flags); | 1568 | clear_bit(In_sync, &rdev->flags); |
1569 | clear_bit(Bitmap_sync, &rdev->flags); | ||
1566 | clear_bit(WriteMostly, &rdev->flags); | 1570 | clear_bit(WriteMostly, &rdev->flags); |
1567 | 1571 | ||
1568 | if (mddev->raid_disks == 0) { | 1572 | if (mddev->raid_disks == 0) { |
@@ -1645,6 +1649,8 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) | |||
1645 | */ | 1649 | */ |
1646 | if (ev1 < mddev->bitmap->events_cleared) | 1650 | if (ev1 < mddev->bitmap->events_cleared) |
1647 | return 0; | 1651 | return 0; |
1652 | if (ev1 < mddev->events) | ||
1653 | set_bit(Bitmap_sync, &rdev->flags); | ||
1648 | } else { | 1654 | } else { |
1649 | if (ev1 < mddev->events) | 1655 | if (ev1 < mddev->events) |
1650 | /* just a hot-add of a new device, leave raid_disk at -1 */ | 1656 | /* just a hot-add of a new device, leave raid_disk at -1 */ |
@@ -2788,6 +2794,7 @@ slot_store(struct md_rdev *rdev, const char *buf, size_t len) | |||
2788 | else | 2794 | else |
2789 | rdev->saved_raid_disk = -1; | 2795 | rdev->saved_raid_disk = -1; |
2790 | clear_bit(In_sync, &rdev->flags); | 2796 | clear_bit(In_sync, &rdev->flags); |
2797 | clear_bit(Bitmap_sync, &rdev->flags); | ||
2791 | err = rdev->mddev->pers-> | 2798 | err = rdev->mddev->pers-> |
2792 | hot_add_disk(rdev->mddev, rdev); | 2799 | hot_add_disk(rdev->mddev, rdev); |
2793 | if (err) { | 2800 | if (err) { |
@@ -5760,6 +5767,7 @@ static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info) | |||
5760 | info->raid_disk < mddev->raid_disks) { | 5767 | info->raid_disk < mddev->raid_disks) { |
5761 | rdev->raid_disk = info->raid_disk; | 5768 | rdev->raid_disk = info->raid_disk; |
5762 | set_bit(In_sync, &rdev->flags); | 5769 | set_bit(In_sync, &rdev->flags); |
5770 | clear_bit(Bitmap_sync, &rdev->flags); | ||
5763 | } else | 5771 | } else |
5764 | rdev->raid_disk = -1; | 5772 | rdev->raid_disk = -1; |
5765 | } else | 5773 | } else |
@@ -7706,7 +7714,8 @@ static int remove_and_add_spares(struct mddev *mddev, | |||
7706 | if (test_bit(Faulty, &rdev->flags)) | 7714 | if (test_bit(Faulty, &rdev->flags)) |
7707 | continue; | 7715 | continue; |
7708 | if (mddev->ro && | 7716 | if (mddev->ro && |
7709 | rdev->saved_raid_disk < 0) | 7717 | ! (rdev->saved_raid_disk >= 0 && |
7718 | !test_bit(Bitmap_sync, &rdev->flags))) | ||
7710 | continue; | 7719 | continue; |
7711 | 7720 | ||
7712 | rdev->recovery_offset = 0; | 7721 | rdev->recovery_offset = 0; |
@@ -7787,9 +7796,12 @@ void md_check_recovery(struct mddev *mddev) | |||
7787 | * As we only add devices that are already in-sync, | 7796 | * As we only add devices that are already in-sync, |
7788 | * we can activate the spares immediately. | 7797 | * we can activate the spares immediately. |
7789 | */ | 7798 | */ |
7790 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
7791 | remove_and_add_spares(mddev, NULL); | 7799 | remove_and_add_spares(mddev, NULL); |
7792 | mddev->pers->spare_active(mddev); | 7800 | /* There is no thread, but we need to call |
7801 | * ->spare_active and clear saved_raid_disk | ||
7802 | */ | ||
7803 | md_reap_sync_thread(mddev); | ||
7804 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
7793 | goto unlock; | 7805 | goto unlock; |
7794 | } | 7806 | } |
7795 | 7807 | ||