@@ -1501,15 +1501,11 @@ static int genl_ctrl_event(int event, const struct genl_family *family,
15011501 if (IS_ERR (msg ))
15021502 return PTR_ERR (msg );
15031503
1504- if (!family -> netnsok ) {
1504+ if (!family -> netnsok )
15051505 genlmsg_multicast_netns (& genl_ctrl , & init_net , msg , 0 ,
15061506 0 , GFP_KERNEL );
1507- } else {
1508- rcu_read_lock ();
1509- genlmsg_multicast_allns (& genl_ctrl , msg , 0 ,
1510- 0 , GFP_ATOMIC );
1511- rcu_read_unlock ();
1512- }
1507+ else
1508+ genlmsg_multicast_allns (& genl_ctrl , msg , 0 , 0 );
15131509
15141510 return 0 ;
15151511}
@@ -1929,23 +1925,23 @@ static int __init genl_init(void)
19291925
19301926core_initcall (genl_init );
19311927
1932- static int genlmsg_mcast (struct sk_buff * skb , u32 portid , unsigned long group ,
1933- gfp_t flags )
1928+ static int genlmsg_mcast (struct sk_buff * skb , u32 portid , unsigned long group )
19341929{
19351930 struct sk_buff * tmp ;
19361931 struct net * net , * prev = NULL ;
19371932 bool delivered = false;
19381933 int err ;
19391934
1935+ rcu_read_lock ();
19401936 for_each_net_rcu (net ) {
19411937 if (prev ) {
1942- tmp = skb_clone (skb , flags );
1938+ tmp = skb_clone (skb , GFP_ATOMIC );
19431939 if (!tmp ) {
19441940 err = - ENOMEM ;
19451941 goto error ;
19461942 }
19471943 err = nlmsg_multicast (prev -> genl_sock , tmp ,
1948- portid , group , flags );
1944+ portid , group , GFP_ATOMIC );
19491945 if (!err )
19501946 delivered = true;
19511947 else if (err != - ESRCH )
@@ -1954,27 +1950,31 @@ static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
19541950
19551951 prev = net ;
19561952 }
1953+ err = nlmsg_multicast (prev -> genl_sock , skb , portid , group , GFP_ATOMIC );
1954+
1955+ rcu_read_unlock ();
19571956
1958- err = nlmsg_multicast (prev -> genl_sock , skb , portid , group , flags );
19591957 if (!err )
19601958 delivered = true;
19611959 else if (err != - ESRCH )
19621960 return err ;
19631961 return delivered ? 0 : - ESRCH ;
19641962 error :
1963+ rcu_read_unlock ();
1964+
19651965 kfree_skb (skb );
19661966 return err ;
19671967}
19681968
19691969int genlmsg_multicast_allns (const struct genl_family * family ,
19701970 struct sk_buff * skb , u32 portid ,
1971- unsigned int group , gfp_t flags )
1971+ unsigned int group )
19721972{
19731973 if (WARN_ON_ONCE (group >= family -> n_mcgrps ))
19741974 return - EINVAL ;
19751975
19761976 group = family -> mcgrp_offset + group ;
1977- return genlmsg_mcast (skb , portid , group , flags );
1977+ return genlmsg_mcast (skb , portid , group );
19781978}
19791979EXPORT_SYMBOL (genlmsg_multicast_allns );
19801980
0 commit comments