#define VLAN_GROUP_ARRAY_PART_LEN     (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS)
 
 struct vlan_group {
-       int real_dev_ifindex; /* The ifindex of the ethernet(like) device the vlan is attached to. */
+       struct net_device       *real_dev; /* The ethernet(like) device
+                                           * the vlan is attached to.
+                                           */
        unsigned int            nr_vlans;
        struct hlist_node       hlist;  /* linked list */
        struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS];
 
 }
 
 /* Must be invoked with RCU read lock (no preempt) */
-static struct vlan_group *__vlan_find_group(int real_dev_ifindex)
+static struct vlan_group *__vlan_find_group(struct net_device *real_dev)
 {
        struct vlan_group *grp;
        struct hlist_node *n;
-       int hash = vlan_grp_hashfn(real_dev_ifindex);
+       int hash = vlan_grp_hashfn(real_dev->ifindex);
 
        hlist_for_each_entry_rcu(grp, n, &vlan_group_hash[hash], hlist) {
-               if (grp->real_dev_ifindex == real_dev_ifindex)
+               if (grp->real_dev == real_dev)
                        return grp;
        }
 
 struct net_device *__find_vlan_dev(struct net_device *real_dev,
                                   unsigned short VID)
 {
-       struct vlan_group *grp = __vlan_find_group(real_dev->ifindex);
+       struct vlan_group *grp = __vlan_find_group(real_dev);
 
        if (grp)
                return vlan_group_get_device(grp, VID);
        kfree(grp);
 }
 
-static struct vlan_group *vlan_group_alloc(int ifindex)
+static struct vlan_group *vlan_group_alloc(struct net_device *real_dev)
 {
        struct vlan_group *grp;
 
        if (!grp)
                return NULL;
 
-       grp->real_dev_ifindex = ifindex;
+       grp->real_dev = real_dev;
        hlist_add_head_rcu(&grp->hlist,
-                          &vlan_group_hash[vlan_grp_hashfn(ifindex)]);
+                       &vlan_group_hash[vlan_grp_hashfn(real_dev->ifindex)]);
        return grp;
 }
 
 
        ASSERT_RTNL();
 
-       grp = __vlan_find_group(real_dev->ifindex);
+       grp = __vlan_find_group(real_dev);
        BUG_ON(!grp);
 
        vlan_proc_rem_dev(dev);
        struct vlan_group *grp, *ngrp = NULL;
        int err;
 
-       grp = __vlan_find_group(real_dev->ifindex);
+       grp = __vlan_find_group(real_dev);
        if (!grp) {
-               ngrp = grp = vlan_group_alloc(real_dev->ifindex);
+               ngrp = grp = vlan_group_alloc(real_dev);
                if (!grp)
                        return -ENOBUFS;
        }
                goto out;
        }
 
-       grp = __vlan_find_group(dev->ifindex);
+       grp = __vlan_find_group(dev);
        if (!grp)
                goto out;