aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/net/socket.c b/net/socket.c
index 6f2a17881972..e1bd5d84d7bf 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -70,6 +70,8 @@
70#include <linux/seq_file.h> 70#include <linux/seq_file.h>
71#include <linux/wanrouter.h> 71#include <linux/wanrouter.h>
72#include <linux/if_bridge.h> 72#include <linux/if_bridge.h>
73#include <linux/if_frad.h>
74#include <linux/if_vlan.h>
73#include <linux/init.h> 75#include <linux/init.h>
74#include <linux/poll.h> 76#include <linux/poll.h>
75#include <linux/cache.h> 77#include <linux/cache.h>
@@ -272,7 +274,7 @@ int move_addr_to_user(void *kaddr, int klen, void __user *uaddr, int __user *ule
272 274
273#define SOCKFS_MAGIC 0x534F434B 275#define SOCKFS_MAGIC 0x534F434B
274 276
275static kmem_cache_t * sock_inode_cachep; 277static kmem_cache_t * sock_inode_cachep __read_mostly;
276 278
277static struct inode *sock_alloc_inode(struct super_block *sb) 279static struct inode *sock_alloc_inode(struct super_block *sb)
278{ 280{
@@ -331,7 +333,7 @@ static struct super_block *sockfs_get_sb(struct file_system_type *fs_type,
331 return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC); 333 return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC);
332} 334}
333 335
334static struct vfsmount *sock_mnt; 336static struct vfsmount *sock_mnt __read_mostly;
335 337
336static struct file_system_type sock_fs_type = { 338static struct file_system_type sock_fs_type = {
337 .name = "sockfs", 339 .name = "sockfs",
@@ -404,6 +406,7 @@ int sock_map_fd(struct socket *sock)
404 file->f_mode = FMODE_READ | FMODE_WRITE; 406 file->f_mode = FMODE_READ | FMODE_WRITE;
405 file->f_flags = O_RDWR; 407 file->f_flags = O_RDWR;
406 file->f_pos = 0; 408 file->f_pos = 0;
409 file->private_data = sock;
407 fd_install(fd, file); 410 fd_install(fd, file);
408 } 411 }
409 412
@@ -436,6 +439,9 @@ struct socket *sockfd_lookup(int fd, int *err)
436 return NULL; 439 return NULL;
437 } 440 }
438 441
442 if (file->f_op == &socket_file_ops)
443 return file->private_data; /* set in sock_map_fd */
444
439 inode = file->f_dentry->d_inode; 445 inode = file->f_dentry->d_inode;
440 if (!S_ISSOCK(inode->i_mode)) { 446 if (!S_ISSOCK(inode->i_mode)) {
441 *err = -ENOTSOCK; 447 *err = -ENOTSOCK;
@@ -661,7 +667,7 @@ static ssize_t sock_aio_read(struct kiocb *iocb, char __user *ubuf,
661 } 667 }
662 iocb->private = x; 668 iocb->private = x;
663 x->kiocb = iocb; 669 x->kiocb = iocb;
664 sock = SOCKET_I(iocb->ki_filp->f_dentry->d_inode); 670 sock = iocb->ki_filp->private_data;
665 671
666 x->async_msg.msg_name = NULL; 672 x->async_msg.msg_name = NULL;
667 x->async_msg.msg_namelen = 0; 673 x->async_msg.msg_namelen = 0;
@@ -703,7 +709,7 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const char __user *ubuf,
703 } 709 }
704 iocb->private = x; 710 iocb->private = x;
705 x->kiocb = iocb; 711 x->kiocb = iocb;
706 sock = SOCKET_I(iocb->ki_filp->f_dentry->d_inode); 712 sock = iocb->ki_filp->private_data;
707 713
708 x->async_msg.msg_name = NULL; 714 x->async_msg.msg_name = NULL;
709 x->async_msg.msg_namelen = 0; 715 x->async_msg.msg_namelen = 0;
@@ -720,13 +726,13 @@ static ssize_t sock_aio_write(struct kiocb *iocb, const char __user *ubuf,
720 return __sock_sendmsg(iocb, sock, &x->async_msg, size); 726 return __sock_sendmsg(iocb, sock, &x->async_msg, size);
721} 727}
722 728
723ssize_t sock_sendpage(struct file *file, struct page *page, 729static ssize_t sock_sendpage(struct file *file, struct page *page,
724 int offset, size_t size, loff_t *ppos, int more) 730 int offset, size_t size, loff_t *ppos, int more)
725{ 731{
726 struct socket *sock; 732 struct socket *sock;
727 int flags; 733 int flags;
728 734
729 sock = SOCKET_I(file->f_dentry->d_inode); 735 sock = file->private_data;
730 736
731 flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT; 737 flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
732 if (more) 738 if (more)
@@ -735,14 +741,14 @@ ssize_t sock_sendpage(struct file *file, struct page *page,
735 return sock->ops->sendpage(sock, page, offset, size, flags); 741 return sock->ops->sendpage(sock, page, offset, size, flags);
736} 742}
737 743
738static int sock_readv_writev(int type, struct inode * inode, 744static int sock_readv_writev(int type,
739 struct file * file, const struct iovec * iov, 745 struct file * file, const struct iovec * iov,
740 long count, size_t size) 746 long count, size_t size)
741{ 747{
742 struct msghdr msg; 748 struct msghdr msg;
743 struct socket *sock; 749 struct socket *sock;
744 750
745 sock = SOCKET_I(inode); 751 sock = file->private_data;
746 752
747 msg.msg_name = NULL; 753 msg.msg_name = NULL;
748 msg.msg_namelen = 0; 754 msg.msg_namelen = 0;
@@ -769,7 +775,7 @@ static ssize_t sock_readv(struct file *file, const struct iovec *vector,
769 int i; 775 int i;
770 for (i = 0 ; i < count ; i++) 776 for (i = 0 ; i < count ; i++)
771 tot_len += vector[i].iov_len; 777 tot_len += vector[i].iov_len;
772 return sock_readv_writev(VERIFY_WRITE, file->f_dentry->d_inode, 778 return sock_readv_writev(VERIFY_WRITE,
773 file, vector, count, tot_len); 779 file, vector, count, tot_len);
774} 780}
775 781
@@ -780,7 +786,7 @@ static ssize_t sock_writev(struct file *file, const struct iovec *vector,
780 int i; 786 int i;
781 for (i = 0 ; i < count ; i++) 787 for (i = 0 ; i < count ; i++)
782 tot_len += vector[i].iov_len; 788 tot_len += vector[i].iov_len;
783 return sock_readv_writev(VERIFY_READ, file->f_dentry->d_inode, 789 return sock_readv_writev(VERIFY_READ,
784 file, vector, count, tot_len); 790 file, vector, count, tot_len);
785} 791}
786 792
@@ -834,7 +840,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
834 void __user *argp = (void __user *)arg; 840 void __user *argp = (void __user *)arg;
835 int pid, err; 841 int pid, err;
836 842
837 sock = SOCKET_I(file->f_dentry->d_inode); 843 sock = file->private_data;
838 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) { 844 if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
839 err = dev_ioctl(cmd, argp); 845 err = dev_ioctl(cmd, argp);
840 } else 846 } else
@@ -933,18 +939,18 @@ static unsigned int sock_poll(struct file *file, poll_table * wait)
933 /* 939 /*
934 * We can't return errors to poll, so it's either yes or no. 940 * We can't return errors to poll, so it's either yes or no.
935 */ 941 */
936 sock = SOCKET_I(file->f_dentry->d_inode); 942 sock = file->private_data;
937 return sock->ops->poll(file, sock, wait); 943 return sock->ops->poll(file, sock, wait);
938} 944}
939 945
940static int sock_mmap(struct file * file, struct vm_area_struct * vma) 946static int sock_mmap(struct file * file, struct vm_area_struct * vma)
941{ 947{
942 struct socket *sock = SOCKET_I(file->f_dentry->d_inode); 948 struct socket *sock = file->private_data;
943 949
944 return sock->ops->mmap(file, sock, vma); 950 return sock->ops->mmap(file, sock, vma);
945} 951}
946 952
947int sock_close(struct inode *inode, struct file *filp) 953static int sock_close(struct inode *inode, struct file *filp)
948{ 954{
949 /* 955 /*
950 * It was possible the inode is NULL we were 956 * It was possible the inode is NULL we were
@@ -989,7 +995,7 @@ static int sock_fasync(int fd, struct file *filp, int on)
989 return -ENOMEM; 995 return -ENOMEM;
990 } 996 }
991 997
992 sock = SOCKET_I(filp->f_dentry->d_inode); 998 sock = filp->private_data;
993 999
994 if ((sk=sock->sk) == NULL) { 1000 if ((sk=sock->sk) == NULL) {
995 kfree(fna); 1001 kfree(fna);
@@ -2023,9 +2029,6 @@ int sock_unregister(int family)
2023 return 0; 2029 return 0;
2024} 2030}
2025 2031
2026
2027extern void sk_init(void);
2028
2029void __init sock_init(void) 2032void __init sock_init(void)
2030{ 2033{
2031 /* 2034 /*