From: Yu Kuai <yukuai3@xxxxxxxxxx> Prepare to use a disk level spinlock to protect md_thread, there are no functional changes. Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> --- drivers/md/dm-raid.c | 2 +- drivers/md/md-cluster.c | 8 ++++---- drivers/md/md.c | 13 +++++++------ drivers/md/md.h | 3 ++- drivers/md/raid1.c | 4 ++-- drivers/md/raid10.c | 2 +- drivers/md/raid5-cache.c | 2 +- drivers/md/raid5.c | 2 +- 8 files changed, 19 insertions(+), 17 deletions(-) diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 257c9c9f2b4d..1393c80b083b 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -3729,7 +3729,7 @@ static int raid_message(struct dm_target *ti, unsigned int argc, char **argv, if (!strcasecmp(argv[0], "idle") || !strcasecmp(argv[0], "frozen")) { if (mddev->sync_thread) { set_bit(MD_RECOVERY_INTR, &mddev->recovery); - md_unregister_thread(&mddev->sync_thread); + md_unregister_thread(&mddev->sync_thread, mddev); md_reap_sync_thread(mddev); } } else if (decipher_sync_action(mddev, mddev->recovery) != st_idle) diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index 85fbcf5bae27..064211fe9830 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c @@ -946,8 +946,8 @@ static int join(struct mddev *mddev, int nodes) return 0; err: set_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state); - md_unregister_thread(&cinfo->recovery_thread); - md_unregister_thread(&cinfo->recv_thread); + md_unregister_thread(&cinfo->recovery_thread, mddev); + md_unregister_thread(&cinfo->recv_thread, mddev); lockres_free(cinfo->message_lockres); lockres_free(cinfo->token_lockres); lockres_free(cinfo->ack_lockres); @@ -1009,8 +1009,8 @@ static int leave(struct mddev *mddev) resync_bitmap(mddev); set_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state); - md_unregister_thread(&cinfo->recovery_thread); - md_unregister_thread(&cinfo->recv_thread); + md_unregister_thread(&cinfo->recovery_thread, mddev); + md_unregister_thread(&cinfo->recv_thread, mddev); lockres_free(cinfo->message_lockres); lockres_free(cinfo->token_lockres); lockres_free(cinfo->ack_lockres); diff --git a/drivers/md/md.c b/drivers/md/md.c index 4ecfd0508afb..ab9299187cfe 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -4775,7 +4775,8 @@ action_store(struct mddev *mddev, const char *page, size_t len) mddev_unlock(mddev); set_bit(MD_RECOVERY_INTR, &mddev->recovery); - md_unregister_thread(&mddev->sync_thread); + md_unregister_thread(&mddev->sync_thread, + mddev); mddev_lock_nointr(mddev); /* * set RECOVERY_INTR again and restore reshape @@ -6175,7 +6176,7 @@ static void __md_stop_writes(struct mddev *mddev) flush_workqueue(md_misc_wq); if (mddev->sync_thread) { set_bit(MD_RECOVERY_INTR, &mddev->recovery); - md_unregister_thread(&mddev->sync_thread); + md_unregister_thread(&mddev->sync_thread, mddev); md_reap_sync_thread(mddev); } @@ -6215,7 +6216,7 @@ static void mddev_detach(struct mddev *mddev) mddev->pers->quiesce(mddev, 1); mddev->pers->quiesce(mddev, 0); } - md_unregister_thread(&mddev->thread); + md_unregister_thread(&mddev->thread, mddev); if (mddev->queue) blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ } @@ -7933,7 +7934,7 @@ int md_register_thread(struct md_thread **threadp, } EXPORT_SYMBOL(md_register_thread); -void md_unregister_thread(struct md_thread **threadp) +void md_unregister_thread(struct md_thread **threadp, struct mddev *mddev) { struct md_thread *thread; @@ -9324,7 +9325,7 @@ void md_check_recovery(struct mddev *mddev) * ->spare_active and clear saved_raid_disk */ set_bit(MD_RECOVERY_INTR, &mddev->recovery); - md_unregister_thread(&mddev->sync_thread); + md_unregister_thread(&mddev->sync_thread, mddev); md_reap_sync_thread(mddev); clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); @@ -9360,7 +9361,7 @@ void md_check_recovery(struct mddev *mddev) goto unlock; } if (mddev->sync_thread) { - md_unregister_thread(&mddev->sync_thread); + md_unregister_thread(&mddev->sync_thread, mddev); md_reap_sync_thread(mddev); goto unlock; } diff --git a/drivers/md/md.h b/drivers/md/md.h index aeb2fc6b65c7..8f4137ad2dde 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -733,7 +733,8 @@ extern void md_cluster_stop(struct mddev *mddev); int md_register_thread(struct md_thread **threadp, void (*run)(struct md_thread *thread), struct mddev *mddev, const char *name); -extern void md_unregister_thread(struct md_thread **threadp); +extern void md_unregister_thread(struct md_thread **threadp, + struct mddev *mddev); extern void md_wakeup_thread(struct md_thread **threadp, struct mddev *mddev); extern void md_check_recovery(struct mddev *mddev); extern void md_reap_sync_thread(struct mddev *mddev); diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 391ff239c711..8329a1ba9d12 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -3158,7 +3158,7 @@ static int raid1_run(struct mddev *mddev) * RAID1 needs at least one disk in active */ if (conf->raid_disks - mddev->degraded < 1) { - md_unregister_thread(&conf->thread); + md_unregister_thread(&conf->thread, mddev); ret = -EINVAL; goto abort; } @@ -3185,7 +3185,7 @@ static int raid1_run(struct mddev *mddev) ret = md_integrity_register(mddev); if (ret) { - md_unregister_thread(&mddev->thread); + md_unregister_thread(&mddev->thread, mddev); goto abort; } return 0; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 920e5722040f..47d18d56000e 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -4293,7 +4293,7 @@ static int raid10_run(struct mddev *mddev) return 0; out_free_conf: - md_unregister_thread(&mddev->thread); + md_unregister_thread(&mddev->thread, mddev); raid10_free_conf(conf); mddev->private = NULL; out: diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index d6ee6a7a83b7..588c3d1f7467 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -3166,7 +3166,7 @@ void r5l_exit_log(struct r5conf *conf) /* Ensure disable_writeback_work wakes up and exits */ wake_up(&conf->mddev->sb_wait); flush_work(&log->disable_writeback_work); - md_unregister_thread(&log->reclaim_thread); + md_unregister_thread(&log->reclaim_thread, conf->mddev); conf->log = NULL; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 2c0695d41436..b9f2688b141f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -8070,7 +8070,7 @@ static int raid5_run(struct mddev *mddev) return 0; abort: - md_unregister_thread(&mddev->thread); + md_unregister_thread(&mddev->thread, mddev); print_raid5_conf(conf); free_conf(conf); mddev->private = NULL; -- 2.31.1