|
@@ -844,9 +844,28 @@ static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct qla_tgt_sess *sess)
|
|
|
se_nacl, nacl->nport_wwnn, nacl->nport_id);
|
|
|
}
|
|
|
|
|
|
+static void tcm_qla2xxx_release_session(struct kref *kref)
|
|
|
+{
|
|
|
+ struct se_session *se_sess = container_of(kref,
|
|
|
+ struct se_session, sess_kref);
|
|
|
+
|
|
|
+ qlt_unreg_sess(se_sess->fabric_sess_ptr);
|
|
|
+}
|
|
|
+
|
|
|
+static void tcm_qla2xxx_put_session(struct se_session *se_sess)
|
|
|
+{
|
|
|
+ struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr;
|
|
|
+ struct qla_hw_data *ha = sess->vha->hw;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
|
+ kref_put(&se_sess->sess_kref, tcm_qla2xxx_release_session);
|
|
|
+ spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
|
|
+}
|
|
|
+
|
|
|
static void tcm_qla2xxx_put_sess(struct qla_tgt_sess *sess)
|
|
|
{
|
|
|
- target_put_session(sess->se_sess);
|
|
|
+ tcm_qla2xxx_put_session(sess->se_sess);
|
|
|
}
|
|
|
|
|
|
static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess)
|
|
@@ -1731,6 +1750,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_ops = {
|
|
|
.new_cmd_map = NULL,
|
|
|
.check_stop_free = tcm_qla2xxx_check_stop_free,
|
|
|
.release_cmd = tcm_qla2xxx_release_cmd,
|
|
|
+ .put_session = tcm_qla2xxx_put_session,
|
|
|
.shutdown_session = tcm_qla2xxx_shutdown_session,
|
|
|
.close_session = tcm_qla2xxx_close_session,
|
|
|
.sess_get_index = tcm_qla2xxx_sess_get_index,
|
|
@@ -1779,6 +1799,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
|
|
|
.tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl,
|
|
|
.tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index,
|
|
|
.release_cmd = tcm_qla2xxx_release_cmd,
|
|
|
+ .put_session = tcm_qla2xxx_put_session,
|
|
|
.shutdown_session = tcm_qla2xxx_shutdown_session,
|
|
|
.close_session = tcm_qla2xxx_close_session,
|
|
|
.sess_get_index = tcm_qla2xxx_sess_get_index,
|