diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-05-04 10:00:16 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-05-04 10:00:16 -0400 |
commit | 3a20ac2c52b1317f5a5f0bd9cd3cbe8495ddd026 (patch) | |
tree | 9a912f2609cefb9698b5cce09cd240bd6dbd09fb /net/socket.c | |
parent | 18cc8d8d9b74c446832336d8f6e1afb145f9431b (diff) | |
parent | 3e5b50165fd0be080044586f43fcdd460ed27610 (diff) |
Merge branch 'fix/pcm-jiffies-check' into fix/asoc
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 164 |
1 files changed, 106 insertions, 58 deletions
diff --git a/net/socket.c b/net/socket.c index 06603d73c411..791d71a36a93 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -328,7 +328,7 @@ static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen) | |||
328 | dentry->d_inode->i_ino); | 328 | dentry->d_inode->i_ino); |
329 | } | 329 | } |
330 | 330 | ||
331 | static struct dentry_operations sockfs_dentry_operations = { | 331 | static const struct dentry_operations sockfs_dentry_operations = { |
332 | .d_delete = sockfs_delete_dentry, | 332 | .d_delete = sockfs_delete_dentry, |
333 | .d_dname = sockfs_dname, | 333 | .d_dname = sockfs_dname, |
334 | }; | 334 | }; |
@@ -493,8 +493,7 @@ static struct socket *sock_alloc(void) | |||
493 | inode->i_uid = current_fsuid(); | 493 | inode->i_uid = current_fsuid(); |
494 | inode->i_gid = current_fsgid(); | 494 | inode->i_gid = current_fsgid(); |
495 | 495 | ||
496 | get_cpu_var(sockets_in_use)++; | 496 | percpu_add(sockets_in_use, 1); |
497 | put_cpu_var(sockets_in_use); | ||
498 | return sock; | 497 | return sock; |
499 | } | 498 | } |
500 | 499 | ||
@@ -536,8 +535,7 @@ void sock_release(struct socket *sock) | |||
536 | if (sock->fasync_list) | 535 | if (sock->fasync_list) |
537 | printk(KERN_ERR "sock_release: fasync list not empty!\n"); | 536 | printk(KERN_ERR "sock_release: fasync list not empty!\n"); |
538 | 537 | ||
539 | get_cpu_var(sockets_in_use)--; | 538 | percpu_sub(sockets_in_use, 1); |
540 | put_cpu_var(sockets_in_use); | ||
541 | if (!sock->file) { | 539 | if (!sock->file) { |
542 | iput(SOCK_INODE(sock)); | 540 | iput(SOCK_INODE(sock)); |
543 | return; | 541 | return; |
@@ -545,6 +543,18 @@ void sock_release(struct socket *sock) | |||
545 | sock->file = NULL; | 543 | sock->file = NULL; |
546 | } | 544 | } |
547 | 545 | ||
546 | int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, | ||
547 | union skb_shared_tx *shtx) | ||
548 | { | ||
549 | shtx->flags = 0; | ||
550 | if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE)) | ||
551 | shtx->hardware = 1; | ||
552 | if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE)) | ||
553 | shtx->software = 1; | ||
554 | return 0; | ||
555 | } | ||
556 | EXPORT_SYMBOL(sock_tx_timestamp); | ||
557 | |||
548 | static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, | 558 | static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, |
549 | struct msghdr *msg, size_t size) | 559 | struct msghdr *msg, size_t size) |
550 | { | 560 | { |
@@ -595,33 +605,65 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg, | |||
595 | return result; | 605 | return result; |
596 | } | 606 | } |
597 | 607 | ||
608 | static int ktime2ts(ktime_t kt, struct timespec *ts) | ||
609 | { | ||
610 | if (kt.tv64) { | ||
611 | *ts = ktime_to_timespec(kt); | ||
612 | return 1; | ||
613 | } else { | ||
614 | return 0; | ||
615 | } | ||
616 | } | ||
617 | |||
598 | /* | 618 | /* |
599 | * called from sock_recv_timestamp() if sock_flag(sk, SOCK_RCVTSTAMP) | 619 | * called from sock_recv_timestamp() if sock_flag(sk, SOCK_RCVTSTAMP) |
600 | */ | 620 | */ |
601 | void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | 621 | void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, |
602 | struct sk_buff *skb) | 622 | struct sk_buff *skb) |
603 | { | 623 | { |
604 | ktime_t kt = skb->tstamp; | 624 | int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP); |
605 | 625 | struct timespec ts[3]; | |
606 | if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) { | 626 | int empty = 1; |
607 | struct timeval tv; | 627 | struct skb_shared_hwtstamps *shhwtstamps = |
608 | /* Race occurred between timestamp enabling and packet | 628 | skb_hwtstamps(skb); |
609 | receiving. Fill in the current time for now. */ | 629 | |
610 | if (kt.tv64 == 0) | 630 | /* Race occurred between timestamp enabling and packet |
611 | kt = ktime_get_real(); | 631 | receiving. Fill in the current time for now. */ |
612 | skb->tstamp = kt; | 632 | if (need_software_tstamp && skb->tstamp.tv64 == 0) |
613 | tv = ktime_to_timeval(kt); | 633 | __net_timestamp(skb); |
614 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, sizeof(tv), &tv); | 634 | |
615 | } else { | 635 | if (need_software_tstamp) { |
616 | struct timespec ts; | 636 | if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) { |
617 | /* Race occurred between timestamp enabling and packet | 637 | struct timeval tv; |
618 | receiving. Fill in the current time for now. */ | 638 | skb_get_timestamp(skb, &tv); |
619 | if (kt.tv64 == 0) | 639 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, |
620 | kt = ktime_get_real(); | 640 | sizeof(tv), &tv); |
621 | skb->tstamp = kt; | 641 | } else { |
622 | ts = ktime_to_timespec(kt); | 642 | struct timespec ts; |
623 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, sizeof(ts), &ts); | 643 | skb_get_timestampns(skb, &ts); |
644 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, | ||
645 | sizeof(ts), &ts); | ||
646 | } | ||
647 | } | ||
648 | |||
649 | |||
650 | memset(ts, 0, sizeof(ts)); | ||
651 | if (skb->tstamp.tv64 && | ||
652 | sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) { | ||
653 | skb_get_timestampns(skb, ts + 0); | ||
654 | empty = 0; | ||
624 | } | 655 | } |
656 | if (shhwtstamps) { | ||
657 | if (sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE) && | ||
658 | ktime2ts(shhwtstamps->syststamp, ts + 1)) | ||
659 | empty = 0; | ||
660 | if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) && | ||
661 | ktime2ts(shhwtstamps->hwtstamp, ts + 2)) | ||
662 | empty = 0; | ||
663 | } | ||
664 | if (!empty) | ||
665 | put_cmsg(msg, SOL_SOCKET, | ||
666 | SCM_TIMESTAMPING, sizeof(ts), &ts); | ||
625 | } | 667 | } |
626 | 668 | ||
627 | EXPORT_SYMBOL_GPL(__sock_recv_timestamp); | 669 | EXPORT_SYMBOL_GPL(__sock_recv_timestamp); |
@@ -1030,6 +1072,13 @@ static int sock_fasync(int fd, struct file *filp, int on) | |||
1030 | 1072 | ||
1031 | lock_sock(sk); | 1073 | lock_sock(sk); |
1032 | 1074 | ||
1075 | spin_lock(&filp->f_lock); | ||
1076 | if (on) | ||
1077 | filp->f_flags |= FASYNC; | ||
1078 | else | ||
1079 | filp->f_flags &= ~FASYNC; | ||
1080 | spin_unlock(&filp->f_lock); | ||
1081 | |||
1033 | prev = &(sock->fasync_list); | 1082 | prev = &(sock->fasync_list); |
1034 | 1083 | ||
1035 | for (fa = *prev; fa != NULL; prev = &fa->fa_next, fa = *prev) | 1084 | for (fa = *prev; fa != NULL; prev = &fa->fa_next, fa = *prev) |
@@ -1214,7 +1263,7 @@ int sock_create_kern(int family, int type, int protocol, struct socket **res) | |||
1214 | return __sock_create(&init_net, family, type, protocol, res, 1); | 1263 | return __sock_create(&init_net, family, type, protocol, res, 1); |
1215 | } | 1264 | } |
1216 | 1265 | ||
1217 | asmlinkage long sys_socket(int family, int type, int protocol) | 1266 | SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) |
1218 | { | 1267 | { |
1219 | int retval; | 1268 | int retval; |
1220 | struct socket *sock; | 1269 | struct socket *sock; |
@@ -1255,8 +1304,8 @@ out_release: | |||
1255 | * Create a pair of connected sockets. | 1304 | * Create a pair of connected sockets. |
1256 | */ | 1305 | */ |
1257 | 1306 | ||
1258 | asmlinkage long sys_socketpair(int family, int type, int protocol, | 1307 | SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol, |
1259 | int __user *usockvec) | 1308 | int __user *, usockvec) |
1260 | { | 1309 | { |
1261 | struct socket *sock1, *sock2; | 1310 | struct socket *sock1, *sock2; |
1262 | int fd1, fd2, err; | 1311 | int fd1, fd2, err; |
@@ -1356,7 +1405,7 @@ out_fd1: | |||
1356 | * the protocol layer (having also checked the address is ok). | 1405 | * the protocol layer (having also checked the address is ok). |
1357 | */ | 1406 | */ |
1358 | 1407 | ||
1359 | asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) | 1408 | SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) |
1360 | { | 1409 | { |
1361 | struct socket *sock; | 1410 | struct socket *sock; |
1362 | struct sockaddr_storage address; | 1411 | struct sockaddr_storage address; |
@@ -1385,7 +1434,7 @@ asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) | |||
1385 | * ready for listening. | 1434 | * ready for listening. |
1386 | */ | 1435 | */ |
1387 | 1436 | ||
1388 | asmlinkage long sys_listen(int fd, int backlog) | 1437 | SYSCALL_DEFINE2(listen, int, fd, int, backlog) |
1389 | { | 1438 | { |
1390 | struct socket *sock; | 1439 | struct socket *sock; |
1391 | int err, fput_needed; | 1440 | int err, fput_needed; |
@@ -1418,8 +1467,8 @@ asmlinkage long sys_listen(int fd, int backlog) | |||
1418 | * clean when we restucture accept also. | 1467 | * clean when we restucture accept also. |
1419 | */ | 1468 | */ |
1420 | 1469 | ||
1421 | asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, | 1470 | SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, |
1422 | int __user *upeer_addrlen, int flags) | 1471 | int __user *, upeer_addrlen, int, flags) |
1423 | { | 1472 | { |
1424 | struct socket *sock, *newsock; | 1473 | struct socket *sock, *newsock; |
1425 | struct file *newfile; | 1474 | struct file *newfile; |
@@ -1485,8 +1534,6 @@ asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, | |||
1485 | fd_install(newfd, newfile); | 1534 | fd_install(newfd, newfile); |
1486 | err = newfd; | 1535 | err = newfd; |
1487 | 1536 | ||
1488 | security_socket_post_accept(sock, newsock); | ||
1489 | |||
1490 | out_put: | 1537 | out_put: |
1491 | fput_light(sock->file, fput_needed); | 1538 | fput_light(sock->file, fput_needed); |
1492 | out: | 1539 | out: |
@@ -1502,8 +1549,8 @@ out_fd: | |||
1502 | goto out_put; | 1549 | goto out_put; |
1503 | } | 1550 | } |
1504 | 1551 | ||
1505 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1552 | SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr, |
1506 | int __user *upeer_addrlen) | 1553 | int __user *, upeer_addrlen) |
1507 | { | 1554 | { |
1508 | return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); | 1555 | return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); |
1509 | } | 1556 | } |
@@ -1520,8 +1567,8 @@ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, | |||
1520 | * include the -EINPROGRESS status for such sockets. | 1567 | * include the -EINPROGRESS status for such sockets. |
1521 | */ | 1568 | */ |
1522 | 1569 | ||
1523 | asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr, | 1570 | SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr, |
1524 | int addrlen) | 1571 | int, addrlen) |
1525 | { | 1572 | { |
1526 | struct socket *sock; | 1573 | struct socket *sock; |
1527 | struct sockaddr_storage address; | 1574 | struct sockaddr_storage address; |
@@ -1552,8 +1599,8 @@ out: | |||
1552 | * name to user space. | 1599 | * name to user space. |
1553 | */ | 1600 | */ |
1554 | 1601 | ||
1555 | asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr, | 1602 | SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr, |
1556 | int __user *usockaddr_len) | 1603 | int __user *, usockaddr_len) |
1557 | { | 1604 | { |
1558 | struct socket *sock; | 1605 | struct socket *sock; |
1559 | struct sockaddr_storage address; | 1606 | struct sockaddr_storage address; |
@@ -1583,8 +1630,8 @@ out: | |||
1583 | * name to user space. | 1630 | * name to user space. |
1584 | */ | 1631 | */ |
1585 | 1632 | ||
1586 | asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr, | 1633 | SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr, |
1587 | int __user *usockaddr_len) | 1634 | int __user *, usockaddr_len) |
1588 | { | 1635 | { |
1589 | struct socket *sock; | 1636 | struct socket *sock; |
1590 | struct sockaddr_storage address; | 1637 | struct sockaddr_storage address; |
@@ -1615,9 +1662,9 @@ asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr, | |||
1615 | * the protocol. | 1662 | * the protocol. |
1616 | */ | 1663 | */ |
1617 | 1664 | ||
1618 | asmlinkage long sys_sendto(int fd, void __user *buff, size_t len, | 1665 | SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len, |
1619 | unsigned flags, struct sockaddr __user *addr, | 1666 | unsigned, flags, struct sockaddr __user *, addr, |
1620 | int addr_len) | 1667 | int, addr_len) |
1621 | { | 1668 | { |
1622 | struct socket *sock; | 1669 | struct socket *sock; |
1623 | struct sockaddr_storage address; | 1670 | struct sockaddr_storage address; |
@@ -1660,7 +1707,8 @@ out: | |||
1660 | * Send a datagram down a socket. | 1707 | * Send a datagram down a socket. |
1661 | */ | 1708 | */ |
1662 | 1709 | ||
1663 | asmlinkage long sys_send(int fd, void __user *buff, size_t len, unsigned flags) | 1710 | SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len, |
1711 | unsigned, flags) | ||
1664 | { | 1712 | { |
1665 | return sys_sendto(fd, buff, len, flags, NULL, 0); | 1713 | return sys_sendto(fd, buff, len, flags, NULL, 0); |
1666 | } | 1714 | } |
@@ -1671,9 +1719,9 @@ asmlinkage long sys_send(int fd, void __user *buff, size_t len, unsigned flags) | |||
1671 | * sender address from kernel to user space. | 1719 | * sender address from kernel to user space. |
1672 | */ | 1720 | */ |
1673 | 1721 | ||
1674 | asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size, | 1722 | SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, |
1675 | unsigned flags, struct sockaddr __user *addr, | 1723 | unsigned, flags, struct sockaddr __user *, addr, |
1676 | int __user *addr_len) | 1724 | int __user *, addr_len) |
1677 | { | 1725 | { |
1678 | struct socket *sock; | 1726 | struct socket *sock; |
1679 | struct iovec iov; | 1727 | struct iovec iov; |
@@ -1725,8 +1773,8 @@ asmlinkage long sys_recv(int fd, void __user *ubuf, size_t size, | |||
1725 | * to pass the user mode parameter for the protocols to sort out. | 1773 | * to pass the user mode parameter for the protocols to sort out. |
1726 | */ | 1774 | */ |
1727 | 1775 | ||
1728 | asmlinkage long sys_setsockopt(int fd, int level, int optname, | 1776 | SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, |
1729 | char __user *optval, int optlen) | 1777 | char __user *, optval, int, optlen) |
1730 | { | 1778 | { |
1731 | int err, fput_needed; | 1779 | int err, fput_needed; |
1732 | struct socket *sock; | 1780 | struct socket *sock; |
@@ -1759,8 +1807,8 @@ out_put: | |||
1759 | * to pass a user mode parameter for the protocols to sort out. | 1807 | * to pass a user mode parameter for the protocols to sort out. |
1760 | */ | 1808 | */ |
1761 | 1809 | ||
1762 | asmlinkage long sys_getsockopt(int fd, int level, int optname, | 1810 | SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname, |
1763 | char __user *optval, int __user *optlen) | 1811 | char __user *, optval, int __user *, optlen) |
1764 | { | 1812 | { |
1765 | int err, fput_needed; | 1813 | int err, fput_needed; |
1766 | struct socket *sock; | 1814 | struct socket *sock; |
@@ -1789,7 +1837,7 @@ out_put: | |||
1789 | * Shutdown a socket. | 1837 | * Shutdown a socket. |
1790 | */ | 1838 | */ |
1791 | 1839 | ||
1792 | asmlinkage long sys_shutdown(int fd, int how) | 1840 | SYSCALL_DEFINE2(shutdown, int, fd, int, how) |
1793 | { | 1841 | { |
1794 | int err, fput_needed; | 1842 | int err, fput_needed; |
1795 | struct socket *sock; | 1843 | struct socket *sock; |
@@ -1815,7 +1863,7 @@ asmlinkage long sys_shutdown(int fd, int how) | |||
1815 | * BSD sendmsg interface | 1863 | * BSD sendmsg interface |
1816 | */ | 1864 | */ |
1817 | 1865 | ||
1818 | asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags) | 1866 | SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) |
1819 | { | 1867 | { |
1820 | struct compat_msghdr __user *msg_compat = | 1868 | struct compat_msghdr __user *msg_compat = |
1821 | (struct compat_msghdr __user *)msg; | 1869 | (struct compat_msghdr __user *)msg; |
@@ -1921,8 +1969,8 @@ out: | |||
1921 | * BSD recvmsg interface | 1969 | * BSD recvmsg interface |
1922 | */ | 1970 | */ |
1923 | 1971 | ||
1924 | asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, | 1972 | SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, |
1925 | unsigned int flags) | 1973 | unsigned int, flags) |
1926 | { | 1974 | { |
1927 | struct compat_msghdr __user *msg_compat = | 1975 | struct compat_msghdr __user *msg_compat = |
1928 | (struct compat_msghdr __user *)msg; | 1976 | (struct compat_msghdr __user *)msg; |
@@ -2045,7 +2093,7 @@ static const unsigned char nargs[19]={ | |||
2045 | * it is set by the callees. | 2093 | * it is set by the callees. |
2046 | */ | 2094 | */ |
2047 | 2095 | ||
2048 | asmlinkage long sys_socketcall(int call, unsigned long __user *args) | 2096 | SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args) |
2049 | { | 2097 | { |
2050 | unsigned long a[6]; | 2098 | unsigned long a[6]; |
2051 | unsigned long a0, a1; | 2099 | unsigned long a0, a1; |