]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
phonet: Pass net and ifindex to phonet_address_notify().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Thu, 17 Oct 2024 18:31:33 +0000 (11:31 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 24 Oct 2024 14:03:40 +0000 (16:03 +0200)
Currently, phonet_address_notify() fetches netns and ifindex from dev.

Once addr_doit() is converted to RCU, phonet_address_notify() will be
called outside of RCU due to GFP_KERNEL, and dev will be unavailable
there.

Let's pass net and ifindex to phonet_address_notify().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/phonet/pn_dev.h
net/phonet/pn_dev.c
net/phonet/pn_netlink.c

index e9dc8dca5817b8d7b4663b634058473f690fd25f..6b2102b4ece38a7368be11c99a27442bfb4614a4 100644 (file)
@@ -38,7 +38,7 @@ int phonet_address_add(struct net_device *dev, u8 addr);
 int phonet_address_del(struct net_device *dev, u8 addr);
 u8 phonet_address_get(struct net_device *dev, u8 addr);
 int phonet_address_lookup(struct net *net, u8 addr);
-void phonet_address_notify(int event, struct net_device *dev, u8 addr);
+void phonet_address_notify(struct net *net, int event, u32 ifindex, u8 addr);
 
 int phonet_route_add(struct net_device *dev, u8 daddr);
 int phonet_route_del(struct net_device *dev, u8 daddr);
index cde671d29d5dd36435e098930f209580d467f4fd..2e7d850dc72668ed42e2e537c662902fea6e55e0 100644 (file)
@@ -98,10 +98,13 @@ static void phonet_device_destroy(struct net_device *dev)
        mutex_unlock(&pndevs->lock);
 
        if (pnd) {
+               struct net *net = dev_net(dev);
+               u32 ifindex = dev->ifindex;
                u8 addr;
 
                for_each_set_bit(addr, pnd->addrs, 64)
-                       phonet_address_notify(RTM_DELADDR, dev, addr);
+                       phonet_address_notify(net, RTM_DELADDR, ifindex, addr);
+
                kfree(pnd);
        }
 }
@@ -244,8 +247,9 @@ static int phonet_device_autoconf(struct net_device *dev)
        ret = phonet_address_add(dev, req.ifr_phonet_autoconf.device);
        if (ret)
                return ret;
-       phonet_address_notify(RTM_NEWADDR, dev,
-                               req.ifr_phonet_autoconf.device);
+
+       phonet_address_notify(dev_net(dev), RTM_NEWADDR, dev->ifindex,
+                             req.ifr_phonet_autoconf.device);
        return 0;
 }
 
index 3205d24574779fb7b31592bf5d6564b220e66f68..23097085ad38e22240e3700ea1a4eba2c8cc2c21 100644 (file)
@@ -22,7 +22,7 @@
 static int fill_addr(struct sk_buff *skb, u32 ifindex, u8 addr,
                     u32 portid, u32 seq, int event);
 
-void phonet_address_notify(int event, struct net_device *dev, u8 addr)
+void phonet_address_notify(struct net *net, int event, u32 ifindex, u8 addr)
 {
        struct sk_buff *skb;
        int err = -ENOBUFS;
@@ -32,17 +32,17 @@ void phonet_address_notify(int event, struct net_device *dev, u8 addr)
        if (skb == NULL)
                goto errout;
 
-       err = fill_addr(skb, dev->ifindex, addr, 0, 0, event);
+       err = fill_addr(skb, ifindex, addr, 0, 0, event);
        if (err < 0) {
                WARN_ON(err == -EMSGSIZE);
                kfree_skb(skb);
                goto errout;
        }
-       rtnl_notify(skb, dev_net(dev), 0,
-                   RTNLGRP_PHONET_IFADDR, NULL, GFP_KERNEL);
+
+       rtnl_notify(skb, net, 0, RTNLGRP_PHONET_IFADDR, NULL, GFP_KERNEL);
        return;
 errout:
-       rtnl_set_sk_err(dev_net(dev), RTNLGRP_PHONET_IFADDR, err);
+       rtnl_set_sk_err(net, RTNLGRP_PHONET_IFADDR, err);
 }
 
 static const struct nla_policy ifa_phonet_policy[IFA_MAX+1] = {
@@ -89,7 +89,7 @@ static int addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
        else
                err = phonet_address_del(dev, pnaddr);
        if (!err)
-               phonet_address_notify(nlh->nlmsg_type, dev, pnaddr);
+               phonet_address_notify(net, nlh->nlmsg_type, ifm->ifa_index, pnaddr);
        return err;
 }