|
@@ -598,17 +598,24 @@ static int rose_release(struct socket *sock)
|
|
|
|
|
|
if (sk == NULL) return 0;
|
|
if (sk == NULL) return 0;
|
|
|
|
|
|
|
|
+ sock_hold(sk);
|
|
|
|
+ sock_orphan(sk);
|
|
|
|
+ lock_sock(sk);
|
|
rose = rose_sk(sk);
|
|
rose = rose_sk(sk);
|
|
|
|
|
|
switch (rose->state) {
|
|
switch (rose->state) {
|
|
case ROSE_STATE_0:
|
|
case ROSE_STATE_0:
|
|
|
|
+ release_sock(sk);
|
|
rose_disconnect(sk, 0, -1, -1);
|
|
rose_disconnect(sk, 0, -1, -1);
|
|
|
|
+ lock_sock(sk);
|
|
rose_destroy_socket(sk);
|
|
rose_destroy_socket(sk);
|
|
break;
|
|
break;
|
|
|
|
|
|
case ROSE_STATE_2:
|
|
case ROSE_STATE_2:
|
|
rose->neighbour->use--;
|
|
rose->neighbour->use--;
|
|
|
|
+ release_sock(sk);
|
|
rose_disconnect(sk, 0, -1, -1);
|
|
rose_disconnect(sk, 0, -1, -1);
|
|
|
|
+ lock_sock(sk);
|
|
rose_destroy_socket(sk);
|
|
rose_destroy_socket(sk);
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -633,6 +640,8 @@ static int rose_release(struct socket *sock)
|
|
}
|
|
}
|
|
|
|
|
|
sock->sk = NULL;
|
|
sock->sk = NULL;
|
|
|
|
+ release_sock(sk);
|
|
|
|
+ sock_put(sk);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|