diff options
author | David Ahern <dsahern@gmail.com> | 2018-11-06 15:51:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-11-06 18:00:45 -0500 |
commit | d0522f1cd25edb796548f91e04766fa3cbc3b6df (patch) | |
tree | c07c462baadbfd79808e28ae824626fda989507f | |
parent | 0b215b9798640a542c526e3ae69dee83861a4aee (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.c | 2 | ||||
-rw-r--r-- | drivers/net/geneve.c | 2 | ||||
-rw-r--r-- | drivers/net/veth.c | 2 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 2 | ||||
-rw-r--r-- | include/net/rtnetlink.h | 3 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 18 | ||||
-rw-r--r-- | net/ipv4/ip_gre.c | 2 |
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[]); | |||
159 | struct net_device *rtnl_create_link(struct net *net, const char *ifname, | 159 | struct 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); | ||
163 | int rtnl_delete_link(struct net_device *dev); | 164 | int rtnl_delete_link(struct net_device *dev); |
164 | int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); | 165 | int 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 | } |
2886 | EXPORT_SYMBOL(rtnl_configure_link); | 2886 | EXPORT_SYMBOL(rtnl_configure_link); |
2887 | 2887 | ||
2888 | struct net_device *rtnl_create_link(struct net *net, | 2888 | struct 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 | ||