|
@@ -1984,36 +1984,38 @@ static int unix_shutdown(struct socket *sock, int mode)
|
|
|
|
|
|
mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN);
|
|
mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN);
|
|
|
|
|
|
- if (mode) {
|
|
|
|
- unix_state_lock(sk);
|
|
|
|
- sk->sk_shutdown |= mode;
|
|
|
|
- other = unix_peer(sk);
|
|
|
|
- if (other)
|
|
|
|
- sock_hold(other);
|
|
|
|
- unix_state_unlock(sk);
|
|
|
|
- sk->sk_state_change(sk);
|
|
|
|
-
|
|
|
|
- if (other &&
|
|
|
|
- (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET)) {
|
|
|
|
-
|
|
|
|
- int peer_mode = 0;
|
|
|
|
-
|
|
|
|
- if (mode&RCV_SHUTDOWN)
|
|
|
|
- peer_mode |= SEND_SHUTDOWN;
|
|
|
|
- if (mode&SEND_SHUTDOWN)
|
|
|
|
- peer_mode |= RCV_SHUTDOWN;
|
|
|
|
- unix_state_lock(other);
|
|
|
|
- other->sk_shutdown |= peer_mode;
|
|
|
|
- unix_state_unlock(other);
|
|
|
|
- other->sk_state_change(other);
|
|
|
|
- if (peer_mode == SHUTDOWN_MASK)
|
|
|
|
- sk_wake_async(other, SOCK_WAKE_WAITD, POLL_HUP);
|
|
|
|
- else if (peer_mode & RCV_SHUTDOWN)
|
|
|
|
- sk_wake_async(other, SOCK_WAKE_WAITD, POLL_IN);
|
|
|
|
- }
|
|
|
|
- if (other)
|
|
|
|
- sock_put(other);
|
|
|
|
|
|
+ if (!mode)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ unix_state_lock(sk);
|
|
|
|
+ sk->sk_shutdown |= mode;
|
|
|
|
+ other = unix_peer(sk);
|
|
|
|
+ if (other)
|
|
|
|
+ sock_hold(other);
|
|
|
|
+ unix_state_unlock(sk);
|
|
|
|
+ sk->sk_state_change(sk);
|
|
|
|
+
|
|
|
|
+ if (other &&
|
|
|
|
+ (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET)) {
|
|
|
|
+
|
|
|
|
+ int peer_mode = 0;
|
|
|
|
+
|
|
|
|
+ if (mode&RCV_SHUTDOWN)
|
|
|
|
+ peer_mode |= SEND_SHUTDOWN;
|
|
|
|
+ if (mode&SEND_SHUTDOWN)
|
|
|
|
+ peer_mode |= RCV_SHUTDOWN;
|
|
|
|
+ unix_state_lock(other);
|
|
|
|
+ other->sk_shutdown |= peer_mode;
|
|
|
|
+ unix_state_unlock(other);
|
|
|
|
+ other->sk_state_change(other);
|
|
|
|
+ if (peer_mode == SHUTDOWN_MASK)
|
|
|
|
+ sk_wake_async(other, SOCK_WAKE_WAITD, POLL_HUP);
|
|
|
|
+ else if (peer_mode & RCV_SHUTDOWN)
|
|
|
|
+ sk_wake_async(other, SOCK_WAKE_WAITD, POLL_IN);
|
|
}
|
|
}
|
|
|
|
+ if (other)
|
|
|
|
+ sock_put(other);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|