@@ -1089,15 +1089,11 @@ static int genl_ctrl_event(int event, const struct genl_family *family,
10891089 if (IS_ERR (msg ))
10901090 return PTR_ERR (msg );
10911091
1092- if (!family -> netnsok ) {
1092+ if (!family -> netnsok )
10931093 genlmsg_multicast_netns (& genl_ctrl , & init_net , msg , 0 ,
10941094 0 , GFP_KERNEL );
1095- } else {
1096- rcu_read_lock ();
1097- genlmsg_multicast_allns (& genl_ctrl , msg , 0 ,
1098- 0 , GFP_ATOMIC );
1099- rcu_read_unlock ();
1100- }
1095+ else
1096+ genlmsg_multicast_allns (& genl_ctrl , msg , 0 , 0 );
11011097
11021098 return 0 ;
11031099}
@@ -1441,23 +1437,23 @@ static int __init genl_init(void)
14411437
14421438core_initcall (genl_init );
14431439
1444- static int genlmsg_mcast (struct sk_buff * skb , u32 portid , unsigned long group ,
1445- gfp_t flags )
1440+ static int genlmsg_mcast (struct sk_buff * skb , u32 portid , unsigned long group )
14461441{
14471442 struct sk_buff * tmp ;
14481443 struct net * net , * prev = NULL ;
14491444 bool delivered = false;
14501445 int err ;
14511446
1447+ rcu_read_lock ();
14521448 for_each_net_rcu (net ) {
14531449 if (prev ) {
1454- tmp = skb_clone (skb , flags );
1450+ tmp = skb_clone (skb , GFP_ATOMIC );
14551451 if (!tmp ) {
14561452 err = - ENOMEM ;
14571453 goto error ;
14581454 }
14591455 err = nlmsg_multicast (prev -> genl_sock , tmp ,
1460- portid , group , flags );
1456+ portid , group , GFP_ATOMIC );
14611457 if (!err )
14621458 delivered = true;
14631459 else if (err != - ESRCH )
@@ -1466,27 +1462,31 @@ static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
14661462
14671463 prev = net ;
14681464 }
1465+ err = nlmsg_multicast (prev -> genl_sock , skb , portid , group , GFP_ATOMIC );
1466+
1467+ rcu_read_unlock ();
14691468
1470- err = nlmsg_multicast (prev -> genl_sock , skb , portid , group , flags );
14711469 if (!err )
14721470 delivered = true;
14731471 else if (err != - ESRCH )
14741472 return err ;
14751473 return delivered ? 0 : - ESRCH ;
14761474 error :
1475+ rcu_read_unlock ();
1476+
14771477 kfree_skb (skb );
14781478 return err ;
14791479}
14801480
14811481int genlmsg_multicast_allns (const struct genl_family * family ,
14821482 struct sk_buff * skb , u32 portid ,
1483- unsigned int group , gfp_t flags )
1483+ unsigned int group )
14841484{
14851485 if (WARN_ON_ONCE (group >= family -> n_mcgrps ))
14861486 return - EINVAL ;
14871487
14881488 group = family -> mcgrp_offset + group ;
1489- return genlmsg_mcast (skb , portid , group , flags );
1489+ return genlmsg_mcast (skb , portid , group );
14901490}
14911491EXPORT_SYMBOL (genlmsg_multicast_allns );
14921492
0 commit comments