Comment 5 for bug 1235162

Revision history for this message
TJ (tj) wrote : Re: Persistent net names via /etc/udev/rules.d/70-persistent-net.rules are ignored

Following "ioctl(sk, SIOCSIFNAME, &ifr)" through the kernel:

net/core/dev_ioctl::dev_ioctl()
 net/core/dev_ioctl.c::dev_ifsioc()
  net/core/dev.c::dev_change_name()
   net/core/dev.c::dev_get_valid_name()
    net/core/dev.c::__dev_get_by_name()

struct net_device *dev_get_by_name_rcu(struct net *net, const char *name)
{
        struct net_device *dev;
        struct hlist_head *head = dev_name_hash(net, name);

        hlist_for_each_entry_rcu(dev, head, name_hlist)
                if (!strncmp(dev->name, name, IFNAMSIZ))
                        return dev;

        return NULL;
}

static int dev_get_valid_name(struct net *net,
                              struct net_device *dev,
                              const char *name)
{
        BUG_ON(!net);

        if (!dev_valid_name(name))
                return -EINVAL;

        if (strchr(name, '%'))
                return dev_alloc_name_ns(net, dev, name);
        else if (__dev_get_by_name(net, name))
                return -EEXIST;
        else if (dev->name != name)
                strlcpy(dev->name, name, IFNAMSIZ);

        return 0;
}

So this seems to be where the IOCTL error originates, but there needs to be an explanation.

Looking at the 'git damage' and commit history for 'net/core/dev.c' in particular there are some control-group related changes that look like they may be implicated. They certainly seem to be in the appropriate time-frame since earlier kernels don't have the problem (I have another server with 12.04 LTS and Linux 3.2.0 which has 10 Ethernet ports which are renamed correctly).