diff --git a/drivers/md/md.c b/drivers/md/md.c index 22c9efd86b0d..f389d8abe137 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2599,8 +2599,10 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len) if (err == 0) { md_kick_rdev_from_array(rdev); - if (mddev->pers) - md_update_sb(mddev, 1); + if (mddev->pers) { + set_bit(MD_CHANGE_DEVS, &mddev->flags); + md_wakeup_thread(mddev->thread); + } md_new_event(mddev); } } @@ -6175,7 +6177,11 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) md_cluster_ops->remove_disk(mddev, rdev); md_kick_rdev_from_array(rdev); - md_update_sb(mddev, 1); + set_bit(MD_CHANGE_DEVS, &mddev->flags); + if (mddev->thread) + md_wakeup_thread(mddev->thread); + else + md_update_sb(mddev, 1); md_new_event(mddev); return 0; @@ -6240,7 +6246,9 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev) rdev->raid_disk = -1; - md_update_sb(mddev, 1); + set_bit(MD_CHANGE_DEVS, &mddev->flags); + if (!mddev->thread) + md_update_sb(mddev, 1); /* * Kick recovery, maybe this spare has to be added to the * array immediately.