aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bitmap.c3
-rw-r--r--drivers/md/md.c24
-rw-r--r--drivers/md/md.h2
3 files changed, 11 insertions, 18 deletions
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 a1f6b59b8b37..43cf9cc9c1df 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2168,8 +2168,7 @@ repeat:
2168 2168
2169 } 2169 }
2170 if (!mddev->persistent) { 2170 if (!mddev->persistent) {
2171 if (!mddev->external) 2171 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
2172 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
2173 clear_bit(MD_CHANGE_DEVS, &mddev->flags); 2172 clear_bit(MD_CHANGE_DEVS, &mddev->flags);
2174 wake_up(&mddev->sb_wait); 2173 wake_up(&mddev->sb_wait);
2175 return; 2174 return;
@@ -2179,7 +2178,6 @@ repeat:
2179 2178
2180 mddev->utime = get_seconds(); 2179 mddev->utime = get_seconds();
2181 2180
2182 set_bit(MD_CHANGE_PENDING, &mddev->flags);
2183 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) 2181 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
2184 force_change = 1; 2182 force_change = 1;
2185 if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) 2183 if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags))
@@ -3372,7 +3370,7 @@ array_state_show(mddev_t *mddev, char *page)
3372 case 0: 3370 case 0:
3373 if (mddev->in_sync) 3371 if (mddev->in_sync)
3374 st = clean; 3372 st = clean;
3375 else if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) 3373 else if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
3376 st = write_pending; 3374 st = write_pending;
3377 else if (mddev->safemode) 3375 else if (mddev->safemode)
3378 st = active_idle; 3376 st = active_idle;
@@ -3453,9 +3451,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3453 mddev->in_sync = 1; 3451 mddev->in_sync = 1;
3454 if (mddev->safemode == 1) 3452 if (mddev->safemode == 1)
3455 mddev->safemode = 0; 3453 mddev->safemode = 0;
3456 if (mddev->persistent) 3454 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
3457 set_bit(MD_CHANGE_CLEAN,
3458 &mddev->flags);
3459 } 3455 }
3460 err = 0; 3456 err = 0;
3461 } else 3457 } else
@@ -3467,8 +3463,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3467 case active: 3463 case active:
3468 if (mddev->pers) { 3464 if (mddev->pers) {
3469 restart_array(mddev); 3465 restart_array(mddev);
3470 if (mddev->external) 3466 clear_bit(MD_CHANGE_PENDING, &mddev->flags);
3471 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
3472 wake_up(&mddev->sb_wait); 3467 wake_up(&mddev->sb_wait);
3473 err = 0; 3468 err = 0;
3474 } else { 3469 } else {
@@ -6573,6 +6568,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
6573 if (mddev->in_sync) { 6568 if (mddev->in_sync) {
6574 mddev->in_sync = 0; 6569 mddev->in_sync = 0;
6575 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6570 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6571 set_bit(MD_CHANGE_PENDING, &mddev->flags);
6576 md_wakeup_thread(mddev->thread); 6572 md_wakeup_thread(mddev->thread);
6577 did_change = 1; 6573 did_change = 1;
6578 } 6574 }
@@ -6581,7 +6577,6 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
6581 if (did_change) 6577 if (did_change)
6582 sysfs_notify_dirent_safe(mddev->sysfs_state); 6578 sysfs_notify_dirent_safe(mddev->sysfs_state);
6583 wait_event(mddev->sb_wait, 6579 wait_event(mddev->sb_wait,
6584 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
6585 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); 6580 !test_bit(MD_CHANGE_PENDING, &mddev->flags));
6586} 6581}
6587 6582
@@ -6617,6 +6612,7 @@ int md_allow_write(mddev_t *mddev)
6617 if (mddev->in_sync) { 6612 if (mddev->in_sync) {
6618 mddev->in_sync = 0; 6613 mddev->in_sync = 0;
6619 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6614 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6615 set_bit(MD_CHANGE_PENDING, &mddev->flags);
6620 if (mddev->safemode_delay && 6616 if (mddev->safemode_delay &&
6621 mddev->safemode == 0) 6617 mddev->safemode == 0)
6622 mddev->safemode = 1; 6618 mddev->safemode = 1;
@@ -6626,7 +6622,7 @@ int md_allow_write(mddev_t *mddev)
6626 } else 6622 } else
6627 spin_unlock_irq(&mddev->write_lock); 6623 spin_unlock_irq(&mddev->write_lock);
6628 6624
6629 if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) 6625 if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
6630 return -EAGAIN; 6626 return -EAGAIN;
6631 else 6627 else
6632 return 0; 6628 return 0;
@@ -6824,8 +6820,7 @@ void md_do_sync(mddev_t *mddev)
6824 atomic_read(&mddev->recovery_active) == 0); 6820 atomic_read(&mddev->recovery_active) == 0);
6825 mddev->curr_resync_completed = 6821 mddev->curr_resync_completed =
6826 mddev->curr_resync; 6822 mddev->curr_resync;
6827 if (mddev->persistent) 6823 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6828 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6829 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); 6824 sysfs_notify(&mddev->kobj, NULL, "sync_completed");
6830 } 6825 }
6831 6826
@@ -7104,8 +7099,7 @@ void md_check_recovery(mddev_t *mddev)
7104 mddev->recovery_cp == MaxSector) { 7099 mddev->recovery_cp == MaxSector) {
7105 mddev->in_sync = 1; 7100 mddev->in_sync = 1;
7106 did_change = 1; 7101 did_change = 1;
7107 if (mddev->persistent) 7102 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
7108 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
7109 } 7103 }
7110 if (mddev->safemode == 1) 7104 if (mddev->safemode == 1)
7111 mddev->safemode = 0; 7105 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;