diff options
Diffstat (limited to 'drivers/md')
| -rw-r--r-- | drivers/md/.gitignore | 4 | ||||
| -rw-r--r-- | drivers/md/bitmap.c | 3 | ||||
| -rw-r--r-- | drivers/md/md.c | 71 | ||||
| -rw-r--r-- | drivers/md/md.h | 2 | ||||
| -rw-r--r-- | drivers/md/raid1.c | 21 | ||||
| -rw-r--r-- | drivers/md/raid10.c | 17 | ||||
| -rw-r--r-- | drivers/md/raid5.c | 13 |
7 files changed, 62 insertions, 69 deletions
diff --git a/drivers/md/.gitignore b/drivers/md/.gitignore deleted file mode 100644 index a7afec6b19c6..000000000000 --- a/drivers/md/.gitignore +++ /dev/null | |||
| @@ -1,4 +0,0 @@ | |||
| 1 | mktables | ||
| 2 | raid6altivec*.c | ||
| 3 | raid6int*.c | ||
| 4 | raid6tables.c | ||
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 1ba1e122e948..ed4900ade93a 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
| @@ -1542,8 +1542,7 @@ void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector) | |||
| 1542 | atomic_read(&bitmap->mddev->recovery_active) == 0); | 1542 | atomic_read(&bitmap->mddev->recovery_active) == 0); |
| 1543 | 1543 | ||
| 1544 | bitmap->mddev->curr_resync_completed = bitmap->mddev->curr_resync; | 1544 | bitmap->mddev->curr_resync_completed = bitmap->mddev->curr_resync; |
| 1545 | if (bitmap->mddev->persistent) | 1545 | set_bit(MD_CHANGE_CLEAN, &bitmap->mddev->flags); |
| 1546 | set_bit(MD_CHANGE_CLEAN, &bitmap->mddev->flags); | ||
| 1547 | sector &= ~((1ULL << CHUNK_BLOCK_SHIFT(bitmap)) - 1); | 1546 | sector &= ~((1ULL << CHUNK_BLOCK_SHIFT(bitmap)) - 1); |
| 1548 | s = 0; | 1547 | s = 0; |
| 1549 | while (s < sector && s < bitmap->mddev->resync_max_sectors) { | 1548 | while (s < sector && s < bitmap->mddev->resync_max_sectors) { |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 11567c7999a2..f20d13e717d5 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1643,7 +1643,9 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
| 1643 | bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1; | 1643 | bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1; |
| 1644 | if (rdev->sb_size & bmask) | 1644 | if (rdev->sb_size & bmask) |
| 1645 | rdev->sb_size = (rdev->sb_size | bmask) + 1; | 1645 | rdev->sb_size = (rdev->sb_size | bmask) + 1; |
| 1646 | } | 1646 | } else |
| 1647 | max_dev = le32_to_cpu(sb->max_dev); | ||
| 1648 | |||
| 1647 | for (i=0; i<max_dev;i++) | 1649 | for (i=0; i<max_dev;i++) |
| 1648 | sb->dev_roles[i] = cpu_to_le16(0xfffe); | 1650 | sb->dev_roles[i] = cpu_to_le16(0xfffe); |
| 1649 | 1651 | ||
| @@ -2136,16 +2138,6 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
| 2136 | * with the rest of the array) | 2138 | * with the rest of the array) |
| 2137 | */ | 2139 | */ |
| 2138 | mdk_rdev_t *rdev; | 2140 | mdk_rdev_t *rdev; |
| 2139 | |||
| 2140 | /* First make sure individual recovery_offsets are correct */ | ||
| 2141 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 2142 | if (rdev->raid_disk >= 0 && | ||
| 2143 | mddev->delta_disks >= 0 && | ||
| 2144 | !test_bit(In_sync, &rdev->flags) && | ||
| 2145 | mddev->curr_resync_completed > rdev->recovery_offset) | ||
| 2146 | rdev->recovery_offset = mddev->curr_resync_completed; | ||
| 2147 | |||
| 2148 | } | ||
| 2149 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2141 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 2150 | if (rdev->sb_events == mddev->events || | 2142 | if (rdev->sb_events == mddev->events || |
| 2151 | (nospares && | 2143 | (nospares && |
| @@ -2167,13 +2159,27 @@ static void md_update_sb(mddev_t * mddev, int force_change) | |||
| 2167 | int sync_req; | 2159 | int sync_req; |
| 2168 | int nospares = 0; | 2160 | int nospares = 0; |
| 2169 | 2161 | ||
| 2170 | mddev->utime = get_seconds(); | ||
| 2171 | if (mddev->external) | ||
| 2172 | return; | ||
| 2173 | repeat: | 2162 | repeat: |
| 2163 | /* First make sure individual recovery_offsets are correct */ | ||
| 2164 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 2165 | if (rdev->raid_disk >= 0 && | ||
| 2166 | mddev->delta_disks >= 0 && | ||
| 2167 | !test_bit(In_sync, &rdev->flags) && | ||
| 2168 | mddev->curr_resync_completed > rdev->recovery_offset) | ||
| 2169 | rdev->recovery_offset = mddev->curr_resync_completed; | ||
| 2170 | |||
| 2171 | } | ||
| 2172 | if (!mddev->persistent) { | ||
| 2173 | clear_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 2174 | clear_bit(MD_CHANGE_DEVS, &mddev->flags); | ||
| 2175 | wake_up(&mddev->sb_wait); | ||
| 2176 | return; | ||
| 2177 | } | ||
| 2178 | |||
| 2174 | spin_lock_irq(&mddev->write_lock); | 2179 | spin_lock_irq(&mddev->write_lock); |
| 2175 | 2180 | ||
| 2176 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | 2181 | mddev->utime = get_seconds(); |
| 2182 | |||
| 2177 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) | 2183 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) |
| 2178 | force_change = 1; | 2184 | force_change = 1; |
| 2179 | if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) | 2185 | if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) |
| @@ -2221,19 +2227,6 @@ repeat: | |||
| 2221 | MD_BUG(); | 2227 | MD_BUG(); |
| 2222 | mddev->events --; | 2228 | mddev->events --; |
| 2223 | } | 2229 | } |
| 2224 | |||
| 2225 | /* | ||
| 2226 | * do not write anything to disk if using | ||
| 2227 | * nonpersistent superblocks | ||
| 2228 | */ | ||
| 2229 | if (!mddev->persistent) { | ||
| 2230 | if (!mddev->external) | ||
| 2231 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 2232 | |||
| 2233 | spin_unlock_irq(&mddev->write_lock); | ||
| 2234 | wake_up(&mddev->sb_wait); | ||
| 2235 | return; | ||
| 2236 | } | ||
| 2237 | sync_sbs(mddev, nospares); | 2230 | sync_sbs(mddev, nospares); |
| 2238 | spin_unlock_irq(&mddev->write_lock); | 2231 | spin_unlock_irq(&mddev->write_lock); |
| 2239 | 2232 | ||
| @@ -3379,7 +3372,7 @@ array_state_show(mddev_t *mddev, char *page) | |||
| 3379 | case 0: | 3372 | case 0: |
| 3380 | if (mddev->in_sync) | 3373 | if (mddev->in_sync) |
| 3381 | st = clean; | 3374 | st = clean; |
| 3382 | else if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) | 3375 | else if (test_bit(MD_CHANGE_PENDING, &mddev->flags)) |
| 3383 | st = write_pending; | 3376 | st = write_pending; |
| 3384 | else if (mddev->safemode) | 3377 | else if (mddev->safemode) |
| 3385 | st = active_idle; | 3378 | st = active_idle; |
| @@ -3460,9 +3453,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3460 | mddev->in_sync = 1; | 3453 | mddev->in_sync = 1; |
| 3461 | if (mddev->safemode == 1) | 3454 | if (mddev->safemode == 1) |
| 3462 | mddev->safemode = 0; | 3455 | mddev->safemode = 0; |
| 3463 | if (mddev->persistent) | 3456 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 3464 | set_bit(MD_CHANGE_CLEAN, | ||
| 3465 | &mddev->flags); | ||
| 3466 | } | 3457 | } |
| 3467 | err = 0; | 3458 | err = 0; |
| 3468 | } else | 3459 | } else |
| @@ -3474,8 +3465,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3474 | case active: | 3465 | case active: |
| 3475 | if (mddev->pers) { | 3466 | if (mddev->pers) { |
| 3476 | restart_array(mddev); | 3467 | restart_array(mddev); |
| 3477 | if (mddev->external) | 3468 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); |
| 3478 | clear_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 3479 | wake_up(&mddev->sb_wait); | 3469 | wake_up(&mddev->sb_wait); |
| 3480 | err = 0; | 3470 | err = 0; |
| 3481 | } else { | 3471 | } else { |
| @@ -6580,6 +6570,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
| 6580 | if (mddev->in_sync) { | 6570 | if (mddev->in_sync) { |
| 6581 | mddev->in_sync = 0; | 6571 | mddev->in_sync = 0; |
| 6582 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | 6572 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 6573 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 6583 | md_wakeup_thread(mddev->thread); | 6574 | md_wakeup_thread(mddev->thread); |
| 6584 | did_change = 1; | 6575 | did_change = 1; |
| 6585 | } | 6576 | } |
| @@ -6588,7 +6579,6 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
| 6588 | if (did_change) | 6579 | if (did_change) |
| 6589 | sysfs_notify_dirent_safe(mddev->sysfs_state); | 6580 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 6590 | wait_event(mddev->sb_wait, | 6581 | wait_event(mddev->sb_wait, |
| 6591 | !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && | ||
| 6592 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); | 6582 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); |
| 6593 | } | 6583 | } |
| 6594 | 6584 | ||
| @@ -6624,6 +6614,7 @@ int md_allow_write(mddev_t *mddev) | |||
| 6624 | if (mddev->in_sync) { | 6614 | if (mddev->in_sync) { |
| 6625 | mddev->in_sync = 0; | 6615 | mddev->in_sync = 0; |
| 6626 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | 6616 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 6617 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 6627 | if (mddev->safemode_delay && | 6618 | if (mddev->safemode_delay && |
| 6628 | mddev->safemode == 0) | 6619 | mddev->safemode == 0) |
| 6629 | mddev->safemode = 1; | 6620 | mddev->safemode = 1; |
| @@ -6633,7 +6624,7 @@ int md_allow_write(mddev_t *mddev) | |||
| 6633 | } else | 6624 | } else |
| 6634 | spin_unlock_irq(&mddev->write_lock); | 6625 | spin_unlock_irq(&mddev->write_lock); |
| 6635 | 6626 | ||
| 6636 | if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) | 6627 | if (test_bit(MD_CHANGE_PENDING, &mddev->flags)) |
| 6637 | return -EAGAIN; | 6628 | return -EAGAIN; |
| 6638 | else | 6629 | else |
| 6639 | return 0; | 6630 | return 0; |
| @@ -6831,8 +6822,7 @@ void md_do_sync(mddev_t *mddev) | |||
| 6831 | atomic_read(&mddev->recovery_active) == 0); | 6822 | atomic_read(&mddev->recovery_active) == 0); |
| 6832 | mddev->curr_resync_completed = | 6823 | mddev->curr_resync_completed = |
| 6833 | mddev->curr_resync; | 6824 | mddev->curr_resync; |
| 6834 | if (mddev->persistent) | 6825 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 6835 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 6836 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); | 6826 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); |
| 6837 | } | 6827 | } |
| 6838 | 6828 | ||
| @@ -7081,7 +7071,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7081 | if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) | 7071 | if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) |
| 7082 | return; | 7072 | return; |
| 7083 | if ( ! ( | 7073 | if ( ! ( |
| 7084 | (mddev->flags && !mddev->external) || | 7074 | (mddev->flags & ~ (1<<MD_CHANGE_PENDING)) || |
| 7085 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || | 7075 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || |
| 7086 | test_bit(MD_RECOVERY_DONE, &mddev->recovery) || | 7076 | test_bit(MD_RECOVERY_DONE, &mddev->recovery) || |
| 7087 | (mddev->external == 0 && mddev->safemode == 1) || | 7077 | (mddev->external == 0 && mddev->safemode == 1) || |
| @@ -7111,8 +7101,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7111 | mddev->recovery_cp == MaxSector) { | 7101 | mddev->recovery_cp == MaxSector) { |
| 7112 | mddev->in_sync = 1; | 7102 | mddev->in_sync = 1; |
| 7113 | did_change = 1; | 7103 | did_change = 1; |
| 7114 | if (mddev->persistent) | 7104 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 7115 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 7116 | } | 7105 | } |
| 7117 | if (mddev->safemode == 1) | 7106 | if (mddev->safemode == 1) |
| 7118 | mddev->safemode = 0; | 7107 | mddev->safemode = 0; |
diff --git a/drivers/md/md.h b/drivers/md/md.h index a953fe2808ae..3931299788dc 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
| @@ -140,7 +140,7 @@ struct mddev_s | |||
| 140 | unsigned long flags; | 140 | unsigned long flags; |
| 141 | #define MD_CHANGE_DEVS 0 /* Some device status has changed */ | 141 | #define MD_CHANGE_DEVS 0 /* Some device status has changed */ |
| 142 | #define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */ | 142 | #define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */ |
| 143 | #define MD_CHANGE_PENDING 2 /* superblock update in progress */ | 143 | #define MD_CHANGE_PENDING 2 /* switch from 'clean' to 'active' in progress */ |
| 144 | 144 | ||
| 145 | int suspended; | 145 | int suspended; |
| 146 | atomic_t active_io; | 146 | atomic_t active_io; |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 73cc74ffc26b..ad83a4dcadc3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -787,8 +787,8 @@ static int make_request(mddev_t *mddev, struct bio * bio) | |||
| 787 | struct bio_list bl; | 787 | struct bio_list bl; |
| 788 | struct page **behind_pages = NULL; | 788 | struct page **behind_pages = NULL; |
| 789 | const int rw = bio_data_dir(bio); | 789 | const int rw = bio_data_dir(bio); |
| 790 | const bool do_sync = (bio->bi_rw & REQ_SYNC); | 790 | const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); |
| 791 | bool do_barriers; | 791 | unsigned long do_barriers; |
| 792 | mdk_rdev_t *blocked_rdev; | 792 | mdk_rdev_t *blocked_rdev; |
| 793 | 793 | ||
| 794 | /* | 794 | /* |
| @@ -1120,6 +1120,8 @@ static int raid1_spare_active(mddev_t *mddev) | |||
| 1120 | { | 1120 | { |
| 1121 | int i; | 1121 | int i; |
| 1122 | conf_t *conf = mddev->private; | 1122 | conf_t *conf = mddev->private; |
| 1123 | int count = 0; | ||
| 1124 | unsigned long flags; | ||
| 1123 | 1125 | ||
| 1124 | /* | 1126 | /* |
| 1125 | * Find all failed disks within the RAID1 configuration | 1127 | * Find all failed disks within the RAID1 configuration |
| @@ -1131,15 +1133,16 @@ static int raid1_spare_active(mddev_t *mddev) | |||
| 1131 | if (rdev | 1133 | if (rdev |
| 1132 | && !test_bit(Faulty, &rdev->flags) | 1134 | && !test_bit(Faulty, &rdev->flags) |
| 1133 | && !test_and_set_bit(In_sync, &rdev->flags)) { | 1135 | && !test_and_set_bit(In_sync, &rdev->flags)) { |
| 1134 | unsigned long flags; | 1136 | count++; |
| 1135 | spin_lock_irqsave(&conf->device_lock, flags); | 1137 | sysfs_notify_dirent(rdev->sysfs_state); |
| 1136 | mddev->degraded--; | ||
| 1137 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1138 | } | 1138 | } |
| 1139 | } | 1139 | } |
| 1140 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 1141 | mddev->degraded -= count; | ||
| 1142 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1140 | 1143 | ||
| 1141 | print_conf(conf); | 1144 | print_conf(conf); |
| 1142 | return 0; | 1145 | return count; |
| 1143 | } | 1146 | } |
| 1144 | 1147 | ||
| 1145 | 1148 | ||
| @@ -1640,7 +1643,7 @@ static void raid1d(mddev_t *mddev) | |||
| 1640 | * We already have a nr_pending reference on these rdevs. | 1643 | * We already have a nr_pending reference on these rdevs. |
| 1641 | */ | 1644 | */ |
| 1642 | int i; | 1645 | int i; |
| 1643 | const bool do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC); | 1646 | const unsigned long do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC); |
| 1644 | clear_bit(R1BIO_BarrierRetry, &r1_bio->state); | 1647 | clear_bit(R1BIO_BarrierRetry, &r1_bio->state); |
| 1645 | clear_bit(R1BIO_Barrier, &r1_bio->state); | 1648 | clear_bit(R1BIO_Barrier, &r1_bio->state); |
| 1646 | for (i=0; i < conf->raid_disks; i++) | 1649 | for (i=0; i < conf->raid_disks; i++) |
| @@ -1696,7 +1699,7 @@ static void raid1d(mddev_t *mddev) | |||
| 1696 | (unsigned long long)r1_bio->sector); | 1699 | (unsigned long long)r1_bio->sector); |
| 1697 | raid_end_bio_io(r1_bio); | 1700 | raid_end_bio_io(r1_bio); |
| 1698 | } else { | 1701 | } else { |
| 1699 | const bool do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC; | 1702 | const unsigned long do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC; |
| 1700 | r1_bio->bios[r1_bio->read_disk] = | 1703 | r1_bio->bios[r1_bio->read_disk] = |
| 1701 | mddev->ro ? IO_BLOCKED : NULL; | 1704 | mddev->ro ? IO_BLOCKED : NULL; |
| 1702 | r1_bio->read_disk = disk; | 1705 | r1_bio->read_disk = disk; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index a88aeb5198c7..84718383124d 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -799,7 +799,7 @@ static int make_request(mddev_t *mddev, struct bio * bio) | |||
| 799 | int i; | 799 | int i; |
| 800 | int chunk_sects = conf->chunk_mask + 1; | 800 | int chunk_sects = conf->chunk_mask + 1; |
| 801 | const int rw = bio_data_dir(bio); | 801 | const int rw = bio_data_dir(bio); |
| 802 | const bool do_sync = (bio->bi_rw & REQ_SYNC); | 802 | const unsigned long do_sync = (bio->bi_rw & REQ_SYNC); |
| 803 | struct bio_list bl; | 803 | struct bio_list bl; |
| 804 | unsigned long flags; | 804 | unsigned long flags; |
| 805 | mdk_rdev_t *blocked_rdev; | 805 | mdk_rdev_t *blocked_rdev; |
| @@ -1116,6 +1116,8 @@ static int raid10_spare_active(mddev_t *mddev) | |||
| 1116 | int i; | 1116 | int i; |
| 1117 | conf_t *conf = mddev->private; | 1117 | conf_t *conf = mddev->private; |
| 1118 | mirror_info_t *tmp; | 1118 | mirror_info_t *tmp; |
| 1119 | int count = 0; | ||
| 1120 | unsigned long flags; | ||
| 1119 | 1121 | ||
| 1120 | /* | 1122 | /* |
| 1121 | * Find all non-in_sync disks within the RAID10 configuration | 1123 | * Find all non-in_sync disks within the RAID10 configuration |
| @@ -1126,15 +1128,16 @@ static int raid10_spare_active(mddev_t *mddev) | |||
| 1126 | if (tmp->rdev | 1128 | if (tmp->rdev |
| 1127 | && !test_bit(Faulty, &tmp->rdev->flags) | 1129 | && !test_bit(Faulty, &tmp->rdev->flags) |
| 1128 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { | 1130 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
| 1129 | unsigned long flags; | 1131 | count++; |
| 1130 | spin_lock_irqsave(&conf->device_lock, flags); | 1132 | sysfs_notify_dirent(tmp->rdev->sysfs_state); |
| 1131 | mddev->degraded--; | ||
| 1132 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1133 | } | 1133 | } |
| 1134 | } | 1134 | } |
| 1135 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 1136 | mddev->degraded -= count; | ||
| 1137 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1135 | 1138 | ||
| 1136 | print_conf(conf); | 1139 | print_conf(conf); |
| 1137 | return 0; | 1140 | return count; |
| 1138 | } | 1141 | } |
| 1139 | 1142 | ||
| 1140 | 1143 | ||
| @@ -1734,7 +1737,7 @@ static void raid10d(mddev_t *mddev) | |||
| 1734 | raid_end_bio_io(r10_bio); | 1737 | raid_end_bio_io(r10_bio); |
| 1735 | bio_put(bio); | 1738 | bio_put(bio); |
| 1736 | } else { | 1739 | } else { |
| 1737 | const bool do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); | 1740 | const unsigned long do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); |
| 1738 | bio_put(bio); | 1741 | bio_put(bio); |
| 1739 | rdev = conf->mirrors[mirror].rdev; | 1742 | rdev = conf->mirrors[mirror].rdev; |
| 1740 | if (printk_ratelimit()) | 1743 | if (printk_ratelimit()) |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 866d4b5a144c..69b0a169e43d 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -5330,6 +5330,8 @@ static int raid5_spare_active(mddev_t *mddev) | |||
| 5330 | int i; | 5330 | int i; |
| 5331 | raid5_conf_t *conf = mddev->private; | 5331 | raid5_conf_t *conf = mddev->private; |
| 5332 | struct disk_info *tmp; | 5332 | struct disk_info *tmp; |
| 5333 | int count = 0; | ||
| 5334 | unsigned long flags; | ||
| 5333 | 5335 | ||
| 5334 | for (i = 0; i < conf->raid_disks; i++) { | 5336 | for (i = 0; i < conf->raid_disks; i++) { |
| 5335 | tmp = conf->disks + i; | 5337 | tmp = conf->disks + i; |
| @@ -5337,14 +5339,15 @@ static int raid5_spare_active(mddev_t *mddev) | |||
| 5337 | && tmp->rdev->recovery_offset == MaxSector | 5339 | && tmp->rdev->recovery_offset == MaxSector |
| 5338 | && !test_bit(Faulty, &tmp->rdev->flags) | 5340 | && !test_bit(Faulty, &tmp->rdev->flags) |
| 5339 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { | 5341 | && !test_and_set_bit(In_sync, &tmp->rdev->flags)) { |
| 5340 | unsigned long flags; | 5342 | count++; |
| 5341 | spin_lock_irqsave(&conf->device_lock, flags); | 5343 | sysfs_notify_dirent(tmp->rdev->sysfs_state); |
| 5342 | mddev->degraded--; | ||
| 5343 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 5344 | } | 5344 | } |
| 5345 | } | 5345 | } |
| 5346 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 5347 | mddev->degraded -= count; | ||
| 5348 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 5346 | print_raid5_conf(conf); | 5349 | print_raid5_conf(conf); |
| 5347 | return 0; | 5350 | return count; |
| 5348 | } | 5351 | } |
| 5349 | 5352 | ||
| 5350 | static int raid5_remove_disk(mddev_t *mddev, int number) | 5353 | static int raid5_remove_disk(mddev_t *mddev, int number) |
