@@ -917,16 +917,18 @@ void svc_close_xprt(struct svc_xprt *xprt)
917
917
}
918
918
EXPORT_SYMBOL_GPL (svc_close_xprt );
919
919
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 )
921
921
{
922
922
struct svc_xprt * xprt ;
923
923
924
+ spin_lock (& serv -> sv_lock );
924
925
list_for_each_entry (xprt , xprt_list , xpt_list ) {
925
926
if (xprt -> xpt_net != net )
926
927
continue ;
927
928
set_bit (XPT_CLOSE , & xprt -> xpt_flags );
928
929
set_bit (XPT_BUSY , & xprt -> xpt_flags );
929
930
}
931
+ spin_unlock (& serv -> sv_lock );
930
932
}
931
933
932
934
static 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)
949
951
}
950
952
}
951
953
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 )
953
955
{
954
956
struct svc_xprt * xprt ;
955
957
struct svc_xprt * tmp ;
958
+ LIST_HEAD (victims );
956
959
960
+ spin_lock (& serv -> sv_lock );
957
961
list_for_each_entry_safe (xprt , tmp , xprt_list , xpt_list ) {
958
962
if (xprt -> xpt_net != net )
959
963
continue ;
960
- svc_delete_xprt ( xprt );
964
+ list_move ( & xprt -> xpt_list , & victims );
961
965
}
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 );
964
970
}
965
971
966
972
void svc_close_net (struct svc_serv * serv , struct net * net )
967
973
{
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 );
970
976
971
977
svc_clear_pools (serv , net );
972
978
/*
973
979
* At this point the sp_sockets lists will stay empty, since
974
980
* svc_xprt_enqueue will not add new entries without taking the
975
981
* sp_lock and checking XPT_BUSY.
976
982
*/
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 );
979
985
}
980
986
981
987
/*
0 commit comments