|
@@ -402,16 +402,24 @@ static size_t rtnl_link_get_slave_info_data_size(const struct net_device *dev)
|
|
{
|
|
{
|
|
struct net_device *master_dev;
|
|
struct net_device *master_dev;
|
|
const struct rtnl_link_ops *ops;
|
|
const struct rtnl_link_ops *ops;
|
|
|
|
+ size_t size = 0;
|
|
|
|
|
|
- master_dev = netdev_master_upper_dev_get((struct net_device *) dev);
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+
|
|
|
|
+ master_dev = netdev_master_upper_dev_get_rcu((struct net_device *)dev);
|
|
if (!master_dev)
|
|
if (!master_dev)
|
|
- return 0;
|
|
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
ops = master_dev->rtnl_link_ops;
|
|
ops = master_dev->rtnl_link_ops;
|
|
if (!ops || !ops->get_slave_size)
|
|
if (!ops || !ops->get_slave_size)
|
|
- return 0;
|
|
|
|
|
|
+ goto out;
|
|
/* IFLA_INFO_SLAVE_DATA + nested data */
|
|
/* IFLA_INFO_SLAVE_DATA + nested data */
|
|
- return nla_total_size(sizeof(struct nlattr)) +
|
|
|
|
|
|
+ size = nla_total_size(sizeof(struct nlattr)) +
|
|
ops->get_slave_size(master_dev, dev);
|
|
ops->get_slave_size(master_dev, dev);
|
|
|
|
+
|
|
|
|
+out:
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+ return size;
|
|
}
|
|
}
|
|
|
|
|
|
static size_t rtnl_link_get_size(const struct net_device *dev)
|
|
static size_t rtnl_link_get_size(const struct net_device *dev)
|