diff options
-rw-r--r-- | include/net/sock.h | 3 | ||||
-rw-r--r-- | net/socket.c | 3 |
2 files changed, 5 insertions, 1 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 1621935aad5b..98398bdec57d 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -504,6 +504,7 @@ enum sock_flags { | |||
504 | SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */ | 504 | SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */ |
505 | SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */ | 505 | SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */ |
506 | SOCK_TIMESTAMPING_SYS_HARDWARE, /* %SOF_TIMESTAMPING_SYS_HARDWARE */ | 506 | SOCK_TIMESTAMPING_SYS_HARDWARE, /* %SOF_TIMESTAMPING_SYS_HARDWARE */ |
507 | SOCK_FASYNC, /* fasync() active */ | ||
507 | }; | 508 | }; |
508 | 509 | ||
509 | static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) | 510 | static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) |
@@ -1396,7 +1397,7 @@ static inline unsigned long sock_wspace(struct sock *sk) | |||
1396 | 1397 | ||
1397 | static inline void sk_wake_async(struct sock *sk, int how, int band) | 1398 | static inline void sk_wake_async(struct sock *sk, int how, int band) |
1398 | { | 1399 | { |
1399 | if (sk->sk_socket && sk->sk_socket->fasync_list) | 1400 | if (sock_flag(sk, SOCK_FASYNC)) |
1400 | sock_wake_async(sk->sk_socket, how, band); | 1401 | sock_wake_async(sk->sk_socket, how, band); |
1401 | } | 1402 | } |
1402 | 1403 | ||
diff --git a/net/socket.c b/net/socket.c index 75655365b5fd..d53ad11558c3 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -1100,11 +1100,14 @@ static int sock_fasync(int fd, struct file *filp, int on) | |||
1100 | fna->fa_next = sock->fasync_list; | 1100 | fna->fa_next = sock->fasync_list; |
1101 | write_lock_bh(&sk->sk_callback_lock); | 1101 | write_lock_bh(&sk->sk_callback_lock); |
1102 | sock->fasync_list = fna; | 1102 | sock->fasync_list = fna; |
1103 | sock_set_flag(sk, SOCK_FASYNC); | ||
1103 | write_unlock_bh(&sk->sk_callback_lock); | 1104 | write_unlock_bh(&sk->sk_callback_lock); |
1104 | } else { | 1105 | } else { |
1105 | if (fa != NULL) { | 1106 | if (fa != NULL) { |
1106 | write_lock_bh(&sk->sk_callback_lock); | 1107 | write_lock_bh(&sk->sk_callback_lock); |
1107 | *prev = fa->fa_next; | 1108 | *prev = fa->fa_next; |
1109 | if (!sock->fasync_list) | ||
1110 | sock_reset_flag(sk, SOCK_FASYNC); | ||
1108 | write_unlock_bh(&sk->sk_callback_lock); | 1111 | write_unlock_bh(&sk->sk_callback_lock); |
1109 | kfree(fa); | 1112 | kfree(fa); |
1110 | } | 1113 | } |