* fc_rport_destroy() - Free a remote port after last reference is released
  * @kref: The remote port's kref
  */
-static void fc_rport_destroy(struct kref *kref)
+void fc_rport_destroy(struct kref *kref)
 {
        struct fc_rport_priv *rdata;
 
        rdata = container_of(kref, struct fc_rport_priv, kref);
        kfree_rcu(rdata, rcu);
 }
+EXPORT_SYMBOL(fc_rport_destroy);
 
 /**
  * fc_rport_state() - Return a string identifying the remote port's state
                if (!rport) {
                        FC_RPORT_DBG(rdata, "Failed to add the rport\n");
                        lport->tt.rport_logoff(rdata);
-                       kref_put(&rdata->kref, lport->tt.rport_destroy);
+                       kref_put(&rdata->kref, fc_rport_destroy);
                        return;
                }
                mutex_lock(&rdata->rp_mutex);
                        FC_RPORT_DBG(rdata, "lld callback ev %d\n", event);
                        rdata->lld_event_callback(lport, rdata, event);
                }
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
                break;
 
        case RPORT_EV_FAILED:
                        rdata->lld_event_callback(lport, rdata, event);
                }
                if (cancel_delayed_work_sync(&rdata->retry_work))
-                       kref_put(&rdata->kref, lport->tt.rport_destroy);
+                       kref_put(&rdata->kref, fc_rport_destroy);
 
                /*
                 * Reset any outstanding exchanges before freeing rport.
                        if (port_id == FC_FID_DIR_SERV) {
                                rdata->event = RPORT_EV_NONE;
                                mutex_unlock(&rdata->rp_mutex);
-                               kref_put(&rdata->kref, lport->tt.rport_destroy);
+                               kref_put(&rdata->kref, fc_rport_destroy);
                        } else if ((rdata->flags & FC_RP_STARTED) &&
                                   rdata->major_retries <
                                   lport->max_rport_retry_count) {
                                list_del_rcu(&rdata->peers);
                                mutex_unlock(&lport->disc.disc_mutex);
                                mutex_unlock(&rdata->rp_mutex);
-                               kref_put(&rdata->kref, lport->tt.rport_destroy);
+                               kref_put(&rdata->kref, fc_rport_destroy);
                        }
                } else {
                        /*
                mutex_unlock(&rdata->rp_mutex);
                break;
        }
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
 static void fc_rport_enter_delete(struct fc_rport_priv *rdata,
                                  enum fc_rport_event event)
 {
-       struct fc_lport *lport = rdata->local_port;
-
        if (rdata->rp_state == RPORT_ST_DELETE)
                return;
 
        kref_get(&rdata->kref);
        if (rdata->event == RPORT_EV_NONE &&
            !queue_work(rport_event_queue, &rdata->event_work))
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
 
        rdata->event = event;
 }
  */
 static void fc_rport_enter_ready(struct fc_rport_priv *rdata)
 {
-       struct fc_lport *lport = rdata->local_port;
-
        fc_rport_state_enter(rdata, RPORT_ST_READY);
 
        FC_RPORT_DBG(rdata, "Port is Ready\n");
        kref_get(&rdata->kref);
        if (rdata->event == RPORT_EV_NONE &&
            !queue_work(rport_event_queue, &rdata->event_work))
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
 
        rdata->event = RPORT_EV_READY;
 }
 {
        struct fc_rport_priv *rdata =
                container_of(work, struct fc_rport_priv, retry_work.work);
-       struct fc_lport *lport = rdata->local_port;
 
        mutex_lock(&rdata->rp_mutex);
        FC_RPORT_DBG(rdata, "Port timeout, state %s\n", fc_rport_state(rdata));
        }
 
        mutex_unlock(&rdata->rp_mutex);
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
 static void fc_rport_error_retry(struct fc_rport_priv *rdata, int err)
 {
        unsigned long delay = msecs_to_jiffies(rdata->e_d_tov);
-       struct fc_lport *lport = rdata->local_port;
 
        /* make sure this isn't an FC_EX_CLOSED error, never retry those */
        if (err == -FC_EX_CLOSED)
                        delay = 0;
                kref_get(&rdata->kref);
                if (!schedule_delayed_work(&rdata->retry_work, delay))
-                       kref_put(&rdata->kref, lport->tt.rport_destroy);
+                       kref_put(&rdata->kref, fc_rport_destroy);
                return;
        }
 
 err:
        mutex_unlock(&rdata->rp_mutex);
 put:
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
        return;
 bad:
        FC_RPORT_DBG(rdata, "Bad FLOGI response\n");
                                  fc_rport_flogi_resp, rdata,
                                  2 * lport->r_a_tov)) {
                fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR);
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
        }
 }
 
        }
 out:
        mutex_unlock(&rdata->rp_mutex);
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
        fc_frame_free(rx_fp);
        return;
 
 reject_put:
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 reject:
        fc_seq_els_rsp_send(rx_fp, ELS_LS_RJT, &rjt_data);
        fc_frame_free(rx_fp);
 err:
        mutex_unlock(&rdata->rp_mutex);
 put:
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 static bool
                                  fc_rport_plogi_resp, rdata,
                                  2 * lport->r_a_tov)) {
                fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR);
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
        }
 }
 
 err:
        mutex_unlock(&rdata->rp_mutex);
 put:
-       kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
        if (!fc_exch_seq_send(lport, fp, fc_rport_prli_resp,
                              NULL, rdata, 2 * lport->r_a_tov)) {
                fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR);
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
        }
 }
 
 err:
        mutex_unlock(&rdata->rp_mutex);
 put:
-       kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
                                  fc_rport_rtv_resp, rdata,
                                  2 * lport->r_a_tov)) {
                fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR);
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
        }
 }
 
                        "Received a LOGO %s\n", fc_els_resp_type(fp));
        if (!IS_ERR(fp))
                fc_frame_free(fp);
-       kref_put(&rdata->kref, lport->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
        kref_get(&rdata->kref);
        if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_LOGO,
                                  fc_rport_logo_resp, rdata, 0))
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
 err:
        mutex_unlock(&rdata->rp_mutex);
 put:
-       kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
 }
 
 /**
                                  fc_rport_adisc_resp, rdata,
                                  2 * lport->r_a_tov)) {
                fc_rport_error_retry(rdata, -FC_EX_XMIT_ERR);
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
        }
 }
 
                                     "while in state %s\n",
                                     fc_rport_state(rdata));
                        mutex_unlock(&rdata->rp_mutex);
-                       kref_put(&rdata->kref, lport->tt.rport_destroy);
+                       kref_put(&rdata->kref, fc_rport_destroy);
                        goto busy;
                }
        default:
                             "Reject ELS 0x%02x while in state %s\n",
                             fc_frame_payload_op(fp), fc_rport_state(rdata));
                mutex_unlock(&rdata->rp_mutex);
-               kref_put(&rdata->kref, lport->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
                goto reject;
        }
 
        }
 
        mutex_unlock(&rdata->rp_mutex);
-       kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
+       kref_put(&rdata->kref, fc_rport_destroy);
        return;
 
 reject:
 
                fc_rport_enter_delete(rdata, RPORT_EV_STOP);
                mutex_unlock(&rdata->rp_mutex);
-               kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy);
+               kref_put(&rdata->kref, fc_rport_destroy);
        } else
                FC_RPORT_ID_DBG(lport, sid,
                                "Received LOGO from non-logged-in port\n");
        if (!lport->tt.rport_flush_queue)
                lport->tt.rport_flush_queue = fc_rport_flush_queue;
 
-       if (!lport->tt.rport_destroy)
-               lport->tt.rport_destroy = fc_rport_destroy;
-
        return 0;
 }
 EXPORT_SYMBOL(fc_rport_init);