diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 0b39b2451ea5..3c95304a0817 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -117,7 +117,7 @@ | |||
| 117 | 117 | ||
| 118 | static struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1]; | 118 | static struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1]; |
| 119 | static DEFINE_SPINLOCK(unix_table_lock); | 119 | static DEFINE_SPINLOCK(unix_table_lock); |
| 120 | static atomic_t unix_nr_socks = ATOMIC_INIT(0); | 120 | static atomic_long_t unix_nr_socks; |
| 121 | 121 | ||
| 122 | #define unix_sockets_unbound (&unix_socket_table[UNIX_HASH_SIZE]) | 122 | #define unix_sockets_unbound (&unix_socket_table[UNIX_HASH_SIZE]) |
| 123 | 123 | ||
| @@ -360,13 +360,13 @@ static void unix_sock_destructor(struct sock *sk) | |||
| 360 | if (u->addr) | 360 | if (u->addr) |
| 361 | unix_release_addr(u->addr); | 361 | unix_release_addr(u->addr); |
| 362 | 362 | ||
| 363 | atomic_dec(&unix_nr_socks); | 363 | atomic_long_dec(&unix_nr_socks); |
| 364 | local_bh_disable(); | 364 | local_bh_disable(); |
| 365 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); | 365 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); |
| 366 | local_bh_enable(); | 366 | local_bh_enable(); |
| 367 | #ifdef UNIX_REFCNT_DEBUG | 367 | #ifdef UNIX_REFCNT_DEBUG |
| 368 | printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk, | 368 | printk(KERN_DEBUG "UNIX %p is destroyed, %ld are still alive.\n", sk, |
| 369 | atomic_read(&unix_nr_socks)); | 369 | atomic_long_read(&unix_nr_socks)); |
| 370 | #endif | 370 | #endif |
| 371 | } | 371 | } |
| 372 | 372 | ||
| @@ -606,8 +606,8 @@ static struct sock *unix_create1(struct net *net, struct socket *sock) | |||
| 606 | struct sock *sk = NULL; | 606 | struct sock *sk = NULL; |
| 607 | struct unix_sock *u; | 607 | struct unix_sock *u; |
| 608 | 608 | ||
| 609 | atomic_inc(&unix_nr_socks); | 609 | atomic_long_inc(&unix_nr_socks); |
| 610 | if (atomic_read(&unix_nr_socks) > 2 * get_max_files()) | 610 | if (atomic_long_read(&unix_nr_socks) > 2 * get_max_files()) |
| 611 | goto out; | 611 | goto out; |
| 612 | 612 | ||
| 613 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto); | 613 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto); |
| @@ -632,7 +632,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock) | |||
| 632 | unix_insert_socket(unix_sockets_unbound, sk); | 632 | unix_insert_socket(unix_sockets_unbound, sk); |
| 633 | out: | 633 | out: |
| 634 | if (sk == NULL) | 634 | if (sk == NULL) |
| 635 | atomic_dec(&unix_nr_socks); | 635 | atomic_long_dec(&unix_nr_socks); |
| 636 | else { | 636 | else { |
| 637 | local_bh_disable(); | 637 | local_bh_disable(); |
| 638 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); | 638 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); |
| @@ -1511,6 +1511,8 @@ restart: | |||
| 1511 | goto restart; | 1511 | goto restart; |
| 1512 | } | 1512 | } |
| 1513 | 1513 | ||
| 1514 | if (sock_flag(other, SOCK_RCVTSTAMP)) | ||
| 1515 | __net_timestamp(skb); | ||
| 1514 | skb_queue_tail(&other->sk_receive_queue, skb); | 1516 | skb_queue_tail(&other->sk_receive_queue, skb); |
| 1515 | unix_state_unlock(other); | 1517 | unix_state_unlock(other); |
| 1516 | other->sk_data_ready(other, len); | 1518 | other->sk_data_ready(other, len); |
| @@ -1722,6 +1724,9 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1722 | if (err) | 1724 | if (err) |
| 1723 | goto out_free; | 1725 | goto out_free; |
| 1724 | 1726 | ||
| 1727 | if (sock_flag(sk, SOCK_RCVTSTAMP)) | ||
| 1728 | __sock_recv_timestamp(msg, sk, skb); | ||
| 1729 | |||
| 1725 | if (!siocb->scm) { | 1730 | if (!siocb->scm) { |
| 1726 | siocb->scm = &tmp_scm; | 1731 | siocb->scm = &tmp_scm; |
| 1727 | memset(&tmp_scm, 0, sizeof(tmp_scm)); | 1732 | memset(&tmp_scm, 0, sizeof(tmp_scm)); |
| @@ -2033,11 +2038,10 @@ static unsigned int unix_poll(struct file *file, struct socket *sock, poll_table | |||
| 2033 | if (sk->sk_shutdown == SHUTDOWN_MASK) | 2038 | if (sk->sk_shutdown == SHUTDOWN_MASK) |
| 2034 | mask |= POLLHUP; | 2039 | mask |= POLLHUP; |
| 2035 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 2040 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
| 2036 | mask |= POLLRDHUP; | 2041 | mask |= POLLRDHUP | POLLIN | POLLRDNORM; |
| 2037 | 2042 | ||
| 2038 | /* readable? */ | 2043 | /* readable? */ |
| 2039 | if (!skb_queue_empty(&sk->sk_receive_queue) || | 2044 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
| 2040 | (sk->sk_shutdown & RCV_SHUTDOWN)) | ||
| 2041 | mask |= POLLIN | POLLRDNORM; | 2045 | mask |= POLLIN | POLLRDNORM; |
| 2042 | 2046 | ||
| 2043 | /* Connection-based need to check for termination and startup */ | 2047 | /* Connection-based need to check for termination and startup */ |
