|
@@ -489,6 +489,45 @@ nvme_fc_signal_discovery_scan(struct nvme_fc_lport *lport,
|
|
|
kobject_uevent_env(&fc_udev_device->kobj, KOBJ_CHANGE, envp);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+nvme_fc_free_rport(struct kref *ref)
|
|
|
+{
|
|
|
+ struct nvme_fc_rport *rport =
|
|
|
+ container_of(ref, struct nvme_fc_rport, ref);
|
|
|
+ struct nvme_fc_lport *lport =
|
|
|
+ localport_to_lport(rport->remoteport.localport);
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ WARN_ON(rport->remoteport.port_state != FC_OBJSTATE_DELETED);
|
|
|
+ WARN_ON(!list_empty(&rport->ctrl_list));
|
|
|
+
|
|
|
+ /* remove from lport list */
|
|
|
+ spin_lock_irqsave(&nvme_fc_lock, flags);
|
|
|
+ list_del(&rport->endp_list);
|
|
|
+ spin_unlock_irqrestore(&nvme_fc_lock, flags);
|
|
|
+
|
|
|
+ /* let the LLDD know we've finished tearing it down */
|
|
|
+ lport->ops->remoteport_delete(&rport->remoteport);
|
|
|
+
|
|
|
+ ida_simple_remove(&lport->endp_cnt, rport->remoteport.port_num);
|
|
|
+
|
|
|
+ kfree(rport);
|
|
|
+
|
|
|
+ nvme_fc_lport_put(lport);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+nvme_fc_rport_put(struct nvme_fc_rport *rport)
|
|
|
+{
|
|
|
+ kref_put(&rport->ref, nvme_fc_free_rport);
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+nvme_fc_rport_get(struct nvme_fc_rport *rport)
|
|
|
+{
|
|
|
+ return kref_get_unless_zero(&rport->ref);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* nvme_fc_register_remoteport - transport entry point called by an
|
|
|
* LLDD to register the existence of a NVME
|
|
@@ -568,45 +607,6 @@ out_reghost_failed:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nvme_fc_register_remoteport);
|
|
|
|
|
|
-static void
|
|
|
-nvme_fc_free_rport(struct kref *ref)
|
|
|
-{
|
|
|
- struct nvme_fc_rport *rport =
|
|
|
- container_of(ref, struct nvme_fc_rport, ref);
|
|
|
- struct nvme_fc_lport *lport =
|
|
|
- localport_to_lport(rport->remoteport.localport);
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- WARN_ON(rport->remoteport.port_state != FC_OBJSTATE_DELETED);
|
|
|
- WARN_ON(!list_empty(&rport->ctrl_list));
|
|
|
-
|
|
|
- /* remove from lport list */
|
|
|
- spin_lock_irqsave(&nvme_fc_lock, flags);
|
|
|
- list_del(&rport->endp_list);
|
|
|
- spin_unlock_irqrestore(&nvme_fc_lock, flags);
|
|
|
-
|
|
|
- /* let the LLDD know we've finished tearing it down */
|
|
|
- lport->ops->remoteport_delete(&rport->remoteport);
|
|
|
-
|
|
|
- ida_simple_remove(&lport->endp_cnt, rport->remoteport.port_num);
|
|
|
-
|
|
|
- kfree(rport);
|
|
|
-
|
|
|
- nvme_fc_lport_put(lport);
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-nvme_fc_rport_put(struct nvme_fc_rport *rport)
|
|
|
-{
|
|
|
- kref_put(&rport->ref, nvme_fc_free_rport);
|
|
|
-}
|
|
|
-
|
|
|
-static int
|
|
|
-nvme_fc_rport_get(struct nvme_fc_rport *rport)
|
|
|
-{
|
|
|
- return kref_get_unless_zero(&rport->ref);
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
nvme_fc_abort_lsops(struct nvme_fc_rport *rport)
|
|
|
{
|