diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-09-08 05:43:49 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-08 05:43:49 -0400 |
| commit | 1d6ae775d7a948c9575658eb41184fd2e506c0df (patch) | |
| tree | 8128a28e89d82f13bb8e3a2160382240c66e2816 /net/socket.c | |
| parent | 739cdbf1d8f0739b80035b80d69d871e33749b86 (diff) | |
| parent | caf39e87cc1182f7dae84eefc43ca14d54c78ef9 (diff) | |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 41 |
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 | ||
| 275 | static kmem_cache_t * sock_inode_cachep; | 277 | static kmem_cache_t * sock_inode_cachep __read_mostly; |
| 276 | 278 | ||
| 277 | static struct inode *sock_alloc_inode(struct super_block *sb) | 279 | static 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 | ||
| 334 | static struct vfsmount *sock_mnt; | 336 | static struct vfsmount *sock_mnt __read_mostly; |
| 335 | 337 | ||
| 336 | static struct file_system_type sock_fs_type = { | 338 | static 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 | ||
| 723 | ssize_t sock_sendpage(struct file *file, struct page *page, | 729 | static 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 | ||
| 738 | static int sock_readv_writev(int type, struct inode * inode, | 744 | static 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 | ||
| 940 | static int sock_mmap(struct file * file, struct vm_area_struct * vma) | 946 | static 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 | ||
| 947 | int sock_close(struct inode *inode, struct file *filp) | 953 | static 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 | |||
| 2027 | extern void sk_init(void); | ||
| 2028 | |||
| 2029 | void __init sock_init(void) | 2032 | void __init sock_init(void) |
| 2030 | { | 2033 | { |
| 2031 | /* | 2034 | /* |
