diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 309 |
1 files changed, 140 insertions, 169 deletions
diff --git a/net/socket.c b/net/socket.c index 5e8d0af3c0e7..2270b941bcc7 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -94,6 +94,7 @@ | |||
94 | 94 | ||
95 | #include <net/compat.h> | 95 | #include <net/compat.h> |
96 | #include <net/wext.h> | 96 | #include <net/wext.h> |
97 | #include <net/cls_cgroup.h> | ||
97 | 98 | ||
98 | #include <net/sock.h> | 99 | #include <net/sock.h> |
99 | #include <linux/netfilter.h> | 100 | #include <linux/netfilter.h> |
@@ -123,7 +124,7 @@ static int sock_fasync(int fd, struct file *filp, int on); | |||
123 | static ssize_t sock_sendpage(struct file *file, struct page *page, | 124 | static ssize_t sock_sendpage(struct file *file, struct page *page, |
124 | int offset, size_t size, loff_t *ppos, int more); | 125 | int offset, size_t size, loff_t *ppos, int more); |
125 | static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | 126 | static ssize_t sock_splice_read(struct file *file, loff_t *ppos, |
126 | struct pipe_inode_info *pipe, size_t len, | 127 | struct pipe_inode_info *pipe, size_t len, |
127 | unsigned int flags); | 128 | unsigned int flags); |
128 | 129 | ||
129 | /* | 130 | /* |
@@ -161,7 +162,7 @@ static const struct net_proto_family *net_families[NPROTO] __read_mostly; | |||
161 | * Statistics counters of the socket lists | 162 | * Statistics counters of the socket lists |
162 | */ | 163 | */ |
163 | 164 | ||
164 | static DEFINE_PER_CPU(int, sockets_in_use) = 0; | 165 | static DEFINE_PER_CPU(int, sockets_in_use); |
165 | 166 | ||
166 | /* | 167 | /* |
167 | * Support routines. | 168 | * Support routines. |
@@ -169,15 +170,6 @@ static DEFINE_PER_CPU(int, sockets_in_use) = 0; | |||
169 | * divide and look after the messy bits. | 170 | * divide and look after the messy bits. |
170 | */ | 171 | */ |
171 | 172 | ||
172 | #define MAX_SOCK_ADDR 128 /* 108 for Unix domain - | ||
173 | 16 for IP, 16 for IPX, | ||
174 | 24 for IPv6, | ||
175 | about 80 for AX.25 | ||
176 | must be at least one bigger than | ||
177 | the AF_UNIX size (see net/unix/af_unix.c | ||
178 | :unix_mkname()). | ||
179 | */ | ||
180 | |||
181 | /** | 173 | /** |
182 | * move_addr_to_kernel - copy a socket address into kernel space | 174 | * move_addr_to_kernel - copy a socket address into kernel space |
183 | * @uaddr: Address in user space | 175 | * @uaddr: Address in user space |
@@ -252,9 +244,14 @@ static struct inode *sock_alloc_inode(struct super_block *sb) | |||
252 | ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL); | 244 | ei = kmem_cache_alloc(sock_inode_cachep, GFP_KERNEL); |
253 | if (!ei) | 245 | if (!ei) |
254 | return NULL; | 246 | return NULL; |
255 | init_waitqueue_head(&ei->socket.wait); | 247 | ei->socket.wq = kmalloc(sizeof(struct socket_wq), GFP_KERNEL); |
248 | if (!ei->socket.wq) { | ||
249 | kmem_cache_free(sock_inode_cachep, ei); | ||
250 | return NULL; | ||
251 | } | ||
252 | init_waitqueue_head(&ei->socket.wq->wait); | ||
253 | ei->socket.wq->fasync_list = NULL; | ||
256 | 254 | ||
257 | ei->socket.fasync_list = NULL; | ||
258 | ei->socket.state = SS_UNCONNECTED; | 255 | ei->socket.state = SS_UNCONNECTED; |
259 | ei->socket.flags = 0; | 256 | ei->socket.flags = 0; |
260 | ei->socket.ops = NULL; | 257 | ei->socket.ops = NULL; |
@@ -264,10 +261,21 @@ static struct inode *sock_alloc_inode(struct super_block *sb) | |||
264 | return &ei->vfs_inode; | 261 | return &ei->vfs_inode; |
265 | } | 262 | } |
266 | 263 | ||
264 | |||
265 | static void wq_free_rcu(struct rcu_head *head) | ||
266 | { | ||
267 | struct socket_wq *wq = container_of(head, struct socket_wq, rcu); | ||
268 | |||
269 | kfree(wq); | ||
270 | } | ||
271 | |||
267 | static void sock_destroy_inode(struct inode *inode) | 272 | static void sock_destroy_inode(struct inode *inode) |
268 | { | 273 | { |
269 | kmem_cache_free(sock_inode_cachep, | 274 | struct socket_alloc *ei; |
270 | container_of(inode, struct socket_alloc, vfs_inode)); | 275 | |
276 | ei = container_of(inode, struct socket_alloc, vfs_inode); | ||
277 | call_rcu(&ei->socket.wq->rcu, wq_free_rcu); | ||
278 | kmem_cache_free(sock_inode_cachep, ei); | ||
271 | } | 279 | } |
272 | 280 | ||
273 | static void init_once(void *foo) | 281 | static void init_once(void *foo) |
@@ -292,9 +300,9 @@ static int init_inodecache(void) | |||
292 | } | 300 | } |
293 | 301 | ||
294 | static const struct super_operations sockfs_ops = { | 302 | static const struct super_operations sockfs_ops = { |
295 | .alloc_inode = sock_alloc_inode, | 303 | .alloc_inode = sock_alloc_inode, |
296 | .destroy_inode =sock_destroy_inode, | 304 | .destroy_inode = sock_destroy_inode, |
297 | .statfs = simple_statfs, | 305 | .statfs = simple_statfs, |
298 | }; | 306 | }; |
299 | 307 | ||
300 | static int sockfs_get_sb(struct file_system_type *fs_type, | 308 | static int sockfs_get_sb(struct file_system_type *fs_type, |
@@ -394,6 +402,7 @@ int sock_map_fd(struct socket *sock, int flags) | |||
394 | 402 | ||
395 | return fd; | 403 | return fd; |
396 | } | 404 | } |
405 | EXPORT_SYMBOL(sock_map_fd); | ||
397 | 406 | ||
398 | static struct socket *sock_from_file(struct file *file, int *err) | 407 | static struct socket *sock_from_file(struct file *file, int *err) |
399 | { | 408 | { |
@@ -405,7 +414,7 @@ static struct socket *sock_from_file(struct file *file, int *err) | |||
405 | } | 414 | } |
406 | 415 | ||
407 | /** | 416 | /** |
408 | * sockfd_lookup - Go from a file number to its socket slot | 417 | * sockfd_lookup - Go from a file number to its socket slot |
409 | * @fd: file handle | 418 | * @fd: file handle |
410 | * @err: pointer to an error code return | 419 | * @err: pointer to an error code return |
411 | * | 420 | * |
@@ -433,6 +442,7 @@ struct socket *sockfd_lookup(int fd, int *err) | |||
433 | fput(file); | 442 | fput(file); |
434 | return sock; | 443 | return sock; |
435 | } | 444 | } |
445 | EXPORT_SYMBOL(sockfd_lookup); | ||
436 | 446 | ||
437 | static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) | 447 | static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) |
438 | { | 448 | { |
@@ -513,7 +523,7 @@ void sock_release(struct socket *sock) | |||
513 | module_put(owner); | 523 | module_put(owner); |
514 | } | 524 | } |
515 | 525 | ||
516 | if (sock->fasync_list) | 526 | if (sock->wq->fasync_list) |
517 | printk(KERN_ERR "sock_release: fasync list not empty!\n"); | 527 | printk(KERN_ERR "sock_release: fasync list not empty!\n"); |
518 | 528 | ||
519 | percpu_sub(sockets_in_use, 1); | 529 | percpu_sub(sockets_in_use, 1); |
@@ -523,6 +533,7 @@ void sock_release(struct socket *sock) | |||
523 | } | 533 | } |
524 | sock->file = NULL; | 534 | sock->file = NULL; |
525 | } | 535 | } |
536 | EXPORT_SYMBOL(sock_release); | ||
526 | 537 | ||
527 | int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, | 538 | int sock_tx_timestamp(struct msghdr *msg, struct sock *sk, |
528 | union skb_shared_tx *shtx) | 539 | union skb_shared_tx *shtx) |
@@ -542,6 +553,8 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
542 | struct sock_iocb *si = kiocb_to_siocb(iocb); | 553 | struct sock_iocb *si = kiocb_to_siocb(iocb); |
543 | int err; | 554 | int err; |
544 | 555 | ||
556 | sock_update_classid(sock->sk); | ||
557 | |||
545 | si->sock = sock; | 558 | si->sock = sock; |
546 | si->scm = NULL; | 559 | si->scm = NULL; |
547 | si->msg = msg; | 560 | si->msg = msg; |
@@ -567,6 +580,7 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
567 | ret = wait_on_sync_kiocb(&iocb); | 580 | ret = wait_on_sync_kiocb(&iocb); |
568 | return ret; | 581 | return ret; |
569 | } | 582 | } |
583 | EXPORT_SYMBOL(sock_sendmsg); | ||
570 | 584 | ||
571 | int kernel_sendmsg(struct socket *sock, struct msghdr *msg, | 585 | int kernel_sendmsg(struct socket *sock, struct msghdr *msg, |
572 | struct kvec *vec, size_t num, size_t size) | 586 | struct kvec *vec, size_t num, size_t size) |
@@ -585,6 +599,7 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg, | |||
585 | set_fs(oldfs); | 599 | set_fs(oldfs); |
586 | return result; | 600 | return result; |
587 | } | 601 | } |
602 | EXPORT_SYMBOL(kernel_sendmsg); | ||
588 | 603 | ||
589 | static int ktime2ts(ktime_t kt, struct timespec *ts) | 604 | static int ktime2ts(ktime_t kt, struct timespec *ts) |
590 | { | 605 | { |
@@ -620,10 +635,9 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | |||
620 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, | 635 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMP, |
621 | sizeof(tv), &tv); | 636 | sizeof(tv), &tv); |
622 | } else { | 637 | } else { |
623 | struct timespec ts; | 638 | skb_get_timestampns(skb, &ts[0]); |
624 | skb_get_timestampns(skb, &ts); | ||
625 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, | 639 | put_cmsg(msg, SOL_SOCKET, SCM_TIMESTAMPNS, |
626 | sizeof(ts), &ts); | 640 | sizeof(ts[0]), &ts[0]); |
627 | } | 641 | } |
628 | } | 642 | } |
629 | 643 | ||
@@ -646,7 +660,6 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | |||
646 | put_cmsg(msg, SOL_SOCKET, | 660 | put_cmsg(msg, SOL_SOCKET, |
647 | SCM_TIMESTAMPING, sizeof(ts), &ts); | 661 | SCM_TIMESTAMPING, sizeof(ts), &ts); |
648 | } | 662 | } |
649 | |||
650 | EXPORT_SYMBOL_GPL(__sock_recv_timestamp); | 663 | EXPORT_SYMBOL_GPL(__sock_recv_timestamp); |
651 | 664 | ||
652 | inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) | 665 | inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) |
@@ -656,19 +669,21 @@ inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff | |||
656 | sizeof(__u32), &skb->dropcount); | 669 | sizeof(__u32), &skb->dropcount); |
657 | } | 670 | } |
658 | 671 | ||
659 | void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, | 672 | void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, |
660 | struct sk_buff *skb) | 673 | struct sk_buff *skb) |
661 | { | 674 | { |
662 | sock_recv_timestamp(msg, sk, skb); | 675 | sock_recv_timestamp(msg, sk, skb); |
663 | sock_recv_drops(msg, sk, skb); | 676 | sock_recv_drops(msg, sk, skb); |
664 | } | 677 | } |
665 | EXPORT_SYMBOL_GPL(sock_recv_ts_and_drops); | 678 | EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); |
666 | 679 | ||
667 | static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, | 680 | static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, |
668 | struct msghdr *msg, size_t size, int flags) | 681 | struct msghdr *msg, size_t size, int flags) |
669 | { | 682 | { |
670 | struct sock_iocb *si = kiocb_to_siocb(iocb); | 683 | struct sock_iocb *si = kiocb_to_siocb(iocb); |
671 | 684 | ||
685 | sock_update_classid(sock->sk); | ||
686 | |||
672 | si->sock = sock; | 687 | si->sock = sock; |
673 | si->scm = NULL; | 688 | si->scm = NULL; |
674 | si->msg = msg; | 689 | si->msg = msg; |
@@ -700,6 +715,7 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg, | |||
700 | ret = wait_on_sync_kiocb(&iocb); | 715 | ret = wait_on_sync_kiocb(&iocb); |
701 | return ret; | 716 | return ret; |
702 | } | 717 | } |
718 | EXPORT_SYMBOL(sock_recvmsg); | ||
703 | 719 | ||
704 | static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, | 720 | static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, |
705 | size_t size, int flags) | 721 | size_t size, int flags) |
@@ -732,6 +748,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg, | |||
732 | set_fs(oldfs); | 748 | set_fs(oldfs); |
733 | return result; | 749 | return result; |
734 | } | 750 | } |
751 | EXPORT_SYMBOL(kernel_recvmsg); | ||
735 | 752 | ||
736 | static void sock_aio_dtor(struct kiocb *iocb) | 753 | static void sock_aio_dtor(struct kiocb *iocb) |
737 | { | 754 | { |
@@ -754,7 +771,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page, | |||
754 | } | 771 | } |
755 | 772 | ||
756 | static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | 773 | static ssize_t sock_splice_read(struct file *file, loff_t *ppos, |
757 | struct pipe_inode_info *pipe, size_t len, | 774 | struct pipe_inode_info *pipe, size_t len, |
758 | unsigned int flags) | 775 | unsigned int flags) |
759 | { | 776 | { |
760 | struct socket *sock = file->private_data; | 777 | struct socket *sock = file->private_data; |
@@ -762,6 +779,8 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | |||
762 | if (unlikely(!sock->ops->splice_read)) | 779 | if (unlikely(!sock->ops->splice_read)) |
763 | return -EINVAL; | 780 | return -EINVAL; |
764 | 781 | ||
782 | sock_update_classid(sock->sk); | ||
783 | |||
765 | return sock->ops->splice_read(sock, ppos, pipe, len, flags); | 784 | return sock->ops->splice_read(sock, ppos, pipe, len, flags); |
766 | } | 785 | } |
767 | 786 | ||
@@ -865,7 +884,7 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
865 | */ | 884 | */ |
866 | 885 | ||
867 | static DEFINE_MUTEX(br_ioctl_mutex); | 886 | static DEFINE_MUTEX(br_ioctl_mutex); |
868 | static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg) = NULL; | 887 | static int (*br_ioctl_hook) (struct net *, unsigned int cmd, void __user *arg); |
869 | 888 | ||
870 | void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *)) | 889 | void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *)) |
871 | { | 890 | { |
@@ -873,7 +892,6 @@ void brioctl_set(int (*hook) (struct net *, unsigned int, void __user *)) | |||
873 | br_ioctl_hook = hook; | 892 | br_ioctl_hook = hook; |
874 | mutex_unlock(&br_ioctl_mutex); | 893 | mutex_unlock(&br_ioctl_mutex); |
875 | } | 894 | } |
876 | |||
877 | EXPORT_SYMBOL(brioctl_set); | 895 | EXPORT_SYMBOL(brioctl_set); |
878 | 896 | ||
879 | static DEFINE_MUTEX(vlan_ioctl_mutex); | 897 | static DEFINE_MUTEX(vlan_ioctl_mutex); |
@@ -885,7 +903,6 @@ void vlan_ioctl_set(int (*hook) (struct net *, void __user *)) | |||
885 | vlan_ioctl_hook = hook; | 903 | vlan_ioctl_hook = hook; |
886 | mutex_unlock(&vlan_ioctl_mutex); | 904 | mutex_unlock(&vlan_ioctl_mutex); |
887 | } | 905 | } |
888 | |||
889 | EXPORT_SYMBOL(vlan_ioctl_set); | 906 | EXPORT_SYMBOL(vlan_ioctl_set); |
890 | 907 | ||
891 | static DEFINE_MUTEX(dlci_ioctl_mutex); | 908 | static DEFINE_MUTEX(dlci_ioctl_mutex); |
@@ -897,7 +914,6 @@ void dlci_ioctl_set(int (*hook) (unsigned int, void __user *)) | |||
897 | dlci_ioctl_hook = hook; | 914 | dlci_ioctl_hook = hook; |
898 | mutex_unlock(&dlci_ioctl_mutex); | 915 | mutex_unlock(&dlci_ioctl_mutex); |
899 | } | 916 | } |
900 | |||
901 | EXPORT_SYMBOL(dlci_ioctl_set); | 917 | EXPORT_SYMBOL(dlci_ioctl_set); |
902 | 918 | ||
903 | static long sock_do_ioctl(struct net *net, struct socket *sock, | 919 | static long sock_do_ioctl(struct net *net, struct socket *sock, |
@@ -1025,6 +1041,7 @@ out_release: | |||
1025 | sock = NULL; | 1041 | sock = NULL; |
1026 | goto out; | 1042 | goto out; |
1027 | } | 1043 | } |
1044 | EXPORT_SYMBOL(sock_create_lite); | ||
1028 | 1045 | ||
1029 | /* No kernel lock held - perfect */ | 1046 | /* No kernel lock held - perfect */ |
1030 | static unsigned int sock_poll(struct file *file, poll_table *wait) | 1047 | static unsigned int sock_poll(struct file *file, poll_table *wait) |
@@ -1068,87 +1085,44 @@ static int sock_close(struct inode *inode, struct file *filp) | |||
1068 | * 1. fasync_list is modified only under process context socket lock | 1085 | * 1. fasync_list is modified only under process context socket lock |
1069 | * i.e. under semaphore. | 1086 | * i.e. under semaphore. |
1070 | * 2. fasync_list is used under read_lock(&sk->sk_callback_lock) | 1087 | * 2. fasync_list is used under read_lock(&sk->sk_callback_lock) |
1071 | * or under socket lock. | 1088 | * or under socket lock |
1072 | * 3. fasync_list can be used from softirq context, so that | ||
1073 | * modification under socket lock have to be enhanced with | ||
1074 | * write_lock_bh(&sk->sk_callback_lock). | ||
1075 | * --ANK (990710) | ||
1076 | */ | 1089 | */ |
1077 | 1090 | ||
1078 | static int sock_fasync(int fd, struct file *filp, int on) | 1091 | static int sock_fasync(int fd, struct file *filp, int on) |
1079 | { | 1092 | { |
1080 | struct fasync_struct *fa, *fna = NULL, **prev; | 1093 | struct socket *sock = filp->private_data; |
1081 | struct socket *sock; | 1094 | struct sock *sk = sock->sk; |
1082 | struct sock *sk; | ||
1083 | |||
1084 | if (on) { | ||
1085 | fna = kmalloc(sizeof(struct fasync_struct), GFP_KERNEL); | ||
1086 | if (fna == NULL) | ||
1087 | return -ENOMEM; | ||
1088 | } | ||
1089 | |||
1090 | sock = filp->private_data; | ||
1091 | 1095 | ||
1092 | sk = sock->sk; | 1096 | if (sk == NULL) |
1093 | if (sk == NULL) { | ||
1094 | kfree(fna); | ||
1095 | return -EINVAL; | 1097 | return -EINVAL; |
1096 | } | ||
1097 | 1098 | ||
1098 | lock_sock(sk); | 1099 | lock_sock(sk); |
1099 | 1100 | ||
1100 | spin_lock(&filp->f_lock); | 1101 | fasync_helper(fd, filp, on, &sock->wq->fasync_list); |
1101 | if (on) | ||
1102 | filp->f_flags |= FASYNC; | ||
1103 | else | ||
1104 | filp->f_flags &= ~FASYNC; | ||
1105 | spin_unlock(&filp->f_lock); | ||
1106 | |||
1107 | prev = &(sock->fasync_list); | ||
1108 | |||
1109 | for (fa = *prev; fa != NULL; prev = &fa->fa_next, fa = *prev) | ||
1110 | if (fa->fa_file == filp) | ||
1111 | break; | ||
1112 | |||
1113 | if (on) { | ||
1114 | if (fa != NULL) { | ||
1115 | write_lock_bh(&sk->sk_callback_lock); | ||
1116 | fa->fa_fd = fd; | ||
1117 | write_unlock_bh(&sk->sk_callback_lock); | ||
1118 | 1102 | ||
1119 | kfree(fna); | 1103 | if (!sock->wq->fasync_list) |
1120 | goto out; | 1104 | sock_reset_flag(sk, SOCK_FASYNC); |
1121 | } | 1105 | else |
1122 | fna->fa_file = filp; | ||
1123 | fna->fa_fd = fd; | ||
1124 | fna->magic = FASYNC_MAGIC; | ||
1125 | fna->fa_next = sock->fasync_list; | ||
1126 | write_lock_bh(&sk->sk_callback_lock); | ||
1127 | sock->fasync_list = fna; | ||
1128 | sock_set_flag(sk, SOCK_FASYNC); | 1106 | sock_set_flag(sk, SOCK_FASYNC); |
1129 | write_unlock_bh(&sk->sk_callback_lock); | ||
1130 | } else { | ||
1131 | if (fa != NULL) { | ||
1132 | write_lock_bh(&sk->sk_callback_lock); | ||
1133 | *prev = fa->fa_next; | ||
1134 | if (!sock->fasync_list) | ||
1135 | sock_reset_flag(sk, SOCK_FASYNC); | ||
1136 | write_unlock_bh(&sk->sk_callback_lock); | ||
1137 | kfree(fa); | ||
1138 | } | ||
1139 | } | ||
1140 | 1107 | ||
1141 | out: | 1108 | release_sock(sk); |
1142 | release_sock(sock->sk); | ||
1143 | return 0; | 1109 | return 0; |
1144 | } | 1110 | } |
1145 | 1111 | ||
1146 | /* This function may be called only under socket lock or callback_lock */ | 1112 | /* This function may be called only under socket lock or callback_lock or rcu_lock */ |
1147 | 1113 | ||
1148 | int sock_wake_async(struct socket *sock, int how, int band) | 1114 | int sock_wake_async(struct socket *sock, int how, int band) |
1149 | { | 1115 | { |
1150 | if (!sock || !sock->fasync_list) | 1116 | struct socket_wq *wq; |
1117 | |||
1118 | if (!sock) | ||
1119 | return -1; | ||
1120 | rcu_read_lock(); | ||
1121 | wq = rcu_dereference(sock->wq); | ||
1122 | if (!wq || !wq->fasync_list) { | ||
1123 | rcu_read_unlock(); | ||
1151 | return -1; | 1124 | return -1; |
1125 | } | ||
1152 | switch (how) { | 1126 | switch (how) { |
1153 | case SOCK_WAKE_WAITD: | 1127 | case SOCK_WAKE_WAITD: |
1154 | if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags)) | 1128 | if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags)) |
@@ -1160,13 +1134,15 @@ int sock_wake_async(struct socket *sock, int how, int band) | |||
1160 | /* fall through */ | 1134 | /* fall through */ |
1161 | case SOCK_WAKE_IO: | 1135 | case SOCK_WAKE_IO: |
1162 | call_kill: | 1136 | call_kill: |
1163 | __kill_fasync(sock->fasync_list, SIGIO, band); | 1137 | kill_fasync(&wq->fasync_list, SIGIO, band); |
1164 | break; | 1138 | break; |
1165 | case SOCK_WAKE_URG: | 1139 | case SOCK_WAKE_URG: |
1166 | __kill_fasync(sock->fasync_list, SIGURG, band); | 1140 | kill_fasync(&wq->fasync_list, SIGURG, band); |
1167 | } | 1141 | } |
1142 | rcu_read_unlock(); | ||
1168 | return 0; | 1143 | return 0; |
1169 | } | 1144 | } |
1145 | EXPORT_SYMBOL(sock_wake_async); | ||
1170 | 1146 | ||
1171 | static int __sock_create(struct net *net, int family, int type, int protocol, | 1147 | static int __sock_create(struct net *net, int family, int type, int protocol, |
1172 | struct socket **res, int kern) | 1148 | struct socket **res, int kern) |
@@ -1285,11 +1261,13 @@ int sock_create(int family, int type, int protocol, struct socket **res) | |||
1285 | { | 1261 | { |
1286 | return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0); | 1262 | return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0); |
1287 | } | 1263 | } |
1264 | EXPORT_SYMBOL(sock_create); | ||
1288 | 1265 | ||
1289 | int sock_create_kern(int family, int type, int protocol, struct socket **res) | 1266 | int sock_create_kern(int family, int type, int protocol, struct socket **res) |
1290 | { | 1267 | { |
1291 | return __sock_create(&init_net, family, type, protocol, res, 1); | 1268 | return __sock_create(&init_net, family, type, protocol, res, 1); |
1292 | } | 1269 | } |
1270 | EXPORT_SYMBOL(sock_create_kern); | ||
1293 | 1271 | ||
1294 | SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) | 1272 | SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) |
1295 | { | 1273 | { |
@@ -1494,7 +1472,8 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, | |||
1494 | goto out; | 1472 | goto out; |
1495 | 1473 | ||
1496 | err = -ENFILE; | 1474 | err = -ENFILE; |
1497 | if (!(newsock = sock_alloc())) | 1475 | newsock = sock_alloc(); |
1476 | if (!newsock) | ||
1498 | goto out_put; | 1477 | goto out_put; |
1499 | 1478 | ||
1500 | newsock->type = sock->type; | 1479 | newsock->type = sock->type; |
@@ -1881,8 +1860,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) | |||
1881 | if (MSG_CMSG_COMPAT & flags) { | 1860 | if (MSG_CMSG_COMPAT & flags) { |
1882 | if (get_compat_msghdr(&msg_sys, msg_compat)) | 1861 | if (get_compat_msghdr(&msg_sys, msg_compat)) |
1883 | return -EFAULT; | 1862 | return -EFAULT; |
1884 | } | 1863 | } else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr))) |
1885 | else if (copy_from_user(&msg_sys, msg, sizeof(struct msghdr))) | ||
1886 | return -EFAULT; | 1864 | return -EFAULT; |
1887 | 1865 | ||
1888 | sock = sockfd_lookup_light(fd, &err, &fput_needed); | 1866 | sock = sockfd_lookup_light(fd, &err, &fput_needed); |
@@ -1984,8 +1962,7 @@ static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg, | |||
1984 | if (MSG_CMSG_COMPAT & flags) { | 1962 | if (MSG_CMSG_COMPAT & flags) { |
1985 | if (get_compat_msghdr(msg_sys, msg_compat)) | 1963 | if (get_compat_msghdr(msg_sys, msg_compat)) |
1986 | return -EFAULT; | 1964 | return -EFAULT; |
1987 | } | 1965 | } else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr))) |
1988 | else if (copy_from_user(msg_sys, msg, sizeof(struct msghdr))) | ||
1989 | return -EFAULT; | 1966 | return -EFAULT; |
1990 | 1967 | ||
1991 | err = -EMSGSIZE; | 1968 | err = -EMSGSIZE; |
@@ -2211,10 +2188,10 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, | |||
2211 | /* Argument list sizes for sys_socketcall */ | 2188 | /* Argument list sizes for sys_socketcall */ |
2212 | #define AL(x) ((x) * sizeof(unsigned long)) | 2189 | #define AL(x) ((x) * sizeof(unsigned long)) |
2213 | static const unsigned char nargs[20] = { | 2190 | static const unsigned char nargs[20] = { |
2214 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 2191 | AL(0), AL(3), AL(3), AL(3), AL(2), AL(3), |
2215 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 2192 | AL(3), AL(3), AL(4), AL(4), AL(4), AL(6), |
2216 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 2193 | AL(6), AL(2), AL(5), AL(5), AL(3), AL(3), |
2217 | AL(4),AL(5) | 2194 | AL(4), AL(5) |
2218 | }; | 2195 | }; |
2219 | 2196 | ||
2220 | #undef AL | 2197 | #undef AL |
@@ -2360,6 +2337,7 @@ int sock_register(const struct net_proto_family *ops) | |||
2360 | printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family); | 2337 | printk(KERN_INFO "NET: Registered protocol family %d\n", ops->family); |
2361 | return err; | 2338 | return err; |
2362 | } | 2339 | } |
2340 | EXPORT_SYMBOL(sock_register); | ||
2363 | 2341 | ||
2364 | /** | 2342 | /** |
2365 | * sock_unregister - remove a protocol handler | 2343 | * sock_unregister - remove a protocol handler |
@@ -2386,6 +2364,7 @@ void sock_unregister(int family) | |||
2386 | 2364 | ||
2387 | printk(KERN_INFO "NET: Unregistered protocol family %d\n", family); | 2365 | printk(KERN_INFO "NET: Unregistered protocol family %d\n", family); |
2388 | } | 2366 | } |
2367 | EXPORT_SYMBOL(sock_unregister); | ||
2389 | 2368 | ||
2390 | static int __init sock_init(void) | 2369 | static int __init sock_init(void) |
2391 | { | 2370 | { |
@@ -2415,6 +2394,10 @@ static int __init sock_init(void) | |||
2415 | netfilter_init(); | 2394 | netfilter_init(); |
2416 | #endif | 2395 | #endif |
2417 | 2396 | ||
2397 | #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING | ||
2398 | skb_timestamping_init(); | ||
2399 | #endif | ||
2400 | |||
2418 | return 0; | 2401 | return 0; |
2419 | } | 2402 | } |
2420 | 2403 | ||
@@ -2510,13 +2493,13 @@ static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32) | |||
2510 | ifc.ifc_req = NULL; | 2493 | ifc.ifc_req = NULL; |
2511 | uifc = compat_alloc_user_space(sizeof(struct ifconf)); | 2494 | uifc = compat_alloc_user_space(sizeof(struct ifconf)); |
2512 | } else { | 2495 | } else { |
2513 | size_t len =((ifc32.ifc_len / sizeof (struct compat_ifreq)) + 1) * | 2496 | size_t len = ((ifc32.ifc_len / sizeof(struct compat_ifreq)) + 1) * |
2514 | sizeof (struct ifreq); | 2497 | sizeof(struct ifreq); |
2515 | uifc = compat_alloc_user_space(sizeof(struct ifconf) + len); | 2498 | uifc = compat_alloc_user_space(sizeof(struct ifconf) + len); |
2516 | ifc.ifc_len = len; | 2499 | ifc.ifc_len = len; |
2517 | ifr = ifc.ifc_req = (void __user *)(uifc + 1); | 2500 | ifr = ifc.ifc_req = (void __user *)(uifc + 1); |
2518 | ifr32 = compat_ptr(ifc32.ifcbuf); | 2501 | ifr32 = compat_ptr(ifc32.ifcbuf); |
2519 | for (i = 0; i < ifc32.ifc_len; i += sizeof (struct compat_ifreq)) { | 2502 | for (i = 0; i < ifc32.ifc_len; i += sizeof(struct compat_ifreq)) { |
2520 | if (copy_in_user(ifr, ifr32, sizeof(struct compat_ifreq))) | 2503 | if (copy_in_user(ifr, ifr32, sizeof(struct compat_ifreq))) |
2521 | return -EFAULT; | 2504 | return -EFAULT; |
2522 | ifr++; | 2505 | ifr++; |
@@ -2536,9 +2519,9 @@ static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32) | |||
2536 | ifr = ifc.ifc_req; | 2519 | ifr = ifc.ifc_req; |
2537 | ifr32 = compat_ptr(ifc32.ifcbuf); | 2520 | ifr32 = compat_ptr(ifc32.ifcbuf); |
2538 | for (i = 0, j = 0; | 2521 | for (i = 0, j = 0; |
2539 | i + sizeof (struct compat_ifreq) <= ifc32.ifc_len && j < ifc.ifc_len; | 2522 | i + sizeof(struct compat_ifreq) <= ifc32.ifc_len && j < ifc.ifc_len; |
2540 | i += sizeof (struct compat_ifreq), j += sizeof (struct ifreq)) { | 2523 | i += sizeof(struct compat_ifreq), j += sizeof(struct ifreq)) { |
2541 | if (copy_in_user(ifr32, ifr, sizeof (struct compat_ifreq))) | 2524 | if (copy_in_user(ifr32, ifr, sizeof(struct compat_ifreq))) |
2542 | return -EFAULT; | 2525 | return -EFAULT; |
2543 | ifr32++; | 2526 | ifr32++; |
2544 | ifr++; | 2527 | ifr++; |
@@ -2587,7 +2570,7 @@ static int compat_siocwandev(struct net *net, struct compat_ifreq __user *uifr32 | |||
2587 | compat_uptr_t uptr32; | 2570 | compat_uptr_t uptr32; |
2588 | struct ifreq __user *uifr; | 2571 | struct ifreq __user *uifr; |
2589 | 2572 | ||
2590 | uifr = compat_alloc_user_space(sizeof (*uifr)); | 2573 | uifr = compat_alloc_user_space(sizeof(*uifr)); |
2591 | if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) | 2574 | if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) |
2592 | return -EFAULT; | 2575 | return -EFAULT; |
2593 | 2576 | ||
@@ -2621,9 +2604,9 @@ static int bond_ioctl(struct net *net, unsigned int cmd, | |||
2621 | return -EFAULT; | 2604 | return -EFAULT; |
2622 | 2605 | ||
2623 | old_fs = get_fs(); | 2606 | old_fs = get_fs(); |
2624 | set_fs (KERNEL_DS); | 2607 | set_fs(KERNEL_DS); |
2625 | err = dev_ioctl(net, cmd, &kifr); | 2608 | err = dev_ioctl(net, cmd, &kifr); |
2626 | set_fs (old_fs); | 2609 | set_fs(old_fs); |
2627 | 2610 | ||
2628 | return err; | 2611 | return err; |
2629 | case SIOCBONDSLAVEINFOQUERY: | 2612 | case SIOCBONDSLAVEINFOQUERY: |
@@ -2642,7 +2625,7 @@ static int bond_ioctl(struct net *net, unsigned int cmd, | |||
2642 | return dev_ioctl(net, cmd, uifr); | 2625 | return dev_ioctl(net, cmd, uifr); |
2643 | default: | 2626 | default: |
2644 | return -EINVAL; | 2627 | return -EINVAL; |
2645 | }; | 2628 | } |
2646 | } | 2629 | } |
2647 | 2630 | ||
2648 | static int siocdevprivate_ioctl(struct net *net, unsigned int cmd, | 2631 | static int siocdevprivate_ioctl(struct net *net, unsigned int cmd, |
@@ -2730,9 +2713,9 @@ static int compat_sioc_ifmap(struct net *net, unsigned int cmd, | |||
2730 | return -EFAULT; | 2713 | return -EFAULT; |
2731 | 2714 | ||
2732 | old_fs = get_fs(); | 2715 | old_fs = get_fs(); |
2733 | set_fs (KERNEL_DS); | 2716 | set_fs(KERNEL_DS); |
2734 | err = dev_ioctl(net, cmd, (void __user *)&ifr); | 2717 | err = dev_ioctl(net, cmd, (void __user *)&ifr); |
2735 | set_fs (old_fs); | 2718 | set_fs(old_fs); |
2736 | 2719 | ||
2737 | if (cmd == SIOCGIFMAP && !err) { | 2720 | if (cmd == SIOCGIFMAP && !err) { |
2738 | err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name)); | 2721 | err = copy_to_user(uifr32, &ifr, sizeof(ifr.ifr_name)); |
@@ -2754,7 +2737,7 @@ static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uif | |||
2754 | compat_uptr_t uptr32; | 2737 | compat_uptr_t uptr32; |
2755 | struct ifreq __user *uifr; | 2738 | struct ifreq __user *uifr; |
2756 | 2739 | ||
2757 | uifr = compat_alloc_user_space(sizeof (*uifr)); | 2740 | uifr = compat_alloc_user_space(sizeof(*uifr)); |
2758 | if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) | 2741 | if (copy_in_user(uifr, uifr32, sizeof(struct compat_ifreq))) |
2759 | return -EFAULT; | 2742 | return -EFAULT; |
2760 | 2743 | ||
@@ -2770,20 +2753,20 @@ static int compat_siocshwtstamp(struct net *net, struct compat_ifreq __user *uif | |||
2770 | } | 2753 | } |
2771 | 2754 | ||
2772 | struct rtentry32 { | 2755 | struct rtentry32 { |
2773 | u32 rt_pad1; | 2756 | u32 rt_pad1; |
2774 | struct sockaddr rt_dst; /* target address */ | 2757 | struct sockaddr rt_dst; /* target address */ |
2775 | struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */ | 2758 | struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */ |
2776 | struct sockaddr rt_genmask; /* target network mask (IP) */ | 2759 | struct sockaddr rt_genmask; /* target network mask (IP) */ |
2777 | unsigned short rt_flags; | 2760 | unsigned short rt_flags; |
2778 | short rt_pad2; | 2761 | short rt_pad2; |
2779 | u32 rt_pad3; | 2762 | u32 rt_pad3; |
2780 | unsigned char rt_tos; | 2763 | unsigned char rt_tos; |
2781 | unsigned char rt_class; | 2764 | unsigned char rt_class; |
2782 | short rt_pad4; | 2765 | short rt_pad4; |
2783 | short rt_metric; /* +1 for binary compatibility! */ | 2766 | short rt_metric; /* +1 for binary compatibility! */ |
2784 | /* char * */ u32 rt_dev; /* forcing the device at add */ | 2767 | /* char * */ u32 rt_dev; /* forcing the device at add */ |
2785 | u32 rt_mtu; /* per route MTU/Window */ | 2768 | u32 rt_mtu; /* per route MTU/Window */ |
2786 | u32 rt_window; /* Window clamping */ | 2769 | u32 rt_window; /* Window clamping */ |
2787 | unsigned short rt_irtt; /* Initial RTT */ | 2770 | unsigned short rt_irtt; /* Initial RTT */ |
2788 | }; | 2771 | }; |
2789 | 2772 | ||
@@ -2813,29 +2796,29 @@ static int routing_ioctl(struct net *net, struct socket *sock, | |||
2813 | 2796 | ||
2814 | if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */ | 2797 | if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */ |
2815 | struct in6_rtmsg32 __user *ur6 = argp; | 2798 | struct in6_rtmsg32 __user *ur6 = argp; |
2816 | ret = copy_from_user (&r6.rtmsg_dst, &(ur6->rtmsg_dst), | 2799 | ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst), |
2817 | 3 * sizeof(struct in6_addr)); | 2800 | 3 * sizeof(struct in6_addr)); |
2818 | ret |= __get_user (r6.rtmsg_type, &(ur6->rtmsg_type)); | 2801 | ret |= __get_user(r6.rtmsg_type, &(ur6->rtmsg_type)); |
2819 | ret |= __get_user (r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len)); | 2802 | ret |= __get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len)); |
2820 | ret |= __get_user (r6.rtmsg_src_len, &(ur6->rtmsg_src_len)); | 2803 | ret |= __get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len)); |
2821 | ret |= __get_user (r6.rtmsg_metric, &(ur6->rtmsg_metric)); | 2804 | ret |= __get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric)); |
2822 | ret |= __get_user (r6.rtmsg_info, &(ur6->rtmsg_info)); | 2805 | ret |= __get_user(r6.rtmsg_info, &(ur6->rtmsg_info)); |
2823 | ret |= __get_user (r6.rtmsg_flags, &(ur6->rtmsg_flags)); | 2806 | ret |= __get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags)); |
2824 | ret |= __get_user (r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex)); | 2807 | ret |= __get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex)); |
2825 | 2808 | ||
2826 | r = (void *) &r6; | 2809 | r = (void *) &r6; |
2827 | } else { /* ipv4 */ | 2810 | } else { /* ipv4 */ |
2828 | struct rtentry32 __user *ur4 = argp; | 2811 | struct rtentry32 __user *ur4 = argp; |
2829 | ret = copy_from_user (&r4.rt_dst, &(ur4->rt_dst), | 2812 | ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst), |
2830 | 3 * sizeof(struct sockaddr)); | 2813 | 3 * sizeof(struct sockaddr)); |
2831 | ret |= __get_user (r4.rt_flags, &(ur4->rt_flags)); | 2814 | ret |= __get_user(r4.rt_flags, &(ur4->rt_flags)); |
2832 | ret |= __get_user (r4.rt_metric, &(ur4->rt_metric)); | 2815 | ret |= __get_user(r4.rt_metric, &(ur4->rt_metric)); |
2833 | ret |= __get_user (r4.rt_mtu, &(ur4->rt_mtu)); | 2816 | ret |= __get_user(r4.rt_mtu, &(ur4->rt_mtu)); |
2834 | ret |= __get_user (r4.rt_window, &(ur4->rt_window)); | 2817 | ret |= __get_user(r4.rt_window, &(ur4->rt_window)); |
2835 | ret |= __get_user (r4.rt_irtt, &(ur4->rt_irtt)); | 2818 | ret |= __get_user(r4.rt_irtt, &(ur4->rt_irtt)); |
2836 | ret |= __get_user (rtdev, &(ur4->rt_dev)); | 2819 | ret |= __get_user(rtdev, &(ur4->rt_dev)); |
2837 | if (rtdev) { | 2820 | if (rtdev) { |
2838 | ret |= copy_from_user (devname, compat_ptr(rtdev), 15); | 2821 | ret |= copy_from_user(devname, compat_ptr(rtdev), 15); |
2839 | r4.rt_dev = devname; devname[15] = 0; | 2822 | r4.rt_dev = devname; devname[15] = 0; |
2840 | } else | 2823 | } else |
2841 | r4.rt_dev = NULL; | 2824 | r4.rt_dev = NULL; |
@@ -2848,9 +2831,9 @@ static int routing_ioctl(struct net *net, struct socket *sock, | |||
2848 | goto out; | 2831 | goto out; |
2849 | } | 2832 | } |
2850 | 2833 | ||
2851 | set_fs (KERNEL_DS); | 2834 | set_fs(KERNEL_DS); |
2852 | ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r); | 2835 | ret = sock_do_ioctl(net, sock, cmd, (unsigned long) r); |
2853 | set_fs (old_fs); | 2836 | set_fs(old_fs); |
2854 | 2837 | ||
2855 | out: | 2838 | out: |
2856 | return ret; | 2839 | return ret; |
@@ -3013,11 +2996,13 @@ int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen) | |||
3013 | { | 2996 | { |
3014 | return sock->ops->bind(sock, addr, addrlen); | 2997 | return sock->ops->bind(sock, addr, addrlen); |
3015 | } | 2998 | } |
2999 | EXPORT_SYMBOL(kernel_bind); | ||
3016 | 3000 | ||
3017 | int kernel_listen(struct socket *sock, int backlog) | 3001 | int kernel_listen(struct socket *sock, int backlog) |
3018 | { | 3002 | { |
3019 | return sock->ops->listen(sock, backlog); | 3003 | return sock->ops->listen(sock, backlog); |
3020 | } | 3004 | } |
3005 | EXPORT_SYMBOL(kernel_listen); | ||
3021 | 3006 | ||
3022 | int kernel_accept(struct socket *sock, struct socket **newsock, int flags) | 3007 | int kernel_accept(struct socket *sock, struct socket **newsock, int flags) |
3023 | { | 3008 | { |
@@ -3042,24 +3027,28 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags) | |||
3042 | done: | 3027 | done: |
3043 | return err; | 3028 | return err; |
3044 | } | 3029 | } |
3030 | EXPORT_SYMBOL(kernel_accept); | ||
3045 | 3031 | ||
3046 | int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, | 3032 | int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen, |
3047 | int flags) | 3033 | int flags) |
3048 | { | 3034 | { |
3049 | return sock->ops->connect(sock, addr, addrlen, flags); | 3035 | return sock->ops->connect(sock, addr, addrlen, flags); |
3050 | } | 3036 | } |
3037 | EXPORT_SYMBOL(kernel_connect); | ||
3051 | 3038 | ||
3052 | int kernel_getsockname(struct socket *sock, struct sockaddr *addr, | 3039 | int kernel_getsockname(struct socket *sock, struct sockaddr *addr, |
3053 | int *addrlen) | 3040 | int *addrlen) |
3054 | { | 3041 | { |
3055 | return sock->ops->getname(sock, addr, addrlen, 0); | 3042 | return sock->ops->getname(sock, addr, addrlen, 0); |
3056 | } | 3043 | } |
3044 | EXPORT_SYMBOL(kernel_getsockname); | ||
3057 | 3045 | ||
3058 | int kernel_getpeername(struct socket *sock, struct sockaddr *addr, | 3046 | int kernel_getpeername(struct socket *sock, struct sockaddr *addr, |
3059 | int *addrlen) | 3047 | int *addrlen) |
3060 | { | 3048 | { |
3061 | return sock->ops->getname(sock, addr, addrlen, 1); | 3049 | return sock->ops->getname(sock, addr, addrlen, 1); |
3062 | } | 3050 | } |
3051 | EXPORT_SYMBOL(kernel_getpeername); | ||
3063 | 3052 | ||
3064 | int kernel_getsockopt(struct socket *sock, int level, int optname, | 3053 | int kernel_getsockopt(struct socket *sock, int level, int optname, |
3065 | char *optval, int *optlen) | 3054 | char *optval, int *optlen) |
@@ -3076,6 +3065,7 @@ int kernel_getsockopt(struct socket *sock, int level, int optname, | |||
3076 | set_fs(oldfs); | 3065 | set_fs(oldfs); |
3077 | return err; | 3066 | return err; |
3078 | } | 3067 | } |
3068 | EXPORT_SYMBOL(kernel_getsockopt); | ||
3079 | 3069 | ||
3080 | int kernel_setsockopt(struct socket *sock, int level, int optname, | 3070 | int kernel_setsockopt(struct socket *sock, int level, int optname, |
3081 | char *optval, unsigned int optlen) | 3071 | char *optval, unsigned int optlen) |
@@ -3092,15 +3082,19 @@ int kernel_setsockopt(struct socket *sock, int level, int optname, | |||
3092 | set_fs(oldfs); | 3082 | set_fs(oldfs); |
3093 | return err; | 3083 | return err; |
3094 | } | 3084 | } |
3085 | EXPORT_SYMBOL(kernel_setsockopt); | ||
3095 | 3086 | ||
3096 | int kernel_sendpage(struct socket *sock, struct page *page, int offset, | 3087 | int kernel_sendpage(struct socket *sock, struct page *page, int offset, |
3097 | size_t size, int flags) | 3088 | size_t size, int flags) |
3098 | { | 3089 | { |
3090 | sock_update_classid(sock->sk); | ||
3091 | |||
3099 | if (sock->ops->sendpage) | 3092 | if (sock->ops->sendpage) |
3100 | return sock->ops->sendpage(sock, page, offset, size, flags); | 3093 | return sock->ops->sendpage(sock, page, offset, size, flags); |
3101 | 3094 | ||
3102 | return sock_no_sendpage(sock, page, offset, size, flags); | 3095 | return sock_no_sendpage(sock, page, offset, size, flags); |
3103 | } | 3096 | } |
3097 | EXPORT_SYMBOL(kernel_sendpage); | ||
3104 | 3098 | ||
3105 | int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg) | 3099 | int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg) |
3106 | { | 3100 | { |
@@ -3113,33 +3107,10 @@ int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg) | |||
3113 | 3107 | ||
3114 | return err; | 3108 | return err; |
3115 | } | 3109 | } |
3110 | EXPORT_SYMBOL(kernel_sock_ioctl); | ||
3116 | 3111 | ||
3117 | int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how) | 3112 | int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how) |
3118 | { | 3113 | { |
3119 | return sock->ops->shutdown(sock, how); | 3114 | return sock->ops->shutdown(sock, how); |
3120 | } | 3115 | } |
3121 | |||
3122 | EXPORT_SYMBOL(sock_create); | ||
3123 | EXPORT_SYMBOL(sock_create_kern); | ||
3124 | EXPORT_SYMBOL(sock_create_lite); | ||
3125 | EXPORT_SYMBOL(sock_map_fd); | ||
3126 | EXPORT_SYMBOL(sock_recvmsg); | ||
3127 | EXPORT_SYMBOL(sock_register); | ||
3128 | EXPORT_SYMBOL(sock_release); | ||
3129 | EXPORT_SYMBOL(sock_sendmsg); | ||
3130 | EXPORT_SYMBOL(sock_unregister); | ||
3131 | EXPORT_SYMBOL(sock_wake_async); | ||
3132 | EXPORT_SYMBOL(sockfd_lookup); | ||
3133 | EXPORT_SYMBOL(kernel_sendmsg); | ||
3134 | EXPORT_SYMBOL(kernel_recvmsg); | ||
3135 | EXPORT_SYMBOL(kernel_bind); | ||
3136 | EXPORT_SYMBOL(kernel_listen); | ||
3137 | EXPORT_SYMBOL(kernel_accept); | ||
3138 | EXPORT_SYMBOL(kernel_connect); | ||
3139 | EXPORT_SYMBOL(kernel_getsockname); | ||
3140 | EXPORT_SYMBOL(kernel_getpeername); | ||
3141 | EXPORT_SYMBOL(kernel_getsockopt); | ||
3142 | EXPORT_SYMBOL(kernel_setsockopt); | ||
3143 | EXPORT_SYMBOL(kernel_sendpage); | ||
3144 | EXPORT_SYMBOL(kernel_sock_ioctl); | ||
3145 | EXPORT_SYMBOL(kernel_sock_shutdown); | 3116 | EXPORT_SYMBOL(kernel_sock_shutdown); |