dcb: use __dev_get_by_name instead of dev_get_by_name to find interface

The following call chain indicates that dcb_doit() is protected
under rtnl_lock. So if we use __dev_get_by_name() instead of
dev_get_by_name() to find interface handlers in it, this would
help us avoid to change interface reference counter.

rtnetlink_rcv()
  rtnl_lock()
  netlink_rcv_skb()
    dcb_doit()
  rtnl_unlock()

Cc: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ying Xue 2014-01-15 10:23:39 +08:00 committed by David S. Miller
parent ebd93a7daf
commit d9ac62be57

View File

@ -1688,21 +1688,17 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh)
if (!tb[DCB_ATTR_IFNAME]) if (!tb[DCB_ATTR_IFNAME])
return -EINVAL; return -EINVAL;
netdev = dev_get_by_name(net, nla_data(tb[DCB_ATTR_IFNAME])); netdev = __dev_get_by_name(net, nla_data(tb[DCB_ATTR_IFNAME]));
if (!netdev) if (!netdev)
return -ENODEV; return -ENODEV;
if (!netdev->dcbnl_ops) { if (!netdev->dcbnl_ops)
ret = -EOPNOTSUPP; return -EOPNOTSUPP;
goto out;
}
reply_skb = dcbnl_newmsg(fn->type, dcb->cmd, portid, nlh->nlmsg_seq, reply_skb = dcbnl_newmsg(fn->type, dcb->cmd, portid, nlh->nlmsg_seq,
nlh->nlmsg_flags, &reply_nlh); nlh->nlmsg_flags, &reply_nlh);
if (!reply_skb) { if (!reply_skb)
ret = -ENOBUFS; return -ENOBUFS;
goto out;
}
ret = fn->cb(netdev, nlh, nlh->nlmsg_seq, tb, reply_skb); ret = fn->cb(netdev, nlh, nlh->nlmsg_seq, tb, reply_skb);
if (ret < 0) { if (ret < 0) {
@ -1714,7 +1710,6 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh)
ret = rtnl_unicast(reply_skb, net, portid); ret = rtnl_unicast(reply_skb, net, portid);
out: out:
dev_put(netdev);
return ret; return ret;
} }