net: Use link/peer netns in newlink() of rtnl_link_ops

Add two helper functions - rtnl_newlink_link_net() and
rtnl_newlink_peer_net() for netns fallback logic. Peer netns falls back
to link netns, and link netns falls back to source netns.

Convert the use of params->net in netdevice drivers to one of the helper
functions for clarity.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250219125039.18024-4-shaw.leon@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Xiao Liang 2025-02-19 20:50:29 +08:00 committed by Jakub Kicinski
parent 69c7be1b90
commit cf517ac16a
21 changed files with 58 additions and 41 deletions

View File

@ -101,8 +101,8 @@ static int ipoib_new_child_link(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net_device *pdev; struct net_device *pdev;
struct ipoib_dev_priv *ppriv; struct ipoib_dev_priv *ppriv;
@ -112,7 +112,7 @@ static int ipoib_new_child_link(struct net_device *dev,
if (!tb[IFLA_LINK]) if (!tb[IFLA_LINK])
return -EINVAL; return -EINVAL;
pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); pdev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
if (!pdev || pdev->type != ARPHRD_INFINIBAND) if (!pdev || pdev->type != ARPHRD_INFINIBAND)
return -ENODEV; return -ENODEV;

View File

@ -3165,13 +3165,13 @@ static int amt_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct amt_dev *amt = netdev_priv(dev); struct amt_dev *amt = netdev_priv(dev);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net *net = params->net;
int err = -EINVAL; int err = -EINVAL;
amt->net = net; amt->net = link_net;
amt->mode = nla_get_u32(data[IFLA_AMT_MODE]); amt->mode = nla_get_u32(data[IFLA_AMT_MODE]);
if (data[IFLA_AMT_MAX_TUNNELS] && if (data[IFLA_AMT_MAX_TUNNELS] &&
@ -3186,7 +3186,7 @@ static int amt_newlink(struct net_device *dev,
amt->hash_buckets = AMT_HSIZE; amt->hash_buckets = AMT_HSIZE;
amt->nr_tunnels = 0; amt->nr_tunnels = 0;
get_random_bytes(&amt->hash_seed, sizeof(amt->hash_seed)); get_random_bytes(&amt->hash_seed, sizeof(amt->hash_seed));
amt->stream_dev = dev_get_by_index(net, amt->stream_dev = dev_get_by_index(link_net,
nla_get_u32(data[IFLA_AMT_LINK])); nla_get_u32(data[IFLA_AMT_LINK]));
if (!amt->stream_dev) { if (!amt->stream_dev) {
NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_LINK], NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_LINK],

View File

@ -702,9 +702,9 @@ static int bareudp_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net *net = params->net;
struct bareudp_conf conf; struct bareudp_conf conf;
int err; int err;
@ -712,7 +712,7 @@ static int bareudp_newlink(struct net_device *dev,
if (err) if (err)
return err; return err;
err = bareudp_configure(net, dev, &conf, extack); err = bareudp_configure(link_net, dev, &conf, extack);
if (err) if (err)
return err; return err;

View File

@ -176,8 +176,8 @@ static int vxcan_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *peer_net = rtnl_newlink_peer_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *peer_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct vxcan_priv *priv; struct vxcan_priv *priv;
struct net_device *peer; struct net_device *peer;

View File

@ -121,9 +121,9 @@ static int rmnet_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION; u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION;
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net_device *real_dev; struct net_device *real_dev;
int mode = RMNET_EPMODE_VND; int mode = RMNET_EPMODE_VND;
@ -137,7 +137,7 @@ static int rmnet_newlink(struct net_device *dev,
return -EINVAL; return -EINVAL;
} }
real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
if (!real_dev) { if (!real_dev) {
NL_SET_ERR_MSG_MOD(extack, "link does not exist"); NL_SET_ERR_MSG_MOD(extack, "link does not exist");
return -ENODEV; return -ENODEV;

View File

@ -1618,9 +1618,9 @@ static int geneve_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net *net = params->net;
struct geneve_config cfg = { struct geneve_config cfg = {
.df = GENEVE_DF_UNSET, .df = GENEVE_DF_UNSET,
.use_udp6_rx_checksums = false, .use_udp6_rx_checksums = false,
@ -1634,7 +1634,7 @@ static int geneve_newlink(struct net_device *dev,
if (err) if (err)
return err; return err;
err = geneve_configure(net, dev, extack, &cfg); err = geneve_configure(link_net, dev, extack, &cfg);
if (err) if (err)
return err; return err;

View File

@ -1466,8 +1466,8 @@ static int gtp_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
unsigned int role = GTP_ROLE_GGSN; unsigned int role = GTP_ROLE_GGSN;
struct gtp_dev *gtp; struct gtp_dev *gtp;
struct gtp_net *gn; struct gtp_net *gn;
@ -1498,7 +1498,7 @@ static int gtp_newlink(struct net_device *dev,
gtp->restart_count = nla_get_u8_default(data[IFLA_GTP_RESTART_COUNT], gtp->restart_count = nla_get_u8_default(data[IFLA_GTP_RESTART_COUNT],
0); 0);
gtp->net = src_net; gtp->net = link_net;
err = gtp_hashtable_new(gtp, hashsize); err = gtp_hashtable_new(gtp, hashsize);
if (err < 0) if (err < 0)
@ -1528,7 +1528,7 @@ static int gtp_newlink(struct net_device *dev,
goto out_encap; goto out_encap;
} }
gn = net_generic(src_net, gtp_net_id); gn = net_generic(link_net, gtp_net_id);
list_add(&gtp->list, &gn->gtp_dev_list); list_add(&gtp->list, &gn->gtp_dev_list);
dev->priv_destructor = gtp_destructor; dev->priv_destructor = gtp_destructor;

View File

@ -535,9 +535,9 @@ err:
int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params, int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct ipvl_dev *ipvlan = netdev_priv(dev); struct ipvl_dev *ipvlan = netdev_priv(dev);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct ipvl_port *port; struct ipvl_port *port;
struct net_device *phy_dev; struct net_device *phy_dev;
@ -547,7 +547,7 @@ int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params,
if (!tb[IFLA_LINK]) if (!tb[IFLA_LINK])
return -EINVAL; return -EINVAL;
phy_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); phy_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
if (!phy_dev) if (!phy_dev)
return -ENODEV; return -ENODEV;

View File

@ -4145,10 +4145,10 @@ static int macsec_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct macsec_dev *macsec = macsec_priv(dev); struct macsec_dev *macsec = macsec_priv(dev);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net *net = params->net;
rx_handler_func_t *rx_handler; rx_handler_func_t *rx_handler;
u8 icv_len = MACSEC_DEFAULT_ICV_LEN; u8 icv_len = MACSEC_DEFAULT_ICV_LEN;
struct net_device *real_dev; struct net_device *real_dev;
@ -4157,7 +4157,7 @@ static int macsec_newlink(struct net_device *dev,
if (!tb[IFLA_LINK]) if (!tb[IFLA_LINK])
return -EINVAL; return -EINVAL;
real_dev = __dev_get_by_index(net, nla_get_u32(tb[IFLA_LINK])); real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
if (!real_dev) if (!real_dev)
return -ENODEV; return -ENODEV;
if (real_dev->type != ARPHRD_ETHER) if (real_dev->type != ARPHRD_ETHER)

View File

@ -1444,9 +1444,9 @@ int macvlan_common_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct macvlan_dev *vlan = netdev_priv(dev); struct macvlan_dev *vlan = netdev_priv(dev);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net_device *lowerdev; struct net_device *lowerdev;
struct macvlan_port *port; struct macvlan_port *port;
@ -1457,7 +1457,7 @@ int macvlan_common_newlink(struct net_device *dev,
if (!tb[IFLA_LINK]) if (!tb[IFLA_LINK])
return -EINVAL; return -EINVAL;
lowerdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); lowerdev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
if (lowerdev == NULL) if (lowerdev == NULL)
return -ENODEV; return -ENODEV;

View File

@ -331,13 +331,13 @@ static int netkit_new_link(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *peer_net = rtnl_newlink_peer_net(params);
enum netkit_scrub scrub_prim = NETKIT_SCRUB_DEFAULT; enum netkit_scrub scrub_prim = NETKIT_SCRUB_DEFAULT;
enum netkit_scrub scrub_peer = NETKIT_SCRUB_DEFAULT; enum netkit_scrub scrub_peer = NETKIT_SCRUB_DEFAULT;
struct nlattr *peer_tb[IFLA_MAX + 1], **tbp, *attr; struct nlattr *peer_tb[IFLA_MAX + 1], **tbp, *attr;
enum netkit_action policy_prim = NETKIT_PASS; enum netkit_action policy_prim = NETKIT_PASS;
enum netkit_action policy_peer = NETKIT_PASS; enum netkit_action policy_peer = NETKIT_PASS;
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *peer_net = params->net;
enum netkit_mode mode = NETKIT_L3; enum netkit_mode mode = NETKIT_L3;
unsigned char ifname_assign_type; unsigned char ifname_assign_type;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;

View File

@ -188,12 +188,12 @@ static int pfcp_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct pfcp_dev *pfcp = netdev_priv(dev); struct pfcp_dev *pfcp = netdev_priv(dev);
struct net *net = params->net;
struct pfcp_net *pn; struct pfcp_net *pn;
int err; int err;
pfcp->net = net; pfcp->net = link_net;
err = pfcp_add_sock(pfcp); err = pfcp_add_sock(pfcp);
if (err) { if (err) {
@ -207,7 +207,7 @@ static int pfcp_newlink(struct net_device *dev,
goto exit_del_pfcp_sock; goto exit_del_pfcp_sock;
} }
pn = net_generic(net, pfcp_net_id); pn = net_generic(link_net, pfcp_net_id);
list_add(&pfcp->list, &pn->pfcp_dev_list); list_add(&pfcp->list, &pn->pfcp_dev_list);
netdev_dbg(dev, "registered new PFCP interface\n"); netdev_dbg(dev, "registered new PFCP interface\n");

View File

@ -1307,8 +1307,8 @@ static int ppp_nl_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct ppp_config conf = { struct ppp_config conf = {
.unit = -1, .unit = -1,
@ -1346,7 +1346,7 @@ static int ppp_nl_newlink(struct net_device *dev,
if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME])) if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME]))
conf.ifname_is_set = false; conf.ifname_is_set = false;
err = ppp_dev_configure(src_net, dev, &conf); err = ppp_dev_configure(link_net, dev, &conf);
out_unlock: out_unlock:
mutex_unlock(&ppp_mutex); mutex_unlock(&ppp_mutex);

View File

@ -1769,8 +1769,8 @@ static int veth_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *peer_net = rtnl_newlink_peer_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *peer_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
int err; int err;
struct net_device *peer; struct net_device *peer;

View File

@ -4404,8 +4404,8 @@ static int vxlan_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct vxlan_config conf; struct vxlan_config conf;
int err; int err;
@ -4414,7 +4414,7 @@ static int vxlan_newlink(struct net_device *dev,
if (err) if (err)
return err; return err;
return __vxlan_dev_create(src_net, dev, &conf, extack); return __vxlan_dev_create(link_net, dev, &conf, extack);
} }
static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],

View File

@ -311,11 +311,11 @@ static int wg_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct wg_device *wg = netdev_priv(dev); struct wg_device *wg = netdev_priv(dev);
struct net *src_net = params->net;
int ret = -ENOMEM; int ret = -ENOMEM;
rcu_assign_pointer(wg->creating_net, src_net); rcu_assign_pointer(wg->creating_net, link_net);
init_rwsem(&wg->static_identity.lock); init_rwsem(&wg->static_identity.lock);
mutex_init(&wg->socket_update_lock); mutex_init(&wg->socket_update_lock);
mutex_init(&wg->device_update_lock); mutex_init(&wg->device_update_lock);

View File

@ -524,7 +524,7 @@ static int virt_wifi_newlink(struct net_device *dev,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct virt_wifi_netdev_priv *priv = netdev_priv(dev); struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
struct net *src_net = params->net; struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
int err; int err;
@ -534,7 +534,7 @@ static int virt_wifi_newlink(struct net_device *dev,
netif_carrier_off(dev); netif_carrier_off(dev);
priv->upperdev = dev; priv->upperdev = dev;
priv->lowerdev = __dev_get_by_index(src_net, priv->lowerdev = __dev_get_by_index(link_net,
nla_get_u32(tb[IFLA_LINK])); nla_get_u32(tb[IFLA_LINK]));
if (!priv->lowerdev) if (!priv->lowerdev)

View File

@ -1065,7 +1065,7 @@ static void wwan_create_default_link(struct wwan_device *wwandev,
struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1]; struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1];
struct nlattr *data[IFLA_WWAN_MAX + 1]; struct nlattr *data[IFLA_WWAN_MAX + 1];
struct rtnl_newlink_params params = { struct rtnl_newlink_params params = {
.net = &init_net, .src_net = &init_net,
.tb = tb, .tb = tb,
.data = data, .data = data,
}; };

View File

@ -88,6 +88,23 @@ struct rtnl_newlink_params {
struct nlattr **data; struct nlattr **data;
}; };
/* Get effective link netns from newlink params. Generally, this is link_net
* and falls back to src_net. But for compatibility, a driver may * choose to
* use dev_net(dev) instead.
*/
static inline struct net *rtnl_newlink_link_net(struct rtnl_newlink_params *p)
{
return p->link_net ? : p->src_net;
}
/* Get peer netns from newlink params. Fallback to link netns if peer netns is
* not specified explicitly.
*/
static inline struct net *rtnl_newlink_peer_net(struct rtnl_newlink_params *p)
{
return p->peer_net ? : rtnl_newlink_link_net(p);
}
/** /**
* struct rtnl_link_ops - rtnetlink link operations * struct rtnl_link_ops - rtnetlink link operations
* *

View File

@ -139,9 +139,9 @@ static int vlan_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct vlan_dev_priv *vlan = vlan_dev_priv(dev); struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
struct nlattr **tb = params->tb; struct nlattr **tb = params->tb;
struct net_device *real_dev; struct net_device *real_dev;
unsigned int max_mtu; unsigned int max_mtu;
@ -158,7 +158,7 @@ static int vlan_newlink(struct net_device *dev,
return -EINVAL; return -EINVAL;
} }
real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
if (!real_dev) { if (!real_dev) {
NL_SET_ERR_MSG_MOD(extack, "link does not exist"); NL_SET_ERR_MSG_MOD(extack, "link does not exist");
return -ENODEV; return -ENODEV;

View File

@ -33,8 +33,8 @@ static int hsr_newlink(struct net_device *dev,
struct rtnl_newlink_params *params, struct rtnl_newlink_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct net *link_net = rtnl_newlink_link_net(params);
struct nlattr **data = params->data; struct nlattr **data = params->data;
struct net *src_net = params->net;
enum hsr_version proto_version; enum hsr_version proto_version;
unsigned char multicast_spec; unsigned char multicast_spec;
u8 proto = HSR_PROTOCOL_HSR; u8 proto = HSR_PROTOCOL_HSR;
@ -48,7 +48,7 @@ static int hsr_newlink(struct net_device *dev,
NL_SET_ERR_MSG_MOD(extack, "Slave1 device not specified"); NL_SET_ERR_MSG_MOD(extack, "Slave1 device not specified");
return -EINVAL; return -EINVAL;
} }
link[0] = __dev_get_by_index(src_net, link[0] = __dev_get_by_index(link_net,
nla_get_u32(data[IFLA_HSR_SLAVE1])); nla_get_u32(data[IFLA_HSR_SLAVE1]));
if (!link[0]) { if (!link[0]) {
NL_SET_ERR_MSG_MOD(extack, "Slave1 does not exist"); NL_SET_ERR_MSG_MOD(extack, "Slave1 does not exist");
@ -58,7 +58,7 @@ static int hsr_newlink(struct net_device *dev,
NL_SET_ERR_MSG_MOD(extack, "Slave2 device not specified"); NL_SET_ERR_MSG_MOD(extack, "Slave2 device not specified");
return -EINVAL; return -EINVAL;
} }
link[1] = __dev_get_by_index(src_net, link[1] = __dev_get_by_index(link_net,
nla_get_u32(data[IFLA_HSR_SLAVE2])); nla_get_u32(data[IFLA_HSR_SLAVE2]));
if (!link[1]) { if (!link[1]) {
NL_SET_ERR_MSG_MOD(extack, "Slave2 does not exist"); NL_SET_ERR_MSG_MOD(extack, "Slave2 does not exist");
@ -71,7 +71,7 @@ static int hsr_newlink(struct net_device *dev,
} }
if (data[IFLA_HSR_INTERLINK]) if (data[IFLA_HSR_INTERLINK])
interlink = __dev_get_by_index(src_net, interlink = __dev_get_by_index(link_net,
nla_get_u32(data[IFLA_HSR_INTERLINK])); nla_get_u32(data[IFLA_HSR_INTERLINK]));
if (interlink && interlink == link[0]) { if (interlink && interlink == link[0]) {