@@ -2836,19 +2836,34 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
2836
2836
}
2837
2837
EXPORT_SYMBOL_GPL (iscsi_session_setup );
2838
2838
2839
- /**
2840
- * iscsi_session_teardown - destroy session, host, and cls_session
2841
- * @cls_session: iscsi session
2839
+ /*
2840
+ * issi_session_remove - Remove session from iSCSI class.
2842
2841
*/
2843
- void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2842
+ void iscsi_session_remove (struct iscsi_cls_session * cls_session )
2844
2843
{
2845
2844
struct iscsi_session * session = cls_session -> dd_data ;
2846
- struct module * owner = cls_session -> transport -> owner ;
2847
2845
struct Scsi_Host * shost = session -> host ;
2848
2846
2849
2847
iscsi_pool_free (& session -> cmdpool );
2850
2848
2851
2849
iscsi_remove_session (cls_session );
2850
+ /*
2851
+ * host removal only has to wait for its children to be removed from
2852
+ * sysfs, and iscsi_tcp needs to do iscsi_host_remove before freeing
2853
+ * the session, so drop the session count here.
2854
+ */
2855
+ iscsi_host_dec_session_cnt (shost );
2856
+ }
2857
+ EXPORT_SYMBOL_GPL (iscsi_session_remove );
2858
+
2859
+ /**
2860
+ * iscsi_session_free - Free iscsi session and it's resources
2861
+ * @cls_session: iscsi session
2862
+ */
2863
+ void iscsi_session_free (struct iscsi_cls_session * cls_session )
2864
+ {
2865
+ struct iscsi_session * session = cls_session -> dd_data ;
2866
+ struct module * owner = cls_session -> transport -> owner ;
2852
2867
2853
2868
kfree (session -> password );
2854
2869
kfree (session -> password_in );
@@ -2865,10 +2880,19 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
2865
2880
kfree (session -> discovery_parent_type );
2866
2881
2867
2882
iscsi_free_session (cls_session );
2868
-
2869
- iscsi_host_dec_session_cnt (shost );
2870
2883
module_put (owner );
2871
2884
}
2885
+ EXPORT_SYMBOL_GPL (iscsi_session_free );
2886
+
2887
+ /**
2888
+ * iscsi_session_teardown - destroy session and cls_session
2889
+ * @cls_session: iscsi session
2890
+ */
2891
+ void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2892
+ {
2893
+ iscsi_session_remove (cls_session );
2894
+ iscsi_session_free (cls_session );
2895
+ }
2872
2896
EXPORT_SYMBOL_GPL (iscsi_session_teardown );
2873
2897
2874
2898
/**
0 commit comments