diff options
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r-- | net/sunrpc/svcsock.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 61e307cca13d..64ca1f61dd94 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -299,9 +299,15 @@ void svc_reserve(struct svc_rqst *rqstp, int space) | |||
299 | static inline void | 299 | static inline void |
300 | svc_sock_put(struct svc_sock *svsk) | 300 | svc_sock_put(struct svc_sock *svsk) |
301 | { | 301 | { |
302 | if (atomic_dec_and_test(&svsk->sk_inuse) && test_bit(SK_DEAD, &svsk->sk_flags)) { | 302 | if (atomic_dec_and_test(&svsk->sk_inuse) && |
303 | test_bit(SK_DEAD, &svsk->sk_flags)) { | ||
303 | dprintk("svc: releasing dead socket\n"); | 304 | dprintk("svc: releasing dead socket\n"); |
304 | sock_release(svsk->sk_sock); | 305 | if (svsk->sk_sock->file) |
306 | sockfd_put(svsk->sk_sock); | ||
307 | else | ||
308 | sock_release(svsk->sk_sock); | ||
309 | if (svsk->sk_info_authunix != NULL) | ||
310 | svcauth_unix_info_release(svsk->sk_info_authunix); | ||
305 | kfree(svsk); | 311 | kfree(svsk); |
306 | } | 312 | } |
307 | } | 313 | } |
@@ -973,7 +979,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
973 | return 0; | 979 | return 0; |
974 | } | 980 | } |
975 | 981 | ||
976 | if (test_bit(SK_CONN, &svsk->sk_flags)) { | 982 | if (svsk->sk_sk->sk_state == TCP_LISTEN) { |
977 | svc_tcp_accept(svsk); | 983 | svc_tcp_accept(svsk); |
978 | svc_sock_received(svsk); | 984 | svc_sock_received(svsk); |
979 | return 0; | 985 | return 0; |
@@ -1604,20 +1610,13 @@ svc_delete_socket(struct svc_sock *svsk) | |||
1604 | if (test_bit(SK_TEMP, &svsk->sk_flags)) | 1610 | if (test_bit(SK_TEMP, &svsk->sk_flags)) |
1605 | serv->sv_tmpcnt--; | 1611 | serv->sv_tmpcnt--; |
1606 | 1612 | ||
1607 | if (!atomic_read(&svsk->sk_inuse)) { | 1613 | /* This atomic_inc should be needed - svc_delete_socket |
1608 | spin_unlock_bh(&serv->sv_lock); | 1614 | * should have the semantic of dropping a reference. |
1609 | if (svsk->sk_sock->file) | 1615 | * But it doesn't yet.... |
1610 | sockfd_put(svsk->sk_sock); | 1616 | */ |
1611 | else | 1617 | atomic_inc(&svsk->sk_inuse); |
1612 | sock_release(svsk->sk_sock); | 1618 | spin_unlock_bh(&serv->sv_lock); |
1613 | if (svsk->sk_info_authunix != NULL) | 1619 | svc_sock_put(svsk); |
1614 | svcauth_unix_info_release(svsk->sk_info_authunix); | ||
1615 | kfree(svsk); | ||
1616 | } else { | ||
1617 | spin_unlock_bh(&serv->sv_lock); | ||
1618 | dprintk(KERN_NOTICE "svc: server socket destroy delayed\n"); | ||
1619 | /* svsk->sk_server = NULL; */ | ||
1620 | } | ||
1621 | } | 1620 | } |
1622 | 1621 | ||
1623 | /* | 1622 | /* |