diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/ipmr.c | 25 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 13 |
2 files changed, 26 insertions, 12 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 05ed336f798a..ed372f3983e5 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -124,8 +124,8 @@ static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v) | |||
124 | 124 | ||
125 | dev = __dev_get_by_name(&init_net, "tunl0"); | 125 | dev = __dev_get_by_name(&init_net, "tunl0"); |
126 | if (dev) { | 126 | if (dev) { |
127 | const struct net_device_ops *ops = dev->netdev_ops; | ||
127 | struct ifreq ifr; | 128 | struct ifreq ifr; |
128 | mm_segment_t oldfs; | ||
129 | struct ip_tunnel_parm p; | 129 | struct ip_tunnel_parm p; |
130 | 130 | ||
131 | memset(&p, 0, sizeof(p)); | 131 | memset(&p, 0, sizeof(p)); |
@@ -137,9 +137,13 @@ static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v) | |||
137 | sprintf(p.name, "dvmrp%d", v->vifc_vifi); | 137 | sprintf(p.name, "dvmrp%d", v->vifc_vifi); |
138 | ifr.ifr_ifru.ifru_data = (__force void __user *)&p; | 138 | ifr.ifr_ifru.ifru_data = (__force void __user *)&p; |
139 | 139 | ||
140 | oldfs = get_fs(); set_fs(KERNEL_DS); | 140 | if (ops->ndo_do_ioctl) { |
141 | dev->do_ioctl(dev, &ifr, SIOCDELTUNNEL); | 141 | mm_segment_t oldfs = get_fs(); |
142 | set_fs(oldfs); | 142 | |
143 | set_fs(KERNEL_DS); | ||
144 | ops->ndo_do_ioctl(dev, &ifr, SIOCDELTUNNEL); | ||
145 | set_fs(oldfs); | ||
146 | } | ||
143 | } | 147 | } |
144 | } | 148 | } |
145 | 149 | ||
@@ -151,9 +155,9 @@ struct net_device *ipmr_new_tunnel(struct vifctl *v) | |||
151 | dev = __dev_get_by_name(&init_net, "tunl0"); | 155 | dev = __dev_get_by_name(&init_net, "tunl0"); |
152 | 156 | ||
153 | if (dev) { | 157 | if (dev) { |
158 | const struct net_device_ops *ops = dev->netdev_ops; | ||
154 | int err; | 159 | int err; |
155 | struct ifreq ifr; | 160 | struct ifreq ifr; |
156 | mm_segment_t oldfs; | ||
157 | struct ip_tunnel_parm p; | 161 | struct ip_tunnel_parm p; |
158 | struct in_device *in_dev; | 162 | struct in_device *in_dev; |
159 | 163 | ||
@@ -166,9 +170,14 @@ struct net_device *ipmr_new_tunnel(struct vifctl *v) | |||
166 | sprintf(p.name, "dvmrp%d", v->vifc_vifi); | 170 | sprintf(p.name, "dvmrp%d", v->vifc_vifi); |
167 | ifr.ifr_ifru.ifru_data = (__force void __user *)&p; | 171 | ifr.ifr_ifru.ifru_data = (__force void __user *)&p; |
168 | 172 | ||
169 | oldfs = get_fs(); set_fs(KERNEL_DS); | 173 | if (ops->ndo_do_ioctl) { |
170 | err = dev->do_ioctl(dev, &ifr, SIOCADDTUNNEL); | 174 | mm_segment_t oldfs = get_fs(); |
171 | set_fs(oldfs); | 175 | |
176 | set_fs(KERNEL_DS); | ||
177 | err = ops->ndo_do_ioctl(dev, &ifr, SIOCADDTUNNEL); | ||
178 | set_fs(oldfs); | ||
179 | } else | ||
180 | err = -EOPNOTSUPP; | ||
172 | 181 | ||
173 | dev = NULL; | 182 | dev = NULL; |
174 | 183 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 0e41f1be6dc9..e92ad8455c63 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2031,8 +2031,8 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg) | |||
2031 | 2031 | ||
2032 | #if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE) | 2032 | #if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE) |
2033 | if (dev->type == ARPHRD_SIT) { | 2033 | if (dev->type == ARPHRD_SIT) { |
2034 | const struct net_device_ops *ops = dev->netdev_ops; | ||
2034 | struct ifreq ifr; | 2035 | struct ifreq ifr; |
2035 | mm_segment_t oldfs; | ||
2036 | struct ip_tunnel_parm p; | 2036 | struct ip_tunnel_parm p; |
2037 | 2037 | ||
2038 | err = -EADDRNOTAVAIL; | 2038 | err = -EADDRNOTAVAIL; |
@@ -2048,9 +2048,14 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg) | |||
2048 | p.iph.ttl = 64; | 2048 | p.iph.ttl = 64; |
2049 | ifr.ifr_ifru.ifru_data = (__force void __user *)&p; | 2049 | ifr.ifr_ifru.ifru_data = (__force void __user *)&p; |
2050 | 2050 | ||
2051 | oldfs = get_fs(); set_fs(KERNEL_DS); | 2051 | if (ops->ndo_do_ioctl) { |
2052 | err = dev->do_ioctl(dev, &ifr, SIOCADDTUNNEL); | 2052 | mm_segment_t oldfs = get_fs(); |
2053 | set_fs(oldfs); | 2053 | |
2054 | set_fs(KERNEL_DS); | ||
2055 | err = ops->ndo_do_ioctl(dev, &ifr, SIOCADDTUNNEL); | ||
2056 | set_fs(oldfs); | ||
2057 | } else | ||
2058 | err = -EOPNOTSUPP; | ||
2054 | 2059 | ||
2055 | if (err == 0) { | 2060 | if (err == 0) { |
2056 | err = -ENOBUFS; | 2061 | err = -ENOBUFS; |