aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorJens Axboe <jaxboe@fusionio.com>2010-10-19 03:13:04 -0400
committerJens Axboe <jaxboe@fusionio.com>2010-10-19 03:13:04 -0400
commitfa251f89903d73989e2f63e13d0eaed1e07ce0da (patch)
tree3f7fe779941e3b6d67754dd7c44a32f48ea47c74 /drivers/md/md.c
parentdd3932eddf428571762596e17b65f5dc92ca361b (diff)
parentcd07202cc8262e1669edff0d97715f3dd9260917 (diff)
Merge branch 'v2.6.36-rc8' into for-2.6.37/barrier
Conflicts: block/blk-core.c drivers/block/loop.c mm/swapfile.c Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
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 3640f025cb7..ed075d19db3 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1578,7 +1578,9 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
1578 bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1; 1578 bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1;
1579 if (rdev->sb_size & bmask) 1579 if (rdev->sb_size & bmask)
1580 rdev->sb_size = (rdev->sb_size | bmask) + 1; 1580 rdev->sb_size = (rdev->sb_size | bmask) + 1;
1581 } 1581 } else
1582 max_dev = le32_to_cpu(sb->max_dev);
1583
1582 for (i=0; i<max_dev;i++) 1584 for (i=0; i<max_dev;i++)
1583 sb->dev_roles[i] = cpu_to_le16(0xfffe); 1585 sb->dev_roles[i] = cpu_to_le16(0xfffe);
1584 1586
@@ -2102,9 +2104,9 @@ repeat:
2102 rdev->recovery_offset = mddev->curr_resync_completed; 2104 rdev->recovery_offset = mddev->curr_resync_completed;
2103 2105
2104 } 2106 }
2105 if (mddev->external || !mddev->persistent) { 2107 if (!mddev->persistent) {
2106 clear_bit(MD_CHANGE_DEVS, &mddev->flags);
2107 clear_bit(MD_CHANGE_CLEAN, &mddev->flags); 2108 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
2109 clear_bit(MD_CHANGE_DEVS, &mddev->flags);
2108 wake_up(&mddev->sb_wait); 2110 wake_up(&mddev->sb_wait);
2109 return; 2111 return;
2110 } 2112 }
@@ -2113,7 +2115,6 @@ repeat:
2113 2115
2114 mddev->utime = get_seconds(); 2116 mddev->utime = get_seconds();
2115 2117
2116 set_bit(MD_CHANGE_PENDING, &mddev->flags);
2117 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) 2118 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
2118 force_change = 1; 2119 force_change = 1;
2119 if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags)) 2120 if (test_and_clear_bit(MD_CHANGE_CLEAN, &mddev->flags))
@@ -3306,7 +3307,7 @@ array_state_show(mddev_t *mddev, char *page)
3306 case 0: 3307 case 0:
3307 if (mddev->in_sync) 3308 if (mddev->in_sync)
3308 st = clean; 3309 st = clean;
3309 else if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) 3310 else if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
3310 st = write_pending; 3311 st = write_pending;
3311 else if (mddev->safemode) 3312 else if (mddev->safemode)
3312 st = active_idle; 3313 st = active_idle;
@@ -3387,9 +3388,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3387 mddev->in_sync = 1; 3388 mddev->in_sync = 1;
3388 if (mddev->safemode == 1) 3389 if (mddev->safemode == 1)
3389 mddev->safemode = 0; 3390 mddev->safemode = 0;
3390 if (mddev->persistent) 3391 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
3391 set_bit(MD_CHANGE_CLEAN,
3392 &mddev->flags);
3393 } 3392 }
3394 err = 0; 3393 err = 0;
3395 } else 3394 } else
@@ -3401,8 +3400,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
3401 case active: 3400 case active:
3402 if (mddev->pers) { 3401 if (mddev->pers) {
3403 restart_array(mddev); 3402 restart_array(mddev);
3404 if (mddev->external) 3403 clear_bit(MD_CHANGE_PENDING, &mddev->flags);
3405 clear_bit(MD_CHANGE_CLEAN, &mddev->flags);
3406 wake_up(&mddev->sb_wait); 3404 wake_up(&mddev->sb_wait);
3407 err = 0; 3405 err = 0;
3408 } else { 3406 } else {
@@ -6505,6 +6503,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
6505 if (mddev->in_sync) { 6503 if (mddev->in_sync) {
6506 mddev->in_sync = 0; 6504 mddev->in_sync = 0;
6507 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6505 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6506 set_bit(MD_CHANGE_PENDING, &mddev->flags);
6508 md_wakeup_thread(mddev->thread); 6507 md_wakeup_thread(mddev->thread);
6509 did_change = 1; 6508 did_change = 1;
6510 } 6509 }
@@ -6513,7 +6512,6 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
6513 if (did_change) 6512 if (did_change)
6514 sysfs_notify_dirent_safe(mddev->sysfs_state); 6513 sysfs_notify_dirent_safe(mddev->sysfs_state);
6515 wait_event(mddev->sb_wait, 6514 wait_event(mddev->sb_wait,
6516 !test_bit(MD_CHANGE_CLEAN, &mddev->flags) &&
6517 !test_bit(MD_CHANGE_PENDING, &mddev->flags)); 6515 !test_bit(MD_CHANGE_PENDING, &mddev->flags));
6518} 6516}
6519 6517
@@ -6549,6 +6547,7 @@ int md_allow_write(mddev_t *mddev)
6549 if (mddev->in_sync) { 6547 if (mddev->in_sync) {
6550 mddev->in_sync = 0; 6548 mddev->in_sync = 0;
6551 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 6549 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6550 set_bit(MD_CHANGE_PENDING, &mddev->flags);
6552 if (mddev->safemode_delay && 6551 if (mddev->safemode_delay &&
6553 mddev->safemode == 0) 6552 mddev->safemode == 0)
6554 mddev->safemode = 1; 6553 mddev->safemode = 1;
@@ -6558,7 +6557,7 @@ int md_allow_write(mddev_t *mddev)
6558 } else 6557 } else
6559 spin_unlock_irq(&mddev->write_lock); 6558 spin_unlock_irq(&mddev->write_lock);
6560 6559
6561 if (test_bit(MD_CHANGE_CLEAN, &mddev->flags)) 6560 if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
6562 return -EAGAIN; 6561 return -EAGAIN;
6563 else 6562 else
6564 return 0; 6563 return 0;
@@ -6756,8 +6755,7 @@ void md_do_sync(mddev_t *mddev)
6756 atomic_read(&mddev->recovery_active) == 0); 6755 atomic_read(&mddev->recovery_active) == 0);
6757 mddev->curr_resync_completed = 6756 mddev->curr_resync_completed =
6758 mddev->curr_resync; 6757 mddev->curr_resync;
6759 if (mddev->persistent) 6758 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6760 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
6761 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); 6759 sysfs_notify(&mddev->kobj, NULL, "sync_completed");
6762 } 6760 }
6763 6761
@@ -7006,7 +7004,7 @@ void md_check_recovery(mddev_t *mddev)
7006 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) 7004 if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
7007 return; 7005 return;
7008 if ( ! ( 7006 if ( ! (
7009 (mddev->flags && !mddev->external) || 7007 (mddev->flags & ~ (1<<MD_CHANGE_PENDING)) ||
7010 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || 7008 test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
7011 test_bit(MD_RECOVERY_DONE, &mddev->recovery) || 7009 test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
7012 (mddev->external == 0 && mddev->safemode == 1) || 7010 (mddev->external == 0 && mddev->safemode == 1) ||
@@ -7036,8 +7034,7 @@ void md_check_recovery(mddev_t *mddev)
7036 mddev->recovery_cp == MaxSector) { 7034 mddev->recovery_cp == MaxSector) {
7037 mddev->in_sync = 1; 7035 mddev->in_sync = 1;
7038 did_change = 1; 7036 did_change = 1;
7039 if (mddev->persistent) 7037 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
7040 set_bit(MD_CHANGE_CLEAN, &mddev->flags);
7041 } 7038 }
7042 if (mddev->safemode == 1) 7039 if (mddev->safemode == 1)
7043 mddev->safemode = 0; 7040 mddev->safemode = 0;