aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/sock.h3
-rw-r--r--net/socket.c3
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
509static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) 510static 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
1397static inline void sk_wake_async(struct sock *sk, int how, int band) 1398static 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 }