@@ -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}
@@ -1299,6 +1280,9 @@ int iscsi_target_start_negotiation(
12991280		set_bit (LOGIN_FLAGS_INITIAL_PDU , & conn -> login_flags );
13001281		write_unlock_bh (& sk -> sk_callback_lock );
13011282	}
1283+ 
1284+ 	iscsit_start_login_timer (conn );
1285+ 
13021286	/* 
13031287	 * If iscsi_target_do_login returns zero to signal more PDU 
13041288	 * exchanges are required to complete the login, go ahead and 
@@ -1317,8 +1301,10 @@ int iscsi_target_start_negotiation(
13171301		iscsi_target_restore_sock_callbacks (conn );
13181302		iscsi_remove_failed_auth_entry (conn );
13191303	}
1320- 	if  (ret  !=  0 )
1304+ 	if  (ret  !=  0 ) {
1305+ 		iscsit_stop_login_timer (conn );
13211306		iscsi_target_nego_release (conn );
1307+ 	}
13221308
13231309	return  ret ;
13241310}
0 commit comments