@@ -471,12 +471,18 @@ static int iscsi_target_do_login(struct iscsi_conn *, struct iscsi_login *);
471471
472472static bool __iscsi_target_sk_check_close (struct sock * sk )
473473{
474- if (sk -> sk_state == TCP_CLOSE_WAIT || sk -> sk_state == TCP_CLOSE ) {
475- pr_debug ("__iscsi_target_sk_check_close: TCP_CLOSE_WAIT|TCP_CLOSE,"
474+ switch (sk -> sk_state ) {
475+ case TCP_FIN_WAIT1 :
476+ case TCP_FIN_WAIT2 :
477+ case TCP_CLOSE_WAIT :
478+ case TCP_LAST_ACK :
479+ case TCP_CLOSE :
480+ pr_debug ("__iscsi_target_sk_check_close: socket closing,"
476481 "returning TRUE\n" );
477482 return true;
483+ default :
484+ return false;
478485 }
479- return false;
480486}
481487
482488static bool iscsi_target_sk_check_close (struct iscsi_conn * conn )
@@ -534,25 +540,6 @@ static void iscsi_target_login_drop(struct iscsi_conn *conn, struct iscsi_login
534540 iscsi_target_login_sess_out (conn , zero_tsih , true);
535541}
536542
537- struct conn_timeout {
538- struct timer_list timer ;
539- struct iscsi_conn * conn ;
540- };
541-
542- static void iscsi_target_login_timeout (struct timer_list * t )
543- {
544- struct conn_timeout * timeout = from_timer (timeout , t , timer );
545- struct iscsi_conn * conn = timeout -> conn ;
546-
547- pr_debug ("Entering iscsi_target_login_timeout >>>>>>>>>>>>>>>>>>>\n" );
548-
549- if (conn -> login_kworker ) {
550- pr_debug ("Sending SIGINT to conn->login_kworker %s/%d\n" ,
551- conn -> login_kworker -> comm , conn -> login_kworker -> pid );
552- send_sig (SIGINT , conn -> login_kworker , 1 );
553- }
554- }
555-
556543static void iscsi_target_do_login_rx (struct work_struct * work )
557544{
558545 struct iscsi_conn * conn = container_of (work ,
@@ -561,7 +548,6 @@ static void iscsi_target_do_login_rx(struct work_struct *work)
561548 struct iscsi_np * np = login -> np ;
562549 struct iscsi_portal_group * tpg = conn -> tpg ;
563550 struct iscsi_tpg_np * tpg_np = conn -> tpg_np ;
564- struct conn_timeout timeout ;
565551 int rc , zero_tsih = login -> zero_tsih ;
566552 bool state ;
567553
@@ -599,14 +585,7 @@ static void iscsi_target_do_login_rx(struct work_struct *work)
599585 conn -> login_kworker = current ;
600586 allow_signal (SIGINT );
601587
602- timeout .conn = conn ;
603- timer_setup_on_stack (& timeout .timer , iscsi_target_login_timeout , 0 );
604- mod_timer (& timeout .timer , jiffies + TA_LOGIN_TIMEOUT * HZ );
605- pr_debug ("Starting login timer for %s/%d\n" , current -> comm , current -> pid );
606-
607588 rc = conn -> conn_transport -> iscsit_get_login_rx (conn , login );
608- del_timer_sync (& timeout .timer );
609- destroy_timer_on_stack (& timeout .timer );
610589 flush_signals (current );
611590 conn -> login_kworker = NULL ;
612591
@@ -647,6 +626,7 @@ static void iscsi_target_do_login_rx(struct work_struct *work)
647626 goto err ;
648627 } else if (rc == 1 ) {
649628 cancel_delayed_work (& conn -> login_work );
629+ iscsit_stop_login_timer (conn );
650630 iscsi_target_nego_release (conn );
651631 iscsi_post_login_handler (np , conn , zero_tsih );
652632 iscsit_deaccess_np (np , tpg , tpg_np );
@@ -656,6 +636,7 @@ static void iscsi_target_do_login_rx(struct work_struct *work)
656636err :
657637 iscsi_target_restore_sock_callbacks (conn );
658638 cancel_delayed_work (& conn -> login_work );
639+ iscsit_stop_login_timer (conn );
659640 iscsi_target_login_drop (conn , login );
660641 iscsit_deaccess_np (np , tpg , tpg_np );
661642}
@@ -1301,6 +1282,9 @@ int iscsi_target_start_negotiation(
13011282 set_bit (LOGIN_FLAGS_INITIAL_PDU , & conn -> login_flags );
13021283 write_unlock_bh (& sk -> sk_callback_lock );
13031284 }
1285+
1286+ iscsit_start_login_timer (conn );
1287+
13041288 /*
13051289 * If iscsi_target_do_login returns zero to signal more PDU
13061290 * exchanges are required to complete the login, go ahead and
@@ -1319,8 +1303,10 @@ int iscsi_target_start_negotiation(
13191303 iscsi_target_restore_sock_callbacks (conn );
13201304 iscsi_remove_failed_auth_entry (conn );
13211305 }
1322- if (ret != 0 )
1306+ if (ret != 0 ) {
1307+ iscsit_stop_login_timer (conn );
13231308 iscsi_target_nego_release (conn );
1309+ }
13241310
13251311 return ret ;
13261312}
0 commit comments