--- x/drivers/nvme/target/fc.c +++ y/drivers/nvme/target/fc.c @@ -1620,6 +1620,7 @@ nvmet_fc_free_pending_reqs(struct nvmet_ } } +static DEFINE_MUTEX(tgtp_mutex); /** * nvmet_fc_unregister_targetport - transport entry point called by an * LLDD to deregister/remove a previously @@ -1637,6 +1638,7 @@ nvmet_fc_unregister_targetport(struct nv struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port); unsigned long flags; + mutex_lock(&tgtp_mutex); spin_lock_irqsave(&nvmet_fc_tgtlock, flags); list_del(&tgtport->tgt_list); spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); @@ -1645,6 +1647,7 @@ nvmet_fc_unregister_targetport(struct nv /* terminate any outstanding associations */ __nvmet_fc_free_assocs(tgtport); + mutex_unlock(&tgtp_mutex); flush_workqueue(nvmet_wq); @@ -2919,6 +2922,7 @@ nvmet_fc_remove_port(struct nvmet_port * struct nvmet_fc_tgtport *tgtport = NULL; unsigned long flags; + mutex_lock(&tgtp_mutex); spin_lock_irqsave(&nvmet_fc_tgtlock, flags); if (pe->tgtport && nvmet_fc_tgtport_get(pe->tgtport)) tgtport = pe->tgtport; @@ -2933,6 +2937,7 @@ nvmet_fc_remove_port(struct nvmet_port * } kfree(pe); + mutex_unlock(&tgtp_mutex); } static void