summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ahern <dsahern@gmail.com>2018-11-06 15:51:14 -0500
committerDavid S. Miller <davem@davemloft.net>2018-11-06 18:00:45 -0500
commitd0522f1cd25edb796548f91e04766fa3cbc3b6df (patch)
treec07c462baadbfd79808e28ae824626fda989507f
parent0b215b9798640a542c526e3ae69dee83861a4aee (diff)
net: Add extack argument to rtnl_create_link
Add extack arg to rtnl_create_link and add messages for invalid number of Tx or Rx queues. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/can/vxcan.c2
-rw-r--r--drivers/net/geneve.c2
-rw-r--r--drivers/net/veth.c2
-rw-r--r--drivers/net/vxlan.c2
-rw-r--r--include/net/rtnetlink.h3
-rw-r--r--net/core/rtnetlink.c18
-rw-r--r--net/ipv4/ip_gre.c2
7 files changed, 19 insertions, 12 deletions
diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c
index ed6828821fbd..80af658e530d 100644
--- a/drivers/net/can/vxcan.c
+++ b/drivers/net/can/vxcan.c
@@ -207,7 +207,7 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,
207 return PTR_ERR(peer_net); 207 return PTR_ERR(peer_net);
208 208
209 peer = rtnl_create_link(peer_net, ifname, name_assign_type, 209 peer = rtnl_create_link(peer_net, ifname, name_assign_type,
210 &vxcan_link_ops, tbp); 210 &vxcan_link_ops, tbp, extack);
211 if (IS_ERR(peer)) { 211 if (IS_ERR(peer)) {
212 put_net(peer_net); 212 put_net(peer_net);
213 return PTR_ERR(peer); 213 return PTR_ERR(peer);
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index a0cd1c41cf5f..fbfc13d81f66 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -1666,7 +1666,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
1666 1666
1667 memset(tb, 0, sizeof(tb)); 1667 memset(tb, 0, sizeof(tb));
1668 dev = rtnl_create_link(net, name, name_assign_type, 1668 dev = rtnl_create_link(net, name, name_assign_type,
1669 &geneve_link_ops, tb); 1669 &geneve_link_ops, tb, NULL);
1670 if (IS_ERR(dev)) 1670 if (IS_ERR(dev))
1671 return dev; 1671 return dev;
1672 1672
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index 890fa5b905e2..f412ea1cef18 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -1253,7 +1253,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
1253 return PTR_ERR(net); 1253 return PTR_ERR(net);
1254 1254
1255 peer = rtnl_create_link(net, ifname, name_assign_type, 1255 peer = rtnl_create_link(net, ifname, name_assign_type,
1256 &veth_link_ops, tbp); 1256 &veth_link_ops, tbp, extack);
1257 if (IS_ERR(peer)) { 1257 if (IS_ERR(peer)) {
1258 put_net(net); 1258 put_net(net);
1259 return PTR_ERR(peer); 1259 return PTR_ERR(peer);
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 297cdeaef479..ae969f806d56 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -3749,7 +3749,7 @@ struct net_device *vxlan_dev_create(struct net *net, const char *name,
3749 memset(&tb, 0, sizeof(tb)); 3749 memset(&tb, 0, sizeof(tb));
3750 3750
3751 dev = rtnl_create_link(net, name, name_assign_type, 3751 dev = rtnl_create_link(net, name, name_assign_type,
3752 &vxlan_link_ops, tb); 3752 &vxlan_link_ops, tb, NULL);
3753 if (IS_ERR(dev)) 3753 if (IS_ERR(dev))
3754 return dev; 3754 return dev;
3755 3755
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
index cf26e5aacac4..e2091bb2b3a8 100644
--- a/include/net/rtnetlink.h
+++ b/include/net/rtnetlink.h
@@ -159,7 +159,8 @@ struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]);
159struct net_device *rtnl_create_link(struct net *net, const char *ifname, 159struct net_device *rtnl_create_link(struct net *net, const char *ifname,
160 unsigned char name_assign_type, 160 unsigned char name_assign_type,
161 const struct rtnl_link_ops *ops, 161 const struct rtnl_link_ops *ops,
162 struct nlattr *tb[]); 162 struct nlattr *tb[],
163 struct netlink_ext_ack *extack);
163int rtnl_delete_link(struct net_device *dev); 164int rtnl_delete_link(struct net_device *dev);
164int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); 165int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm);
165 166
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 33d9227a8b80..f787b7640d49 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2885,9 +2885,11 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm)
2885} 2885}
2886EXPORT_SYMBOL(rtnl_configure_link); 2886EXPORT_SYMBOL(rtnl_configure_link);
2887 2887
2888struct net_device *rtnl_create_link(struct net *net, 2888struct net_device *rtnl_create_link(struct net *net, const char *ifname,
2889 const char *ifname, unsigned char name_assign_type, 2889 unsigned char name_assign_type,
2890 const struct rtnl_link_ops *ops, struct nlattr *tb[]) 2890 const struct rtnl_link_ops *ops,
2891 struct nlattr *tb[],
2892 struct netlink_ext_ack *extack)
2891{ 2893{
2892 struct net_device *dev; 2894 struct net_device *dev;
2893 unsigned int num_tx_queues = 1; 2895 unsigned int num_tx_queues = 1;
@@ -2903,11 +2905,15 @@ struct net_device *rtnl_create_link(struct net *net,
2903 else if (ops->get_num_rx_queues) 2905 else if (ops->get_num_rx_queues)
2904 num_rx_queues = ops->get_num_rx_queues(); 2906 num_rx_queues = ops->get_num_rx_queues();
2905 2907
2906 if (num_tx_queues < 1 || num_tx_queues > 4096) 2908 if (num_tx_queues < 1 || num_tx_queues > 4096) {
2909 NL_SET_ERR_MSG(extack, "Invalid number of transmit queues");
2907 return ERR_PTR(-EINVAL); 2910 return ERR_PTR(-EINVAL);
2911 }
2908 2912
2909 if (num_rx_queues < 1 || num_rx_queues > 4096) 2913 if (num_rx_queues < 1 || num_rx_queues > 4096) {
2914 NL_SET_ERR_MSG(extack, "Invalid number of receive queues");
2910 return ERR_PTR(-EINVAL); 2915 return ERR_PTR(-EINVAL);
2916 }
2911 2917
2912 dev = alloc_netdev_mqs(ops->priv_size, ifname, name_assign_type, 2918 dev = alloc_netdev_mqs(ops->priv_size, ifname, name_assign_type,
2913 ops->setup, num_tx_queues, num_rx_queues); 2919 ops->setup, num_tx_queues, num_rx_queues);
@@ -3163,7 +3169,7 @@ replay:
3163 } 3169 }
3164 3170
3165 dev = rtnl_create_link(link_net ? : dest_net, ifname, 3171 dev = rtnl_create_link(link_net ? : dest_net, ifname,
3166 name_assign_type, ops, tb); 3172 name_assign_type, ops, tb, extack);
3167 if (IS_ERR(dev)) { 3173 if (IS_ERR(dev)) {
3168 err = PTR_ERR(dev); 3174 err = PTR_ERR(dev);
3169 goto out; 3175 goto out;
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 38befe829caf..2c67af644e64 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -1601,7 +1601,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1601 memset(&tb, 0, sizeof(tb)); 1601 memset(&tb, 0, sizeof(tb));
1602 1602
1603 dev = rtnl_create_link(net, name, name_assign_type, 1603 dev = rtnl_create_link(net, name, name_assign_type,
1604 &ipgre_tap_ops, tb); 1604 &ipgre_tap_ops, tb, NULL);
1605 if (IS_ERR(dev)) 1605 if (IS_ERR(dev))
1606 return dev; 1606 return dev;
1607 1607