diff options
| -rw-r--r-- | drivers/net/vxlan.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index da8479479d01..75a3a740ce19 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -2180,7 +2180,7 @@ static void vxlan_del_work(struct work_struct *work) | |||
| 2180 | * could be used for both IPv4 and IPv6 communications, but | 2180 | * could be used for both IPv4 and IPv6 communications, but |
| 2181 | * users may set bindv6only=1. | 2181 | * users may set bindv6only=1. |
| 2182 | */ | 2182 | */ |
| 2183 | static int create_v6_sock(struct net *net, __be16 port, struct socket **psock) | 2183 | static struct socket *create_v6_sock(struct net *net, __be16 port) |
| 2184 | { | 2184 | { |
| 2185 | struct sock *sk; | 2185 | struct sock *sk; |
| 2186 | struct socket *sock; | 2186 | struct socket *sock; |
| @@ -2193,7 +2193,7 @@ static int create_v6_sock(struct net *net, __be16 port, struct socket **psock) | |||
| 2193 | rc = sock_create_kern(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, &sock); | 2193 | rc = sock_create_kern(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, &sock); |
| 2194 | if (rc < 0) { | 2194 | if (rc < 0) { |
| 2195 | pr_debug("UDPv6 socket create failed\n"); | 2195 | pr_debug("UDPv6 socket create failed\n"); |
| 2196 | return rc; | 2196 | return ERR_PTR(rc); |
| 2197 | } | 2197 | } |
| 2198 | 2198 | ||
| 2199 | /* Put in proper namespace */ | 2199 | /* Put in proper namespace */ |
| @@ -2208,28 +2208,27 @@ static int create_v6_sock(struct net *net, __be16 port, struct socket **psock) | |||
| 2208 | pr_debug("bind for UDPv6 socket %pI6:%u (%d)\n", | 2208 | pr_debug("bind for UDPv6 socket %pI6:%u (%d)\n", |
| 2209 | &vxlan_addr.sin6_addr, ntohs(vxlan_addr.sin6_port), rc); | 2209 | &vxlan_addr.sin6_addr, ntohs(vxlan_addr.sin6_port), rc); |
| 2210 | sk_release_kernel(sk); | 2210 | sk_release_kernel(sk); |
| 2211 | return rc; | 2211 | return ERR_PTR(rc); |
| 2212 | } | 2212 | } |
| 2213 | /* At this point, IPv6 module should have been loaded in | 2213 | /* At this point, IPv6 module should have been loaded in |
| 2214 | * sock_create_kern(). | 2214 | * sock_create_kern(). |
| 2215 | */ | 2215 | */ |
| 2216 | BUG_ON(!ipv6_stub); | 2216 | BUG_ON(!ipv6_stub); |
| 2217 | 2217 | ||
| 2218 | *psock = sock; | ||
| 2219 | /* Disable multicast loopback */ | 2218 | /* Disable multicast loopback */ |
| 2220 | inet_sk(sk)->mc_loop = 0; | 2219 | inet_sk(sk)->mc_loop = 0; |
| 2221 | return 0; | 2220 | return sock; |
| 2222 | } | 2221 | } |
| 2223 | 2222 | ||
| 2224 | #else | 2223 | #else |
| 2225 | 2224 | ||
| 2226 | static int create_v6_sock(struct net *net, __be16 port, struct socket **psock) | 2225 | static struct socket *create_v6_sock(struct net *net, __be16 port) |
| 2227 | { | 2226 | { |
| 2228 | return -EPFNOSUPPORT; | 2227 | return ERR_PTR(-EPFNOSUPPORT); |
| 2229 | } | 2228 | } |
| 2230 | #endif | 2229 | #endif |
| 2231 | 2230 | ||
| 2232 | static int create_v4_sock(struct net *net, __be16 port, struct socket **psock) | 2231 | static struct socket *create_v4_sock(struct net *net, __be16 port) |
| 2233 | { | 2232 | { |
| 2234 | struct sock *sk; | 2233 | struct sock *sk; |
| 2235 | struct socket *sock; | 2234 | struct socket *sock; |
| @@ -2244,7 +2243,7 @@ static int create_v4_sock(struct net *net, __be16 port, struct socket **psock) | |||
| 2244 | rc = sock_create_kern(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock); | 2243 | rc = sock_create_kern(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock); |
| 2245 | if (rc < 0) { | 2244 | if (rc < 0) { |
| 2246 | pr_debug("UDP socket create failed\n"); | 2245 | pr_debug("UDP socket create failed\n"); |
| 2247 | return rc; | 2246 | return ERR_PTR(rc); |
| 2248 | } | 2247 | } |
| 2249 | 2248 | ||
| 2250 | /* Put in proper namespace */ | 2249 | /* Put in proper namespace */ |
| @@ -2257,13 +2256,12 @@ static int create_v4_sock(struct net *net, __be16 port, struct socket **psock) | |||
| 2257 | pr_debug("bind for UDP socket %pI4:%u (%d)\n", | 2256 | pr_debug("bind for UDP socket %pI4:%u (%d)\n", |
| 2258 | &vxlan_addr.sin_addr, ntohs(vxlan_addr.sin_port), rc); | 2257 | &vxlan_addr.sin_addr, ntohs(vxlan_addr.sin_port), rc); |
| 2259 | sk_release_kernel(sk); | 2258 | sk_release_kernel(sk); |
| 2260 | return rc; | 2259 | return ERR_PTR(rc); |
| 2261 | } | 2260 | } |
| 2262 | 2261 | ||
| 2263 | *psock = sock; | ||
| 2264 | /* Disable multicast loopback */ | 2262 | /* Disable multicast loopback */ |
| 2265 | inet_sk(sk)->mc_loop = 0; | 2263 | inet_sk(sk)->mc_loop = 0; |
| 2266 | return 0; | 2264 | return sock; |
| 2267 | } | 2265 | } |
| 2268 | 2266 | ||
| 2269 | /* Create new listen socket if needed */ | 2267 | /* Create new listen socket if needed */ |
| @@ -2274,7 +2272,6 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, __be16 port, | |||
| 2274 | struct vxlan_sock *vs; | 2272 | struct vxlan_sock *vs; |
| 2275 | struct socket *sock; | 2273 | struct socket *sock; |
| 2276 | struct sock *sk; | 2274 | struct sock *sk; |
| 2277 | int rc = 0; | ||
| 2278 | unsigned int h; | 2275 | unsigned int h; |
| 2279 | 2276 | ||
| 2280 | vs = kmalloc(sizeof(*vs), GFP_KERNEL); | 2277 | vs = kmalloc(sizeof(*vs), GFP_KERNEL); |
| @@ -2287,12 +2284,12 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, __be16 port, | |||
| 2287 | INIT_WORK(&vs->del_work, vxlan_del_work); | 2284 | INIT_WORK(&vs->del_work, vxlan_del_work); |
| 2288 | 2285 | ||
| 2289 | if (ipv6) | 2286 | if (ipv6) |
| 2290 | rc = create_v6_sock(net, port, &sock); | 2287 | sock = create_v6_sock(net, port); |
| 2291 | else | 2288 | else |
| 2292 | rc = create_v4_sock(net, port, &sock); | 2289 | sock = create_v4_sock(net, port); |
| 2293 | if (rc < 0) { | 2290 | if (IS_ERR(sock)) { |
| 2294 | kfree(vs); | 2291 | kfree(vs); |
| 2295 | return ERR_PTR(rc); | 2292 | return ERR_PTR(PTR_ERR(sock)); |
| 2296 | } | 2293 | } |
| 2297 | 2294 | ||
| 2298 | vs->sock = sock; | 2295 | vs->sock = sock; |
