RTNL might be no longer held by the caller in the following patch.
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/core/rtnetlink.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 6041e008b22dbfd164ede6d50a77d2db5d7e2e23..0a59036d5f933c5b2f123a47e059036d2a555911 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2371,22 +2371,24 @@ static struct rtnl_link_ops *linkinfo_to_kind_ops(const struct nlattr *nla,
static bool link_master_filtered(struct net_device *dev, int master_idx)
{
struct net_device *master;
+ bool res = false;
if (!master_idx)
return false;
- master = netdev_master_upper_dev_get(dev);
+ rcu_read_lock();
+ master = netdev_master_upper_dev_get_rcu(dev);
/* 0 is already used to denote IFLA_MASTER wasn't passed, therefore need
* another invalid value for ifindex to denote "no master".
*/
if (master_idx == -1)
- return !!master;
-
- if (!master || master->ifindex != master_idx)
- return true;
+ res = !!master;
+ else if (!master || master->ifindex != master_idx)
+ res = true;
+ rcu_read_unlock();
- return false;
+ return res;
}
static bool link_kind_filtered(const struct net_device *dev,--
2.54.0.746.g67dd491aae-goog