diff options
Diffstat (limited to 'net/sunrpc/svcsock.c')
| -rw-r--r-- | net/sunrpc/svcsock.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 96521f16342b..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 | } |
| @@ -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 | /* |
