|
@@ -341,7 +341,6 @@ void __transport_register_session(
|
|
|
&buf[0], PR_REG_ISID_LEN);
|
|
|
se_sess->sess_bin_isid = get_unaligned_be64(&buf[0]);
|
|
|
}
|
|
|
- kref_get(&se_nacl->acl_kref);
|
|
|
|
|
|
spin_lock_irq(&se_nacl->nacl_sess_lock);
|
|
|
/*
|
|
@@ -432,6 +431,7 @@ void target_put_nacl(struct se_node_acl *nacl)
|
|
|
{
|
|
|
kref_put(&nacl->acl_kref, target_complete_nacl);
|
|
|
}
|
|
|
+EXPORT_SYMBOL(target_put_nacl);
|
|
|
|
|
|
void transport_deregister_session_configfs(struct se_session *se_sess)
|
|
|
{
|
|
@@ -464,6 +464,15 @@ EXPORT_SYMBOL(transport_deregister_session_configfs);
|
|
|
|
|
|
void transport_free_session(struct se_session *se_sess)
|
|
|
{
|
|
|
+ struct se_node_acl *se_nacl = se_sess->se_node_acl;
|
|
|
+ /*
|
|
|
+ * Drop the se_node_acl->nacl_kref obtained from within
|
|
|
+ * core_tpg_get_initiator_node_acl().
|
|
|
+ */
|
|
|
+ if (se_nacl) {
|
|
|
+ se_sess->se_node_acl = NULL;
|
|
|
+ target_put_nacl(se_nacl);
|
|
|
+ }
|
|
|
if (se_sess->sess_cmd_map) {
|
|
|
percpu_ida_destroy(&se_sess->sess_tag_pool);
|
|
|
kvfree(se_sess->sess_cmd_map);
|
|
@@ -478,7 +487,7 @@ void transport_deregister_session(struct se_session *se_sess)
|
|
|
const struct target_core_fabric_ops *se_tfo;
|
|
|
struct se_node_acl *se_nacl;
|
|
|
unsigned long flags;
|
|
|
- bool comp_nacl = true, drop_nacl = false;
|
|
|
+ bool drop_nacl = false;
|
|
|
|
|
|
if (!se_tpg) {
|
|
|
transport_free_session(se_sess);
|
|
@@ -510,18 +519,16 @@ void transport_deregister_session(struct se_session *se_sess)
|
|
|
if (drop_nacl) {
|
|
|
core_tpg_wait_for_nacl_pr_ref(se_nacl);
|
|
|
core_free_device_list_for_node(se_nacl, se_tpg);
|
|
|
+ se_sess->se_node_acl = NULL;
|
|
|
kfree(se_nacl);
|
|
|
- comp_nacl = false;
|
|
|
}
|
|
|
pr_debug("TARGET_CORE[%s]: Deregistered fabric_sess\n",
|
|
|
se_tpg->se_tpg_tfo->get_fabric_name());
|
|
|
/*
|
|
|
* If last kref is dropping now for an explicit NodeACL, awake sleeping
|
|
|
* ->acl_free_comp caller to wakeup configfs se_node_acl->acl_group
|
|
|
- * removal context.
|
|
|
+ * removal context from within transport_free_session() code.
|
|
|
*/
|
|
|
- if (se_nacl && comp_nacl)
|
|
|
- target_put_nacl(se_nacl);
|
|
|
|
|
|
transport_free_session(se_sess);
|
|
|
}
|