diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2022-10-24 13:44:11 -0700 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2022-10-24 13:44:11 -0700 |
| commit | 96917bb3a377e1ed103fd5c420a95e5fb25ca104 (patch) | |
| tree | 59e0ef14e8707efba95d2f795742ba69a03bc8d0 /net/tipc/topsrv.c | |
| parent | 86d6f77a3cce1189ab7c31e52e4d47ca58e7a601 (diff) | |
| parent | 337a0a0b63f1c30195733eaacf39e4310a592a68 (diff) | |
| download | linux-96917bb3a377e1ed103fd5c420a95e5fb25ca104.tar.gz linux-96917bb3a377e1ed103fd5c420a95e5fb25ca104.tar.bz2 linux-96917bb3a377e1ed103fd5c420a95e5fb25ca104.zip | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
include/linux/net.h
a5ef058dc4d9 ("net: introduce and use custom sockopt socket flag")
e993ffe3da4b ("net: flag sockets supporting msghdr originated zerocopy")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/tipc/topsrv.c')
| -rw-r--r-- | net/tipc/topsrv.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c index 14fd05fd6107..d92ec92f0b71 100644 --- a/net/tipc/topsrv.c +++ b/net/tipc/topsrv.c @@ -450,12 +450,19 @@ static void tipc_conn_data_ready(struct sock *sk) static void tipc_topsrv_accept(struct work_struct *work) { struct tipc_topsrv *srv = container_of(work, struct tipc_topsrv, awork); - struct socket *lsock = srv->listener; - struct socket *newsock; + struct socket *newsock, *lsock; struct tipc_conn *con; struct sock *newsk; int ret; + spin_lock_bh(&srv->idr_lock); + if (!srv->listener) { + spin_unlock_bh(&srv->idr_lock); + return; + } + lsock = srv->listener; + spin_unlock_bh(&srv->idr_lock); + while (1) { ret = kernel_accept(lsock, &newsock, O_NONBLOCK); if (ret < 0) @@ -489,7 +496,7 @@ static void tipc_topsrv_listener_data_ready(struct sock *sk) read_lock_bh(&sk->sk_callback_lock); srv = sk->sk_user_data; - if (srv->listener) + if (srv) queue_work(srv->rcv_wq, &srv->awork); read_unlock_bh(&sk->sk_callback_lock); } @@ -699,8 +706,9 @@ static void tipc_topsrv_stop(struct net *net) __module_get(lsock->sk->sk_prot_creator->owner); srv->listener = NULL; spin_unlock_bh(&srv->idr_lock); - sock_release(lsock); + tipc_topsrv_work_stop(srv); + sock_release(lsock); idr_destroy(&srv->conn_idr); kfree(srv); } |
