@@ -917,16 +917,18 @@ void svc_close_xprt(struct svc_xprt *xprt)
917917}
918918EXPORT_SYMBOL_GPL (svc_close_xprt );
919919
920- static  void  svc_close_list (struct  list_head  * xprt_list , struct  net  * net )
920+ static  void  svc_close_list (struct  svc_serv   * serv ,  struct   list_head  * xprt_list , struct  net  * net )
921921{
922922	struct  svc_xprt  * xprt ;
923923
924+ 	spin_lock (& serv -> sv_lock );
924925	list_for_each_entry (xprt , xprt_list , xpt_list ) {
925926		if  (xprt -> xpt_net  !=  net )
926927			continue ;
927928		set_bit (XPT_CLOSE , & xprt -> xpt_flags );
928929		set_bit (XPT_BUSY , & xprt -> xpt_flags );
929930	}
931+ 	spin_unlock (& serv -> sv_lock );
930932}
931933
932934static  void  svc_clear_pools (struct  svc_serv  * serv , struct  net  * net )
@@ -949,33 +951,37 @@ static void svc_clear_pools(struct svc_serv *serv, struct net *net)
949951	}
950952}
951953
952- static  void  svc_clear_list (struct  list_head  * xprt_list , struct  net  * net )
954+ static  void  svc_clear_list (struct  svc_serv   * serv ,  struct   list_head  * xprt_list , struct  net  * net )
953955{
954956	struct  svc_xprt  * xprt ;
955957	struct  svc_xprt  * tmp ;
958+ 	LIST_HEAD (victims );
956959
960+ 	spin_lock (& serv -> sv_lock );
957961	list_for_each_entry_safe (xprt , tmp , xprt_list , xpt_list ) {
958962		if  (xprt -> xpt_net  !=  net )
959963			continue ;
960- 		svc_delete_xprt ( xprt );
964+ 		list_move ( & xprt -> xpt_list ,  & victims );
961965	}
962- 	list_for_each_entry (xprt , xprt_list , xpt_list )
963- 		BUG_ON (xprt -> xpt_net  ==  net );
966+ 	spin_unlock (& serv -> sv_lock );
967+ 
968+ 	list_for_each_entry_safe (xprt , tmp , & victims , xpt_list )
969+ 		svc_delete_xprt (xprt );
964970}
965971
966972void  svc_close_net (struct  svc_serv  * serv , struct  net  * net )
967973{
968- 	svc_close_list (& serv -> sv_tempsocks , net );
969- 	svc_close_list (& serv -> sv_permsocks , net );
974+ 	svc_close_list (serv ,  & serv -> sv_tempsocks , net );
975+ 	svc_close_list (serv ,  & serv -> sv_permsocks , net );
970976
971977	svc_clear_pools (serv , net );
972978	/* 
973979	 * At this point the sp_sockets lists will stay empty, since 
974980	 * svc_xprt_enqueue will not add new entries without taking the 
975981	 * sp_lock and checking XPT_BUSY. 
976982	 */ 
977- 	svc_clear_list (& serv -> sv_tempsocks , net );
978- 	svc_clear_list (& serv -> sv_permsocks , net );
983+ 	svc_clear_list (serv ,  & serv -> sv_tempsocks , net );
984+ 	svc_clear_list (serv ,  & serv -> sv_permsocks , net );
979985}
980986
981987/* 
0 commit comments