atomic_read(&sess->session_fall_back_to_erl0)) {
                spin_unlock_bh(&sess->conn_lock);
                complete_all(&sess->session_wait_comp);
-               iscsit_close_session(sess);
+               iscsit_close_session(sess, true);
 
                return 0;
        } else if (atomic_read(&sess->session_logout)) {
                if (atomic_read(&sess->session_close)) {
                        spin_unlock_bh(&sess->conn_lock);
                        complete_all(&sess->session_wait_comp);
-                       iscsit_close_session(sess);
+                       iscsit_close_session(sess, true);
                } else {
                        spin_unlock_bh(&sess->conn_lock);
                }
                if (atomic_read(&sess->session_close)) {
                        spin_unlock_bh(&sess->conn_lock);
                        complete_all(&sess->session_wait_comp);
-                       iscsit_close_session(sess);
+                       iscsit_close_session(sess, true);
                } else {
                        spin_unlock_bh(&sess->conn_lock);
                }
  * If the iSCSI Session for the iSCSI Initiator Node exists,
  * forcefully shutdown the iSCSI NEXUS.
  */
-int iscsit_close_session(struct iscsi_session *sess)
+int iscsit_close_session(struct iscsi_session *sess, bool can_sleep)
 {
        struct iscsi_portal_group *tpg = sess->tpg;
        struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
         * time2retain handler) and contain and active session usage count we
         * restart the timer and exit.
         */
-       if (!in_interrupt()) {
+       if (can_sleep) {
                iscsit_check_session_usage_count(sess);
        } else {
                if (iscsit_check_session_usage_count(sess) == 2) {
 
 extern int iscsi_target_tx_thread(void *);
 extern int iscsi_target_rx_thread(void *);
 extern int iscsit_close_connection(struct iscsi_conn *);
-extern int iscsit_close_session(struct iscsi_session *);
+extern int iscsit_close_session(struct iscsi_session *, bool can_sleep);
 extern void iscsit_fail_session(struct iscsi_session *);
 extern void iscsit_stop_session(struct iscsi_session *, int, int);
 extern int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *, int);