Message ID | 20220302163049.101957-2-sw@simonwunderlich.de (mailing list archive) |
---|---|
State | Accepted |
Commit | 690bb6fb64f5dc7437317153902573ecad67593d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [1/3] batman-adv: Request iflink once in batadv-on-batadv check | expand |
Hello: This series was applied to netdev/net.git (master) by Simon Wunderlich <sw@simonwunderlich.de>: On Wed, 2 Mar 2022 17:30:47 +0100 you wrote: > From: Sven Eckelmann <sven@narfation.org> > > There is no need to call dev_get_iflink multiple times for the same > net_device in batadv_is_on_batman_iface. And since some of the > .ndo_get_iflink callbacks are dynamic (for example via RCUs like in > vxcan_get_iflink), it could easily happen that the returned values are not > stable. The pre-checks before __dev_get_by_index are then of course bogus. > > [...] Here is the summary with links: - [1/3] batman-adv: Request iflink once in batadv-on-batadv check https://git.kernel.org/netdev/net/c/690bb6fb64f5 - [2/3] batman-adv: Request iflink once in batadv_get_real_netdevice https://git.kernel.org/netdev/net/c/6116ba09423f - [3/3] batman-adv: Don't expect inter-netns unique iflink indices https://git.kernel.org/netdev/net/c/6c1f41afc1db You are awesome, thank you!
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c index 8a2b78f9c4b2..35aa1122043b 100644 --- a/net/batman-adv/hard-interface.c +++ b/net/batman-adv/hard-interface.c @@ -149,22 +149,23 @@ static bool batadv_is_on_batman_iface(const struct net_device *net_dev) struct net *net = dev_net(net_dev); struct net_device *parent_dev; struct net *parent_net; + int iflink; bool ret; /* check if this is a batman-adv mesh interface */ if (batadv_softif_is_valid(net_dev)) return true; + iflink = dev_get_iflink(net_dev); + /* no more parents..stop recursion */ - if (dev_get_iflink(net_dev) == 0 || - dev_get_iflink(net_dev) == net_dev->ifindex) + if (iflink == 0 || iflink == net_dev->ifindex) return false; parent_net = batadv_getlink_net(net_dev, net); /* recurse over the parent device */ - parent_dev = __dev_get_by_index((struct net *)parent_net, - dev_get_iflink(net_dev)); + parent_dev = __dev_get_by_index((struct net *)parent_net, iflink); /* if we got a NULL parent_dev there is something broken.. */ if (!parent_dev) { pr_err("Cannot find parent device\n");