37
37
#include <linux/in.h>
38
38
#include <linux/poll.h>
39
39
#include <linux/version.h>
40
+ #include <linux/random.h>
40
41
#include <net/sock.h>
41
42
42
43
#include "rds.h"
@@ -323,6 +324,24 @@ static int rds_cong_monitor(struct rds_sock *rs, char __user *optval,
323
324
return ret ;
324
325
}
325
326
327
+ static void rds_user_conn_paths_drop (struct rds_connection * conn , int reason )
328
+ {
329
+ int i ;
330
+ struct rds_conn_path * cp ;
331
+
332
+ if (!conn -> c_trans -> t_mp_capable || conn -> c_npaths == 1 ) {
333
+ cp = & conn -> c_path [0 ];
334
+ cp -> cp_drop_source = reason ;
335
+ rds_conn_path_drop (cp , DR_USER_RESET );
336
+ } else {
337
+ for (i = 0 ; i < RDS_MPATH_WORKERS ; i ++ ) {
338
+ cp = & conn -> c_path [i ];
339
+ cp -> cp_drop_source = reason ;
340
+ rds_conn_path_drop (cp , DR_USER_RESET );
341
+ }
342
+ }
343
+ }
344
+
326
345
static int rds_user_reset (struct rds_sock * rs , char __user * optval , int optlen )
327
346
{
328
347
struct rds_reset reset ;
@@ -341,15 +360,14 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
341
360
pr_info ("RDS: Reset ALL conns for Source %pI4\n" ,
342
361
& reset .src .s_addr );
343
362
344
- rds_conn_laddr_list (reset .src .s_addr , & s_addr_conns );
363
+ rds_conn_laddr_list (sock_net (rds_rs_to_sk (rs )),
364
+ reset .src .s_addr , & s_addr_conns );
345
365
if (list_empty (& s_addr_conns ))
346
366
goto done ;
347
367
348
368
list_for_each_entry (conn , & s_addr_conns , c_laddr_node )
349
- if (conn ) {
350
- conn -> c_drop_source = 1 ;
351
- rds_conn_drop (conn , DR_USER_RESET );
352
- }
369
+ if (conn )
370
+ rds_user_conn_paths_drop (conn , 1 );
353
371
goto done ;
354
372
}
355
373
@@ -358,11 +376,14 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
358
376
rs -> rs_transport , reset .tos );
359
377
360
378
if (conn ) {
361
- printk (KERN_NOTICE "Resetting RDS/IB connection "
379
+ bool is_tcp = conn -> c_trans -> t_type == RDS_TRANS_TCP ;
380
+
381
+ printk (KERN_NOTICE "Resetting RDS/%s connection "
362
382
"<%u.%u.%u.%u,%u.%u.%u.%u,%d>\n" ,
383
+ is_tcp ? "tcp" : "IB" ,
363
384
NIPQUAD (reset .src .s_addr ),
364
385
NIPQUAD (reset .dst .s_addr ), conn -> c_tos );
365
- rds_conn_drop (conn , DR_USER_RESET );
386
+ rds_user_conn_paths_drop (conn , DR_USER_RESET );
366
387
}
367
388
done :
368
389
return 0 ;
@@ -898,10 +919,14 @@ static void rds_exit(void)
898
919
}
899
920
module_exit (rds_exit );
900
921
922
+ u32 rds_gen_num ;
923
+
901
924
static int rds_init (void )
902
925
{
903
926
int ret ;
904
927
928
+ net_get_random_once (& rds_gen_num , sizeof (rds_gen_num ));
929
+
905
930
rds_bind_lock_init ();
906
931
907
932
ret = rds_conn_init ();
0 commit comments