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.c71
1 files changed, 30 insertions, 41 deletions
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;
2173repeat: 2162repeat:
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;