aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index c148b630215..f20d13e717d 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;