struct ifinfomsg *ifm;
        char ifname[IFNAMSIZ];
        struct nlattr **data;
+       bool link_specified;
        int err;
 
 #ifdef CONFIG_MODULES
                ifname[0] = '\0';
 
        ifm = nlmsg_data(nlh);
-       if (ifm->ifi_index > 0)
+       if (ifm->ifi_index > 0) {
+               link_specified = true;
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+       } else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) {
+               link_specified = true;
                dev = rtnl_dev_get(net, NULL, tb[IFLA_ALT_IFNAME], ifname);
-       else
+       } else {
+               link_specified = false;
                dev = NULL;
+       }
 
        master_dev = NULL;
        m_ops = NULL;
        }
 
        if (!(nlh->nlmsg_flags & NLM_F_CREATE)) {
-               if (ifm->ifi_index == 0 && tb[IFLA_GROUP])
+               /* No dev found and NLM_F_CREATE not set. Requested dev does not exist,
+                * or it's for a group
+               */
+               if (link_specified)
+                       return -ENODEV;
+               if (tb[IFLA_GROUP])
                        return rtnl_group_changelink(skb, net,
                                                nla_get_u32(tb[IFLA_GROUP]),
                                                ifm, extack, tb);