@@ -2875,17 +2875,32 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
2875
2875
}
2876
2876
EXPORT_SYMBOL_GPL (iscsi_session_setup );
2877
2877
2878
- /**
2879
- * iscsi_session_teardown - destroy session, host, and cls_session
2880
- * @cls_session: iscsi session
2878
+ /*
2879
+ * issi_session_remove - Remove session from iSCSI class.
2881
2880
*/
2882
- void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2881
+ void iscsi_session_remove (struct iscsi_cls_session * cls_session )
2883
2882
{
2884
2883
struct iscsi_session * session = cls_session -> dd_data ;
2885
- struct module * owner = cls_session -> transport -> owner ;
2886
2884
struct Scsi_Host * shost = session -> host ;
2887
2885
2888
2886
iscsi_remove_session (cls_session );
2887
+ /*
2888
+ * host removal only has to wait for its children to be removed from
2889
+ * sysfs, and iscsi_tcp needs to do iscsi_host_remove before freeing
2890
+ * the session, so drop the session count here.
2891
+ */
2892
+ iscsi_host_dec_session_cnt (shost );
2893
+ }
2894
+ EXPORT_SYMBOL_GPL (iscsi_session_remove );
2895
+
2896
+ /**
2897
+ * iscsi_session_free - Free iscsi session and it's resources
2898
+ * @cls_session: iscsi session
2899
+ */
2900
+ void iscsi_session_free (struct iscsi_cls_session * cls_session )
2901
+ {
2902
+ struct iscsi_session * session = cls_session -> dd_data ;
2903
+ struct module * owner = cls_session -> transport -> owner ;
2889
2904
2890
2905
iscsi_pool_free (& session -> cmdpool );
2891
2906
kfree (session -> password );
@@ -2903,10 +2918,19 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
2903
2918
kfree (session -> discovery_parent_type );
2904
2919
2905
2920
iscsi_free_session (cls_session );
2906
-
2907
- iscsi_host_dec_session_cnt (shost );
2908
2921
module_put (owner );
2909
2922
}
2923
+ EXPORT_SYMBOL_GPL (iscsi_session_free );
2924
+
2925
+ /**
2926
+ * iscsi_session_teardown - destroy session and cls_session
2927
+ * @cls_session: iscsi session
2928
+ */
2929
+ void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2930
+ {
2931
+ iscsi_session_remove (cls_session );
2932
+ iscsi_session_free (cls_session );
2933
+ }
2910
2934
EXPORT_SYMBOL_GPL (iscsi_session_teardown );
2911
2935
2912
2936
/**
0 commit comments