]> err.no Git - linux-2.6/commitdiff
[NETNS]: Process devinet ioctl in the correct namespace.
authorDenis V. Lunev <den@openvz.org>
Fri, 29 Feb 2008 04:51:43 +0000 (20:51 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 29 Feb 2008 04:51:43 +0000 (20:51 -0800)
Add namespace parameter to devinet_ioctl and locate device inside it for
state changes.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/inetdevice.h
net/ipv4/af_inet.c
net/ipv4/devinet.c
net/ipv4/ipconfig.c

index fc4e3db649e895eaa4d82d1f37af40170166100a..da05ab47ff2f51767ebffebc7e356cbf720477d6 100644 (file)
@@ -129,7 +129,7 @@ extern int unregister_inetaddr_notifier(struct notifier_block *nb);
 
 extern struct net_device *ip_dev_find(struct net *net, __be32 addr);
 extern int             inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
-extern int             devinet_ioctl(unsigned int cmd, void __user *);
+extern int             devinet_ioctl(struct net *net, unsigned int cmd, void __user *);
 extern void            devinet_init(void);
 extern struct in_device        *inetdev_by_index(struct net *, int);
 extern __be32          inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
index 09ca5293d08f3c354ad85cea31ddbb9f75c4c4db..c270080f370e5d5bd17b08002fdb8e3fc3e0fccc 100644 (file)
@@ -784,6 +784,7 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
        int err = 0;
+       struct net *net = sk->sk_net;
 
        switch (cmd) {
                case SIOCGSTAMP:
@@ -795,12 +796,12 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                case SIOCADDRT:
                case SIOCDELRT:
                case SIOCRTMSG:
-                       err = ip_rt_ioctl(sk->sk_net, cmd, (void __user *)arg);
+                       err = ip_rt_ioctl(net, cmd, (void __user *)arg);
                        break;
                case SIOCDARP:
                case SIOCGARP:
                case SIOCSARP:
-                       err = arp_ioctl(sk->sk_net, cmd, (void __user *)arg);
+                       err = arp_ioctl(net, cmd, (void __user *)arg);
                        break;
                case SIOCGIFADDR:
                case SIOCSIFADDR:
@@ -813,7 +814,7 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                case SIOCSIFPFLAGS:
                case SIOCGIFPFLAGS:
                case SIOCSIFFLAGS:
-                       err = devinet_ioctl(cmd, (void __user *)arg);
+                       err = devinet_ioctl(net, cmd, (void __user *)arg);
                        break;
                default:
                        if (sk->sk_prot->ioctl)
index 90210a74d6383579632ff9c96b3c585ed1b735a5..af752fc5d0abad9129b6b709e4e999a69a9387ff 100644 (file)
@@ -595,7 +595,7 @@ static __inline__ int inet_abc_len(__be32 addr)
 }
 
 
-int devinet_ioctl(unsigned int cmd, void __user *arg)
+int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
 {
        struct ifreq ifr;
        struct sockaddr_in sin_orig;
@@ -624,7 +624,7 @@ int devinet_ioctl(unsigned int cmd, void __user *arg)
                *colon = 0;
 
 #ifdef CONFIG_KMOD
-       dev_load(&init_net, ifr.ifr_name);
+       dev_load(net, ifr.ifr_name);
 #endif
 
        switch (cmd) {
@@ -665,7 +665,7 @@ int devinet_ioctl(unsigned int cmd, void __user *arg)
        rtnl_lock();
 
        ret = -ENODEV;
-       if ((dev = __dev_get_by_name(&init_net, ifr.ifr_name)) == NULL)
+       if ((dev = __dev_get_by_name(net, ifr.ifr_name)) == NULL)
                goto done;
 
        if (colon)
index 10013ccee8dd92c0939b2ef1e06678ffc272efe1..c90e75a66e812c902ab69f15a4547dd7979effcf 100644 (file)
@@ -291,7 +291,7 @@ static int __init ic_dev_ioctl(unsigned int cmd, struct ifreq *arg)
 
        mm_segment_t oldfs = get_fs();
        set_fs(get_ds());
-       res = devinet_ioctl(cmd, (struct ifreq __user *) arg);
+       res = devinet_ioctl(&init_net, cmd, (struct ifreq __user *) arg);
        set_fs(oldfs);
        return res;
 }