@@ -3104,17 +3104,32 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
3104
3104
}
3105
3105
EXPORT_SYMBOL_GPL (iscsi_session_setup );
3106
3106
3107
- /**
3108
- * iscsi_session_teardown - destroy session, host, and cls_session
3109
- * @cls_session: iscsi session
3107
+ /*
3108
+ * issi_session_remove - Remove session from iSCSI class.
3110
3109
*/
3111
- void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
3110
+ void iscsi_session_remove (struct iscsi_cls_session * cls_session )
3112
3111
{
3113
3112
struct iscsi_session * session = cls_session -> dd_data ;
3114
- struct module * owner = cls_session -> transport -> owner ;
3115
3113
struct Scsi_Host * shost = session -> host ;
3116
3114
3117
3115
iscsi_remove_session (cls_session );
3116
+ /*
3117
+ * host removal only has to wait for its children to be removed from
3118
+ * sysfs, and iscsi_tcp needs to do iscsi_host_remove before freeing
3119
+ * the session, so drop the session count here.
3120
+ */
3121
+ iscsi_host_dec_session_cnt (shost );
3122
+ }
3123
+ EXPORT_SYMBOL_GPL (iscsi_session_remove );
3124
+
3125
+ /**
3126
+ * iscsi_session_free - Free iscsi session and it's resources
3127
+ * @cls_session: iscsi session
3128
+ */
3129
+ void iscsi_session_free (struct iscsi_cls_session * cls_session )
3130
+ {
3131
+ struct iscsi_session * session = cls_session -> dd_data ;
3132
+ struct module * owner = cls_session -> transport -> owner ;
3118
3133
3119
3134
iscsi_pool_free (& session -> cmdpool );
3120
3135
kfree (session -> password );
@@ -3132,10 +3147,19 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
3132
3147
kfree (session -> discovery_parent_type );
3133
3148
3134
3149
iscsi_free_session (cls_session );
3135
-
3136
- iscsi_host_dec_session_cnt (shost );
3137
3150
module_put (owner );
3138
3151
}
3152
+ EXPORT_SYMBOL_GPL (iscsi_session_free );
3153
+
3154
+ /**
3155
+ * iscsi_session_teardown - destroy session and cls_session
3156
+ * @cls_session: iscsi session
3157
+ */
3158
+ void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
3159
+ {
3160
+ iscsi_session_remove (cls_session );
3161
+ iscsi_session_free (cls_session );
3162
+ }
3139
3163
EXPORT_SYMBOL_GPL (iscsi_session_teardown );
3140
3164
3141
3165
/**
0 commit comments