diff options
author | Shmulik Ravid <shmulikr@broadcom.com> | 2011-01-03 08:04:59 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-01-03 12:12:11 -0800 |
commit | 7f891cf1fc0d5d5c5b359caec77e5383e1d55986 (patch) | |
tree | 58efa7cd0579cef739d04200eebc09cf3facbf6a | |
parent | 87e609760b5304ef0c0c53cf4d0b29fde9812e1b (diff) |
dcbnl: more informed return values for new dcbnl routines
More accurate return values for the following (new) dcbnl routines:
dcbnl_getdcbx()
dcbnl_setdcbx()
dcbnl_getfeatcfg()
dcbnl_setfeatcfg()
Signed-off-by: Shmulik Ravid <shmulikr@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/dcb/dcbnl.c | 81 |
1 files changed, 37 insertions, 44 deletions
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index ff3c12d2cd72..9399af565715 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c @@ -1286,10 +1286,10 @@ nlmsg_failure: static int dcbnl_getdcbx(struct net_device *netdev, struct nlattr **tb, u32 pid, u32 seq, u16 flags) { - int ret = -EINVAL; + int ret; if (!netdev->dcbnl_ops->getdcbx) - return ret; + return -EOPNOTSUPP; ret = dcbnl_reply(netdev->dcbnl_ops->getdcbx(netdev), RTM_GETDCB, DCB_CMD_GDCBX, DCB_ATTR_DCBX, pid, seq, flags); @@ -1300,11 +1300,14 @@ static int dcbnl_getdcbx(struct net_device *netdev, struct nlattr **tb, static int dcbnl_setdcbx(struct net_device *netdev, struct nlattr **tb, u32 pid, u32 seq, u16 flags) { - int ret = -EINVAL; + int ret; u8 value; - if (!tb[DCB_ATTR_DCBX] || !netdev->dcbnl_ops->setdcbx) - return ret; + if (!netdev->dcbnl_ops->setdcbx) + return -EOPNOTSUPP; + + if (!tb[DCB_ATTR_DCBX]) + return -EINVAL; value = nla_get_u8(tb[DCB_ATTR_DCBX]); @@ -1323,23 +1326,23 @@ static int dcbnl_getfeatcfg(struct net_device *netdev, struct nlattr **tb, struct dcbmsg *dcb; struct nlattr *data[DCB_FEATCFG_ATTR_MAX + 1], *nest; u8 value; - int ret = -EINVAL; - int i; + int ret, i; int getall = 0; - if (!tb[DCB_ATTR_FEATCFG] || !netdev->dcbnl_ops->getfeatcfg) - return ret; + if (!netdev->dcbnl_ops->getfeatcfg) + return -EOPNOTSUPP; + + if (!tb[DCB_ATTR_FEATCFG]) + return -EINVAL; ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX, tb[DCB_ATTR_FEATCFG], dcbnl_featcfg_nest); - if (ret) { - ret = -EINVAL; + if (ret) goto err_out; - } dcbnl_skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); if (!dcbnl_skb) { - ret = -EINVAL; + ret = -ENOBUFS; goto err_out; } @@ -1351,8 +1354,8 @@ static int dcbnl_getfeatcfg(struct net_device *netdev, struct nlattr **tb, nest = nla_nest_start(dcbnl_skb, DCB_ATTR_FEATCFG); if (!nest) { - ret = -EINVAL; - goto err; + ret = -EMSGSIZE; + goto nla_put_failure; } if (data[DCB_FEATCFG_ATTR_ALL]) @@ -1363,30 +1366,22 @@ static int dcbnl_getfeatcfg(struct net_device *netdev, struct nlattr **tb, continue; ret = netdev->dcbnl_ops->getfeatcfg(netdev, i, &value); - if (!ret) { + if (!ret) ret = nla_put_u8(dcbnl_skb, i, value); - if (ret) { - nla_nest_cancel(dcbnl_skb, nest); - ret = -EINVAL; - goto err; - } - } else - goto err; + if (ret) { + nla_nest_cancel(dcbnl_skb, nest); + goto nla_put_failure; + } } nla_nest_end(dcbnl_skb, nest); nlmsg_end(dcbnl_skb, nlh); - ret = rtnl_unicast(dcbnl_skb, &init_net, pid); - if (ret) { - ret = -EINVAL; - goto err_out; - } - - return 0; + return rtnl_unicast(dcbnl_skb, &init_net, pid); +nla_put_failure: + nlmsg_cancel(dcbnl_skb, nlh); nlmsg_failure: -err: kfree_skb(dcbnl_skb); err_out: return ret; @@ -1396,20 +1391,20 @@ static int dcbnl_setfeatcfg(struct net_device *netdev, struct nlattr **tb, u32 pid, u32 seq, u16 flags) { struct nlattr *data[DCB_FEATCFG_ATTR_MAX + 1]; - int ret = -EINVAL; + int ret, i; u8 value; - int i; - if (!tb[DCB_ATTR_FEATCFG] || !netdev->dcbnl_ops->setfeatcfg) - return ret; + if (!netdev->dcbnl_ops->setfeatcfg) + return -ENOTSUPP; + + if (!tb[DCB_ATTR_FEATCFG]) + return -EINVAL; ret = nla_parse_nested(data, DCB_FEATCFG_ATTR_MAX, tb[DCB_ATTR_FEATCFG], dcbnl_featcfg_nest); - if (ret) { - ret = -EINVAL; + if (ret) goto err; - } for (i = DCB_FEATCFG_ATTR_ALL+1; i <= DCB_FEATCFG_ATTR_MAX; i++) { if (data[i] == NULL) @@ -1420,14 +1415,12 @@ static int dcbnl_setfeatcfg(struct net_device *netdev, struct nlattr **tb, ret = netdev->dcbnl_ops->setfeatcfg(netdev, i, value); if (ret) - goto operr; + goto err; } - -operr: - ret = dcbnl_reply(!!ret, RTM_SETDCB, DCB_CMD_SFEATCFG, - DCB_ATTR_FEATCFG, pid, seq, flags); - err: + dcbnl_reply(ret, RTM_SETDCB, DCB_CMD_SFEATCFG, DCB_ATTR_FEATCFG, + pid, seq, flags); + return ret; } |