diff options
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index ab7a2a7178f7..3f03ddd0e35b 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -576,6 +576,7 @@ static int tipc_release(struct socket *sock) | |||
576 | sk_stop_timer(sk, &sk->sk_timer); | 576 | sk_stop_timer(sk, &sk->sk_timer); |
577 | tipc_sk_remove(tsk); | 577 | tipc_sk_remove(tsk); |
578 | 578 | ||
579 | sock_orphan(sk); | ||
579 | /* Reject any messages that accumulated in backlog queue */ | 580 | /* Reject any messages that accumulated in backlog queue */ |
580 | release_sock(sk); | 581 | release_sock(sk); |
581 | tipc_dest_list_purge(&tsk->cong_links); | 582 | tipc_dest_list_purge(&tsk->cong_links); |
@@ -3229,7 +3230,7 @@ int tipc_nl_sk_walk(struct sk_buff *skb, struct netlink_callback *cb, | |||
3229 | struct netlink_callback *cb, | 3230 | struct netlink_callback *cb, |
3230 | struct tipc_sock *tsk)) | 3231 | struct tipc_sock *tsk)) |
3231 | { | 3232 | { |
3232 | struct rhashtable_iter *iter = (void *)cb->args[0]; | 3233 | struct rhashtable_iter *iter = (void *)cb->args[4]; |
3233 | struct tipc_sock *tsk; | 3234 | struct tipc_sock *tsk; |
3234 | int err; | 3235 | int err; |
3235 | 3236 | ||
@@ -3265,8 +3266,14 @@ EXPORT_SYMBOL(tipc_nl_sk_walk); | |||
3265 | 3266 | ||
3266 | int tipc_dump_start(struct netlink_callback *cb) | 3267 | int tipc_dump_start(struct netlink_callback *cb) |
3267 | { | 3268 | { |
3268 | struct rhashtable_iter *iter = (void *)cb->args[0]; | 3269 | return __tipc_dump_start(cb, sock_net(cb->skb->sk)); |
3269 | struct net *net = sock_net(cb->skb->sk); | 3270 | } |
3271 | EXPORT_SYMBOL(tipc_dump_start); | ||
3272 | |||
3273 | int __tipc_dump_start(struct netlink_callback *cb, struct net *net) | ||
3274 | { | ||
3275 | /* tipc_nl_name_table_dump() uses cb->args[0...3]. */ | ||
3276 | struct rhashtable_iter *iter = (void *)cb->args[4]; | ||
3270 | struct tipc_net *tn = tipc_net(net); | 3277 | struct tipc_net *tn = tipc_net(net); |
3271 | 3278 | ||
3272 | if (!iter) { | 3279 | if (!iter) { |
@@ -3274,17 +3281,16 @@ int tipc_dump_start(struct netlink_callback *cb) | |||
3274 | if (!iter) | 3281 | if (!iter) |
3275 | return -ENOMEM; | 3282 | return -ENOMEM; |
3276 | 3283 | ||
3277 | cb->args[0] = (long)iter; | 3284 | cb->args[4] = (long)iter; |
3278 | } | 3285 | } |
3279 | 3286 | ||
3280 | rhashtable_walk_enter(&tn->sk_rht, iter); | 3287 | rhashtable_walk_enter(&tn->sk_rht, iter); |
3281 | return 0; | 3288 | return 0; |
3282 | } | 3289 | } |
3283 | EXPORT_SYMBOL(tipc_dump_start); | ||
3284 | 3290 | ||
3285 | int tipc_dump_done(struct netlink_callback *cb) | 3291 | int tipc_dump_done(struct netlink_callback *cb) |
3286 | { | 3292 | { |
3287 | struct rhashtable_iter *hti = (void *)cb->args[0]; | 3293 | struct rhashtable_iter *hti = (void *)cb->args[4]; |
3288 | 3294 | ||
3289 | rhashtable_walk_exit(hti); | 3295 | rhashtable_walk_exit(hti); |
3290 | kfree(hti); | 3296 | kfree(hti); |