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: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
d041784915
commit
4a7f7bc600
@@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user