From: NeilBrown We weren't actually waking up the md thread after setting MD_RECOVERY_NEEDED when assembling an array, so it is possible to lose a race and not actually start resync. So add a call to md_wakeup_thread, and while we are at it, remove all the "if (mddev->thread)" guards as md_wake_thread does its own checking. Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- drivers/md/md.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff -puN drivers/md/md.c~md-make-sure-resync-gets-started-when-array-starts drivers/md/md.c --- 25/drivers/md/md.c~md-make-sure-resync-gets-started-when-array-starts Mon Aug 22 13:06:44 2005 +++ 25-akpm/drivers/md/md.c Mon Aug 22 13:06:44 2005 @@ -256,8 +256,7 @@ static inline void mddev_unlock(mddev_t { up(&mddev->reconfig_sem); - if (mddev->thread) - md_wakeup_thread(mddev->thread); + md_wakeup_thread(mddev->thread); } mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr) @@ -1714,6 +1713,7 @@ static int do_md_run(mddev_t * mddev) mddev->in_sync = 1; set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + md_wakeup_thread(mddev->thread); if (mddev->sb_dirty) md_update_sb(mddev); @@ -2236,8 +2236,7 @@ static int add_new_disk(mddev_t * mddev, export_rdev(rdev); set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); - if (mddev->thread) - md_wakeup_thread(mddev->thread); + md_wakeup_thread(mddev->thread); return err; } _