extern int             inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
 extern int             devinet_ioctl(unsigned int cmd, void __user *);
 extern void            devinet_init(void);
-extern struct in_device        *inetdev_by_index(int);
+extern struct in_device        *inetdev_by_index(struct net *, int);
 extern __be32          inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
 extern __be32          inet_confirm_addr(struct in_device *in_dev, __be32 dst, __be32 local, int scope);
 extern struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, __be32 mask);
 
        return inet_insert_ifa(ifa);
 }
 
-struct in_device *inetdev_by_index(int ifindex)
+struct in_device *inetdev_by_index(struct net *net, int ifindex)
 {
        struct net_device *dev;
        struct in_device *in_dev = NULL;
        read_lock(&dev_base_lock);
-       dev = __dev_get_by_index(&init_net, ifindex);
+       dev = __dev_get_by_index(net, ifindex);
        if (dev)
                in_dev = in_dev_get(dev);
        read_unlock(&dev_base_lock);
                goto errout;
 
        ifm = nlmsg_data(nlh);
-       in_dev = inetdev_by_index(ifm->ifa_index);
+       in_dev = inetdev_by_index(net, ifm->ifa_index);
        if (in_dev == NULL) {
                err = -ENODEV;
                goto errout;
 
                if (nh->nh_flags&(RTNH_F_PERVASIVE|RTNH_F_ONLINK))
                        return -EINVAL;
 
-               in_dev = inetdev_by_index(nh->nh_oif);
+               in_dev = inetdev_by_index(&init_net, nh->nh_oif);
                if (in_dev == NULL)
                        return -ENODEV;
                if (!(in_dev->dev->flags&IFF_UP)) {
 
        struct in_device *idev = NULL;
 
        if (imr->imr_ifindex) {
-               idev = inetdev_by_index(imr->imr_ifindex);
+               idev = inetdev_by_index(&init_net, imr->imr_ifindex);
                if (idev)
                        __in_dev_put(idev);
                return idev;
                struct in_device *in_dev;
                inet->mc_list = iml->next;
 
-               in_dev = inetdev_by_index(iml->multi.imr_ifindex);
+               in_dev = inetdev_by_index(&init_net, iml->multi.imr_ifindex);
                (void) ip_mc_leave_src(sk, iml, in_dev);
                if (in_dev != NULL) {
                        ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr);
 
 {
        struct ip_tunnel *t = netdev_priv(dev);
        if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) {
-               struct in_device *in_dev = inetdev_by_index(t->mlink);
+               struct in_device *in_dev;
+               in_dev = inetdev_by_index(dev->nd_net, t->mlink);
                if (in_dev) {
                        ip_mc_dec_group(in_dev, t->parms.iph.daddr);
                        in_dev_put(in_dev);