@@ -2892,17 +2892,32 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
2892
2892
}
2893
2893
EXPORT_SYMBOL_GPL (iscsi_session_setup );
2894
2894
2895
- /**
2896
- * iscsi_session_teardown - destroy session, host, and cls_session
2897
- * @cls_session: iscsi session
2895
+ /*
2896
+ * issi_session_remove - Remove session from iSCSI class.
2898
2897
*/
2899
- void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2898
+ void iscsi_session_remove (struct iscsi_cls_session * cls_session )
2900
2899
{
2901
2900
struct iscsi_session * session = cls_session -> dd_data ;
2902
- struct module * owner = cls_session -> transport -> owner ;
2903
2901
struct Scsi_Host * shost = session -> host ;
2904
2902
2905
2903
iscsi_remove_session (cls_session );
2904
+ /*
2905
+ * host removal only has to wait for its children to be removed from
2906
+ * sysfs, and iscsi_tcp needs to do iscsi_host_remove before freeing
2907
+ * the session, so drop the session count here.
2908
+ */
2909
+ iscsi_host_dec_session_cnt (shost );
2910
+ }
2911
+ EXPORT_SYMBOL_GPL (iscsi_session_remove );
2912
+
2913
+ /**
2914
+ * iscsi_session_free - Free iscsi session and it's resources
2915
+ * @cls_session: iscsi session
2916
+ */
2917
+ void iscsi_session_free (struct iscsi_cls_session * cls_session )
2918
+ {
2919
+ struct iscsi_session * session = cls_session -> dd_data ;
2920
+ struct module * owner = cls_session -> transport -> owner ;
2906
2921
2907
2922
iscsi_pool_free (& session -> cmdpool );
2908
2923
kfree (session -> password );
@@ -2920,10 +2935,19 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
2920
2935
kfree (session -> discovery_parent_type );
2921
2936
2922
2937
iscsi_free_session (cls_session );
2923
-
2924
- iscsi_host_dec_session_cnt (shost );
2925
2938
module_put (owner );
2926
2939
}
2940
+ EXPORT_SYMBOL_GPL (iscsi_session_free );
2941
+
2942
+ /**
2943
+ * iscsi_session_teardown - destroy session and cls_session
2944
+ * @cls_session: iscsi session
2945
+ */
2946
+ void iscsi_session_teardown (struct iscsi_cls_session * cls_session )
2947
+ {
2948
+ iscsi_session_remove (cls_session );
2949
+ iscsi_session_free (cls_session );
2950
+ }
2927
2951
EXPORT_SYMBOL_GPL (iscsi_session_teardown );
2928
2952
2929
2953
/**
0 commit comments