diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index c148b6302154..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 | ||
| @@ -2167,9 +2169,9 @@ repeat: | |||
| 2167 | rdev->recovery_offset = mddev->curr_resync_completed; | 2169 | rdev->recovery_offset = mddev->curr_resync_completed; |
| 2168 | 2170 | ||
| 2169 | } | 2171 | } |
| 2170 | if (mddev->external || !mddev->persistent) { | 2172 | if (!mddev->persistent) { |
| 2171 | clear_bit(MD_CHANGE_DEVS, &mddev->flags); | ||
| 2172 | clear_bit(MD_CHANGE_CLEAN, &mddev->flags); | 2173 | clear_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 2174 | clear_bit(MD_CHANGE_DEVS, &mddev->flags); | ||
| 2173 | wake_up(&mddev->sb_wait); | 2175 | wake_up(&mddev->sb_wait); |
| 2174 | return; | 2176 | return; |
| 2175 | } | 2177 | } |
| @@ -2178,7 +2180,6 @@ repeat: | |||
| 2178 | 2180 | ||
| 2179 | mddev->utime = get_seconds(); | 2181 | mddev->utime = get_seconds(); |
| 2180 | 2182 | ||
| 2181 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 2182 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) | 2183 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) |
| 2183 | force_change = 1; | 2184 | force_change = 1; |
| 2184 | if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) | 2185 | if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) |
| @@ -3371,7 +3372,7 @@ array_state_show(mddev_t *mddev, char *page) | |||
| 3371 | case 0: | 3372 | case 0: |
| 3372 | if (mddev->in_sync) | 3373 | if (mddev->in_sync) |
| 3373 | st = clean; | 3374 | st = clean; |
| 3374 | else if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) | 3375 | else if (test_bit(MD_CHANGE_PENDING, &mddev->flags)) |
| 3375 | st = write_pending; | 3376 | st = write_pending; |
| 3376 | else if (mddev->safemode) | 3377 | else if (mddev->safemode) |
| 3377 | st = active_idle; | 3378 | st = active_idle; |
| @@ -3452,9 +3453,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3452 | mddev->in_sync = 1; | 3453 | mddev->in_sync = 1; |
| 3453 | if (mddev->safemode == 1) | 3454 | if (mddev->safemode == 1) |
| 3454 | mddev->safemode = 0; | 3455 | mddev->safemode = 0; |
| 3455 | if (mddev->persistent) | 3456 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 3456 | set_bit(MD_CHANGE_CLEAN, | ||
| 3457 | &mddev->flags); | ||
| 3458 | } | 3457 | } |
| 3459 | err = 0; | 3458 | err = 0; |
| 3460 | } else | 3459 | } else |
| @@ -3466,8 +3465,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3466 | case active: | 3465 | case active: |
| 3467 | if (mddev->pers) { | 3466 | if (mddev->pers) { |
| 3468 | restart_array(mddev); | 3467 | restart_array(mddev); |
| 3469 | if (mddev->external) | 3468 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); |
| 3470 | clear_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 3471 | wake_up(&mddev->sb_wait); | 3469 | wake_up(&mddev->sb_wait); |
| 3472 | err = 0; | 3470 | err = 0; |
| 3473 | } else { | 3471 | } else { |
| @@ -6572,6 +6570,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
| 6572 | if (mddev->in_sync) { | 6570 | if (mddev->in_sync) { |
| 6573 | mddev->in_sync = 0; | 6571 | mddev->in_sync = 0; |
| 6574 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | 6572 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 6573 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 6575 | md_wakeup_thread(mddev->thread); | 6574 | md_wakeup_thread(mddev->thread); |
| 6576 | did_change = 1; | 6575 | did_change = 1; |
| 6577 | } | 6576 | } |
| @@ -6580,7 +6579,6 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
| 6580 | if (did_change) | 6579 | if (did_change) |
| 6581 | sysfs_notify_dirent_safe(mddev->sysfs_state); | 6580 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 6582 | wait_event(mddev->sb_wait, | 6581 | wait_event(mddev->sb_wait, |
| 6583 | !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && | ||
| 6584 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); | 6582 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); |
| 6585 | } | 6583 | } |
| 6586 | 6584 | ||
| @@ -6616,6 +6614,7 @@ int md_allow_write(mddev_t *mddev) | |||
| 6616 | if (mddev->in_sync) { | 6614 | if (mddev->in_sync) { |
| 6617 | mddev->in_sync = 0; | 6615 | mddev->in_sync = 0; |
| 6618 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | 6616 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 6617 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 6619 | if (mddev->safemode_delay && | 6618 | if (mddev->safemode_delay && |
| 6620 | mddev->safemode == 0) | 6619 | mddev->safemode == 0) |
| 6621 | mddev->safemode = 1; | 6620 | mddev->safemode = 1; |
| @@ -6625,7 +6624,7 @@ int md_allow_write(mddev_t *mddev) | |||
| 6625 | } else | 6624 | } else |
| 6626 | spin_unlock_irq(&mddev->write_lock); | 6625 | spin_unlock_irq(&mddev->write_lock); |
| 6627 | 6626 | ||
| 6628 | if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) | 6627 | if (test_bit(MD_CHANGE_PENDING, &mddev->flags)) |
| 6629 | return -EAGAIN; | 6628 | return -EAGAIN; |
| 6630 | else | 6629 | else |
| 6631 | return 0; | 6630 | return 0; |
| @@ -6823,8 +6822,7 @@ void md_do_sync(mddev_t *mddev) | |||
| 6823 | atomic_read(&mddev->recovery_active) == 0); | 6822 | atomic_read(&mddev->recovery_active) == 0); |
| 6824 | mddev->curr_resync_completed = | 6823 | mddev->curr_resync_completed = |
| 6825 | mddev->curr_resync; | 6824 | mddev->curr_resync; |
| 6826 | if (mddev->persistent) | 6825 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 6827 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 6828 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); | 6826 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); |
| 6829 | } | 6827 | } |
| 6830 | 6828 | ||
| @@ -7073,7 +7071,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7073 | if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) | 7071 | if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) |
| 7074 | return; | 7072 | return; |
| 7075 | if ( ! ( | 7073 | if ( ! ( |
| 7076 | (mddev->flags && !mddev->external) || | 7074 | (mddev->flags & ~ (1<<MD_CHANGE_PENDING)) || |
| 7077 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || | 7075 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || |
| 7078 | test_bit(MD_RECOVERY_DONE, &mddev->recovery) || | 7076 | test_bit(MD_RECOVERY_DONE, &mddev->recovery) || |
| 7079 | (mddev->external == 0 && mddev->safemode == 1) || | 7077 | (mddev->external == 0 && mddev->safemode == 1) || |
| @@ -7103,8 +7101,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7103 | mddev->recovery_cp == MaxSector) { | 7101 | mddev->recovery_cp == MaxSector) { |
| 7104 | mddev->in_sync = 1; | 7102 | mddev->in_sync = 1; |
| 7105 | did_change = 1; | 7103 | did_change = 1; |
| 7106 | if (mddev->persistent) | 7104 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); |
| 7107 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 7108 | } | 7105 | } |
| 7109 | if (mddev->safemode == 1) | 7106 | if (mddev->safemode == 1) |
| 7110 | mddev->safemode = 0; | 7107 | mddev->safemode = 0; |
