@@ -2836,17 +2836,32 @@ 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_remove_session (cls_session );
2848
+ /*
2849
+ * host removal only has to wait for its children to be removed from
2850
+ * sysfs, and iscsi_tcp needs to do iscsi_host_remove before freeing
2851
+ * the session, so drop the session count here.
2852
+ */
2853
+ iscsi_host_dec_session_cnt (shost );
2854
+ }
2855
+ EXPORT_SYMBOL_GPL (iscsi_session_remove );
2856
+
2857
+ /**
2858
+ * iscsi_session_free - Free iscsi session and it's resources
2859
+ * @cls_session: iscsi session
2860
+ */
2861
+ void iscsi_session_free (struct iscsi_cls_session * cls_session )
2862
+ {
2863
+ struct iscsi_session * session = cls_session -> dd_data ;
2864
+ struct module * owner = cls_session -> transport -> owner ;
2850
2865
2851
2866
iscsi_pool_free (& session -> cmdpool );
2852
2867
kfree (session -> password );
@@ -2864,10 +2879,19 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
2864
2879
kfree (session -> discovery_parent_type );
2865
2880
2866
2881
iscsi_free_session (cls_session );
2867
-
2868
- iscsi_host_dec_session_cnt (shost );
2869
2882
module_put (owner );
2870
2883
}
2884
+ EXPORT_SYMBOL_GPL (iscsi_session_free );
2885
+
2886
+ /**
2887
+ * iscsi_session_teardown - destroy session and cls_session
2888
+ * @cls_session: iscsi session
2889
+ */
2890
+ void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2891
+ {
2892
+ iscsi_session_remove (cls_session );
2893
+ iscsi_session_free (cls_session );
2894
+ }
2871
2895
EXPORT_SYMBOL_GPL (iscsi_session_teardown );
2872
2896
2873
2897
/**
0 commit comments