@@ -825,7 +825,7 @@ static void __flush_arp_entry(struct arpreq *r, char name[IFNAMSIZ])
825
825
826
826
r -> arp_flags = ATF_PERM ;
827
827
((struct sockaddr_in * )& r -> arp_netmask )-> sin_addr .s_addr = htonl (0 );
828
- strcpy (r -> arp_dev , name );
828
+ strncpy (r -> arp_dev , name , IFNAMSIZ );
829
829
ret = inet_ioctl (rds_ib_inet_socket , SIOCDARP , (unsigned long )r );
830
830
if ((ret == - ENOENT ) || (ret == - ENXIO )) {
831
831
r -> arp_flags |= ATF_PUBL ;
@@ -863,13 +863,40 @@ static void __flush_eth_arp_entry(struct arpreq *r)
863
863
864
864
static void __flush_ib_arp_entry (struct arpreq * r )
865
865
{
866
+ const int nmbr_dev_per_realloc = 10 ;
866
867
struct net_device * ndev ;
868
+ char * dev_array = NULL ;
869
+ int dev_found = 0 ;
870
+ int dev_left = 0 ;
871
+ char * ret ;
872
+ int i ;
873
+
874
+ rcu_read_lock ();
875
+ for_each_netdev_rcu (& init_net , ndev ) {
876
+ if (ndev -> type != ARPHRD_INFINIBAND )
877
+ continue ;
878
+
879
+ if (!dev_left ) {
880
+ ret = krealloc (dev_array ,
881
+ (dev_found + nmbr_dev_per_realloc ) * IFNAMSIZ ,
882
+ GFP_ATOMIC );
883
+ if (!ret ) {
884
+ pr_err ("krealloc failed" );
885
+ break ;
886
+ }
887
+ dev_array = ret ;
888
+ dev_left = nmbr_dev_per_realloc ;
889
+ }
890
+ strncpy (dev_array + dev_found * IFNAMSIZ , ndev -> name , IFNAMSIZ );
891
+ ++ dev_found ;
892
+ -- dev_left ;
893
+ }
894
+ rcu_read_unlock ();
895
+
896
+ for (i = 0 ; i < dev_found ; ++ i )
897
+ __flush_arp_entry (r , dev_array + i * IFNAMSIZ );
867
898
868
- read_lock (& dev_base_lock );
869
- for_each_netdev (& init_net , ndev )
870
- if (ndev -> type == ARPHRD_INFINIBAND )
871
- __flush_arp_entry (r , ndev -> name );
872
- read_unlock (& dev_base_lock );
899
+ kfree (dev_array );
873
900
}
874
901
875
902
void rds_ib_flush_arp_entry (struct in6_addr * prot_addr )
0 commit comments