]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
phonet: Pass ifindex to fill_addr().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Thu, 17 Oct 2024 18:31:32 +0000 (11:31 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 24 Oct 2024 14:03:40 +0000 (16:03 +0200)
We will convert addr_doit() and getaddr_dumpit() to RCU, both
of which call fill_addr().

The former will call phonet_address_notify() outside of RCU
due to GFP_KERNEL, so dev will not be available in fill_addr().

Let's pass ifindex directly to fill_addr().

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

index 894e5c72d6bfff7e2b634b7f6d19d023da695e31..3205d24574779fb7b31592bf5d6564b220e66f68 100644 (file)
@@ -19,7 +19,7 @@
 
 /* Device address handling */
 
-static int fill_addr(struct sk_buff *skb, struct net_device *dev, u8 addr,
+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)
@@ -31,7 +31,8 @@ void phonet_address_notify(int event, struct net_device *dev, u8 addr)
                        nla_total_size(1), GFP_KERNEL);
        if (skb == NULL)
                goto errout;
-       err = fill_addr(skb, dev, addr, 0, 0, event);
+
+       err = fill_addr(skb, dev->ifindex, addr, 0, 0, event);
        if (err < 0) {
                WARN_ON(err == -EMSGSIZE);
                kfree_skb(skb);
@@ -92,8 +93,8 @@ static int addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
        return err;
 }
 
-static int fill_addr(struct sk_buff *skb, struct net_device *dev, u8 addr,
-                       u32 portid, u32 seq, int event)
+static int fill_addr(struct sk_buff *skb, u32 ifindex, u8 addr,
+                    u32 portid, u32 seq, int event)
 {
        struct ifaddrmsg *ifm;
        struct nlmsghdr *nlh;
@@ -107,7 +108,7 @@ static int fill_addr(struct sk_buff *skb, struct net_device *dev, u8 addr,
        ifm->ifa_prefixlen = 0;
        ifm->ifa_flags = IFA_F_PERMANENT;
        ifm->ifa_scope = RT_SCOPE_LINK;
-       ifm->ifa_index = dev->ifindex;
+       ifm->ifa_index = ifindex;
        if (nla_put_u8(skb, IFA_LOCAL, addr))
                goto nla_put_failure;
        nlmsg_end(skb, nlh);
@@ -140,7 +141,7 @@ static int getaddr_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
                        if (addr_idx++ < addr_start_idx)
                                continue;
 
-                       if (fill_addr(skb, pnd->netdev, addr << 2,
+                       if (fill_addr(skb, pnd->netdev->ifindex, addr << 2,
                                         NETLINK_CB(cb->skb).portid,
                                        cb->nlh->nlmsg_seq, RTM_NEWADDR) < 0)
                                goto out;