aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/l2tp/l2tp_core.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 45373fee38c5..e841ef2a68a5 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -1412,19 +1412,21 @@ static void l2tp_tunnel_del_work(struct work_struct *work)
1412 return; 1412 return;
1413 1413
1414 sock = sk->sk_socket; 1414 sock = sk->sk_socket;
1415 BUG_ON(!sock);
1416 1415
1417 /* If the tunnel socket was created directly by the kernel, use the 1416 /* If the tunnel socket was created by userspace, then go through the
1418 * sk_* API to release the socket now. Otherwise go through the 1417 * inet layer to shut the socket down, and let userspace close it.
1419 * inet_* layer to shut the socket down, and let userspace close it. 1418 * Otherwise, if we created the socket directly within the kernel, use
1419 * the sk API to release it here.
1420 * In either case the tunnel resources are freed in the socket 1420 * In either case the tunnel resources are freed in the socket
1421 * destructor when the tunnel socket goes away. 1421 * destructor when the tunnel socket goes away.
1422 */ 1422 */
1423 if (sock->file == NULL) { 1423 if (tunnel->fd >= 0) {
1424 kernel_sock_shutdown(sock, SHUT_RDWR); 1424 if (sock)
1425 sk_release_kernel(sk); 1425 inet_shutdown(sock, 2);
1426 } else { 1426 } else {
1427 inet_shutdown(sock, 2); 1427 if (sock)
1428 kernel_sock_shutdown(sock, SHUT_RDWR);
1429 sk_release_kernel(sk);
1428 } 1430 }
1429 1431
1430 l2tp_tunnel_sock_put(sk); 1432 l2tp_tunnel_sock_put(sk);