Commit 4a7f7bc6 authored by Nicolas Dichtel's avatar Nicolas Dichtel Committed by David S. Miller

netns: define extack error msg for nsis cmds

It helps the user to identify errors.

CC: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d0417849
...@@ -596,6 +596,7 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -596,6 +596,7 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh,
{ {
struct net *net = sock_net(skb->sk); struct net *net = sock_net(skb->sk);
struct nlattr *tb[NETNSA_MAX + 1]; struct nlattr *tb[NETNSA_MAX + 1];
struct nlattr *nla;
struct net *peer; struct net *peer;
int nsid, err; int nsid, err;
...@@ -603,23 +604,35 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -603,23 +604,35 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh,
rtnl_net_policy, extack); rtnl_net_policy, extack);
if (err < 0) if (err < 0)
return err; return err;
if (!tb[NETNSA_NSID]) if (!tb[NETNSA_NSID]) {
NL_SET_ERR_MSG(extack, "nsid is missing");
return -EINVAL; return -EINVAL;
}
nsid = nla_get_s32(tb[NETNSA_NSID]); nsid = nla_get_s32(tb[NETNSA_NSID]);
if (tb[NETNSA_PID]) if (tb[NETNSA_PID]) {
peer = get_net_ns_by_pid(nla_get_u32(tb[NETNSA_PID])); peer = get_net_ns_by_pid(nla_get_u32(tb[NETNSA_PID]));
else if (tb[NETNSA_FD]) nla = tb[NETNSA_PID];
} else if (tb[NETNSA_FD]) {
peer = get_net_ns_by_fd(nla_get_u32(tb[NETNSA_FD])); peer = get_net_ns_by_fd(nla_get_u32(tb[NETNSA_FD]));
else nla = tb[NETNSA_FD];
} else {
NL_SET_ERR_MSG(extack, "Peer netns reference is missing");
return -EINVAL; return -EINVAL;
if (IS_ERR(peer)) }
if (IS_ERR(peer)) {
NL_SET_BAD_ATTR(extack, nla);
NL_SET_ERR_MSG(extack, "Peer netns reference is invalid");
return PTR_ERR(peer); return PTR_ERR(peer);
}
spin_lock_bh(&net->nsid_lock); spin_lock_bh(&net->nsid_lock);
if (__peernet2id(net, peer) >= 0) { if (__peernet2id(net, peer) >= 0) {
spin_unlock_bh(&net->nsid_lock); spin_unlock_bh(&net->nsid_lock);
err = -EEXIST; err = -EEXIST;
NL_SET_BAD_ATTR(extack, nla);
NL_SET_ERR_MSG(extack,
"Peer netns already has a nsid assigned");
goto out; goto out;
} }
...@@ -628,6 +641,9 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -628,6 +641,9 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh,
if (err >= 0) { if (err >= 0) {
rtnl_net_notifyid(net, RTM_NEWNSID, err); rtnl_net_notifyid(net, RTM_NEWNSID, err);
err = 0; err = 0;
} else if (err == -ENOSPC && nsid >= 0) {
NL_SET_BAD_ATTR(extack, tb[NETNSA_NSID]);
NL_SET_ERR_MSG(extack, "The specified nsid is already used");
} }
out: out:
put_net(peer); put_net(peer);
...@@ -670,6 +686,7 @@ static int rtnl_net_getid(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -670,6 +686,7 @@ static int rtnl_net_getid(struct sk_buff *skb, struct nlmsghdr *nlh,
{ {
struct net *net = sock_net(skb->sk); struct net *net = sock_net(skb->sk);
struct nlattr *tb[NETNSA_MAX + 1]; struct nlattr *tb[NETNSA_MAX + 1];
struct nlattr *nla;
struct sk_buff *msg; struct sk_buff *msg;
struct net *peer; struct net *peer;
int err, id; int err, id;
...@@ -678,15 +695,22 @@ static int rtnl_net_getid(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -678,15 +695,22 @@ static int rtnl_net_getid(struct sk_buff *skb, struct nlmsghdr *nlh,
rtnl_net_policy, extack); rtnl_net_policy, extack);
if (err < 0) if (err < 0)
return err; return err;
if (tb[NETNSA_PID]) if (tb[NETNSA_PID]) {
peer = get_net_ns_by_pid(nla_get_u32(tb[NETNSA_PID])); peer = get_net_ns_by_pid(nla_get_u32(tb[NETNSA_PID]));
else if (tb[NETNSA_FD]) nla = tb[NETNSA_PID];
} else if (tb[NETNSA_FD]) {
peer = get_net_ns_by_fd(nla_get_u32(tb[NETNSA_FD])); peer = get_net_ns_by_fd(nla_get_u32(tb[NETNSA_FD]));
else nla = tb[NETNSA_FD];
} else {
NL_SET_ERR_MSG(extack, "Peer netns reference is missing");
return -EINVAL; return -EINVAL;
}
if (IS_ERR(peer)) if (IS_ERR(peer)) {
NL_SET_BAD_ATTR(extack, nla);
NL_SET_ERR_MSG(extack, "Peer netns reference is invalid");
return PTR_ERR(peer); return PTR_ERR(peer);
}
msg = nlmsg_new(rtnl_net_get_size(), GFP_KERNEL); msg = nlmsg_new(rtnl_net_get_size(), GFP_KERNEL);
if (!msg) { if (!msg) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment