err = -EINVAL;
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
-               dev = dev_get_by_index(net, ifm->ifi_index);
+               dev = __dev_get_by_index(net, ifm->ifi_index);
        else if (tb[IFLA_IFNAME])
-               dev = dev_get_by_name(net, ifname);
+               dev = __dev_get_by_name(net, ifname);
        else
                goto errout;
 
        }
 
        if ((err = validate_linkmsg(dev, tb)) < 0)
-               goto errout_dev;
+               goto errout;
 
        err = do_setlink(dev, ifm, tb, ifname, 0);
-errout_dev:
-       dev_put(dev);
 errout:
        return err;
 }
 {
        struct net *net = sock_net(skb->sk);
        struct ifinfomsg *ifm;
+       char ifname[IFNAMSIZ];
        struct nlattr *tb[IFLA_MAX+1];
        struct net_device *dev = NULL;
        struct sk_buff *nskb;
        if (err < 0)
                return err;
 
+       if (tb[IFLA_IFNAME])
+               nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
+
        ifm = nlmsg_data(nlh);
-       if (ifm->ifi_index > 0) {
-               dev = dev_get_by_index(net, ifm->ifi_index);
-               if (dev == NULL)
-                       return -ENODEV;
-       } else
+       if (ifm->ifi_index > 0)
+               dev = __dev_get_by_index(net, ifm->ifi_index);
+       else if (tb[IFLA_IFNAME])
+               dev = __dev_get_by_name(net, ifname);
+       else
                return -EINVAL;
 
+       if (dev == NULL)
+               return -ENODEV;
+
        nskb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL);
-       if (nskb == NULL) {
-               err = -ENOBUFS;
-               goto errout;
-       }
+       if (nskb == NULL)
+               return -ENOBUFS;
 
        err = rtnl_fill_ifinfo(nskb, dev, RTM_NEWLINK, NETLINK_CB(skb).pid,
                               nlh->nlmsg_seq, 0, 0);
                /* -EMSGSIZE implies BUG in if_nlmsg_size */
                WARN_ON(err == -EMSGSIZE);
                kfree_skb(nskb);
-               goto errout;
-       }
-       err = rtnl_unicast(nskb, net, NETLINK_CB(skb).pid);
-errout:
-       dev_put(dev);
+       } else
+               err = rtnl_unicast(nskb, net, NETLINK_CB(skb).pid);
 
        return err;
 }