aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-05-04 10:00:16 -0400
committerTakashi Iwai <tiwai@suse.de>2009-05-04 10:00:16 -0400
commit3a20ac2c52b1317f5a5f0bd9cd3cbe8495ddd026 (patch)
tree9a912f2609cefb9698b5cce09cd240bd6dbd09fb /net/socket.c
parent18cc8d8d9b74c446832336d8f6e1afb145f9431b (diff)
parent3e5b50165fd0be080044586f43fcdd460ed27610 (diff)
Merge branch 'fix/pcm-jiffies-check' into fix/asoc
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c164
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
331static struct dentry_operations sockfs_dentry_operations = { 331static 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
546int 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}
556EXPORT_SYMBOL(sock_tx_timestamp);
557
548static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, 558static 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
608static 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 */
601void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, 621void __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
627EXPORT_SYMBOL_GPL(__sock_recv_timestamp); 669EXPORT_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
1217asmlinkage long sys_socket(int family, int type, int protocol) 1266SYSCALL_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
1258asmlinkage long sys_socketpair(int family, int type, int protocol, 1307SYSCALL_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
1359asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) 1408SYSCALL_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
1388asmlinkage long sys_listen(int fd, int backlog) 1437SYSCALL_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
1421asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, 1470SYSCALL_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
1490out_put: 1537out_put:
1491 fput_light(sock->file, fput_needed); 1538 fput_light(sock->file, fput_needed);
1492out: 1539out:
@@ -1502,8 +1549,8 @@ out_fd:
1502 goto out_put; 1549 goto out_put;
1503} 1550}
1504 1551
1505asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, 1552SYSCALL_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
1523asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr, 1570SYSCALL_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
1555asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr, 1602SYSCALL_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
1586asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr, 1633SYSCALL_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
1618asmlinkage long sys_sendto(int fd, void __user *buff, size_t len, 1665SYSCALL_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
1663asmlinkage long sys_send(int fd, void __user *buff, size_t len, unsigned flags) 1710SYSCALL_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
1674asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size, 1722SYSCALL_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
1728asmlinkage long sys_setsockopt(int fd, int level, int optname, 1776SYSCALL_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
1762asmlinkage long sys_getsockopt(int fd, int level, int optname, 1810SYSCALL_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
1792asmlinkage long sys_shutdown(int fd, int how) 1840SYSCALL_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
1818asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags) 1866SYSCALL_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
1924asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, 1972SYSCALL_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
2048asmlinkage long sys_socketcall(int call, unsigned long __user *args) 2096SYSCALL_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;