--- x/drivers/nvme/target/fc.c +++ y/drivers/nvme/target/fc.c @@ -1271,9 +1271,17 @@ nvmet_fc_portentry_bind(struct nvmet_fc_ static void nvmet_fc_portentry_unbind(struct nvmet_fc_port_entry *pe) { + struct nvmet_fc_port_entry *entry; unsigned long flags; spin_lock_irqsave(&nvmet_fc_tgtlock, flags); + list_for_each_entry(entry, &nvmet_fc_portentry_list, pe_list) { + if (entry == pe) + goto out; + } + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); + return; +out: if (pe->tgtport) { nvmet_fc_tgtport_put(pe->tgtport); pe->tgtport->pe = NULL; @@ -1643,8 +1651,10 @@ nvmet_fc_unregister_targetport(struct nv nvmet_fc_portentry_unbind_tgt(tgtport); + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); /* terminate any outstanding associations */ __nvmet_fc_free_assocs(tgtport); + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); flush_workqueue(nvmet_wq); @@ -2927,8 +2937,10 @@ nvmet_fc_remove_port(struct nvmet_port * nvmet_fc_portentry_unbind(pe); if (tgtport) { + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); /* terminate any outstanding associations */ __nvmet_fc_free_assocs(tgtport); + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); nvmet_fc_tgtport_put(tgtport); }