This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / socket.c
index 275d8cf..200268d 100644 (file)
@@ -93,6 +93,8 @@
 
 #include <net/sock.h>
 #include <linux/netfilter.h>
+#include <linux/vs_base.h>
+#include <linux/vs_socket.h>
 
 static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
 static ssize_t sock_aio_read(struct kiocb *iocb, char __user *buf,
@@ -287,7 +289,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
        ei->socket.ops = NULL;
        ei->socket.sk = NULL;
        ei->socket.file = NULL;
-       ei->socket.passcred = 0;
+       ei->socket.flags = 0;
 
        return &ei->vfs_inode;
 }
@@ -401,7 +403,7 @@ int sock_map_fd(struct socket *sock)
 
                sock->file = file;
                file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops;
-               file->f_mode = FMODE_READ | FMODE_WRITE;
+               file->f_mode = 3;
                file->f_flags = O_RDWR;
                file->f_pos = 0;
                fd_install(fd, file);
@@ -531,7 +533,7 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
                                 struct msghdr *msg, size_t size)
 {
        struct sock_iocb *si = kiocb_to_siocb(iocb);
-       int err;
+       int err, len;
 
        si->sock = sock;
        si->scm = NULL;
@@ -542,7 +544,20 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
        if (err)
                return err;
 
-       return sock->ops->sendmsg(iocb, sock, msg, size);
+       len = sock->ops->sendmsg(iocb, sock, msg, size);
+       if (sock->sk) {
+               if (len == size)
+                       vx_sock_send(sock->sk, size);
+               else
+                       vx_sock_fail(sock->sk, size);
+       }
+       vxdprintk("__sock_sendmsg: %p[%p,%p,%p;%d]:%d/%d\n",
+               sock, sock->sk,
+               (sock->sk)?sock->sk->sk_nx_info:0,
+               (sock->sk)?sock->sk->sk_vx_info:0,
+               (sock->sk)?sock->sk->sk_xid:0,
+               size, len);
+       return len;
 }
 
 int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
@@ -559,28 +574,11 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
        return ret;
 }
 
-int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
-                  struct kvec *vec, size_t num, size_t size)
-{
-       mm_segment_t oldfs = get_fs();
-       int result;
-
-       set_fs(KERNEL_DS);
-       /*
-        * the following is safe, since for compiler definitions of kvec and
-        * iovec are identical, yielding the same in-core layout and alignment
-        */
-       msg->msg_iov = (struct iovec *)vec,
-       msg->msg_iovlen = num;
-       result = sock_sendmsg(sock, msg, size);
-       set_fs(oldfs);
-       return result;
-}
 
 static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, 
                                 struct msghdr *msg, size_t size, int flags)
 {
-       int err;
+       int err, len;
        struct sock_iocb *si = kiocb_to_siocb(iocb);
 
        si->sock = sock;
@@ -593,7 +591,16 @@ static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
        if (err)
                return err;
 
-       return sock->ops->recvmsg(iocb, sock, msg, size, flags);
+       len = sock->ops->recvmsg(iocb, sock, msg, size, flags);
+       if ((len >= 0) && sock->sk)
+               vx_sock_recv(sock->sk, len);
+       vxdprintk("__sock_recvmsg: %p[%p,%p,%p;%d]:%d/%d\n",
+               sock, sock->sk,
+               (sock->sk)?sock->sk->sk_nx_info:0,
+               (sock->sk)?sock->sk->sk_vx_info:0,
+               (sock->sk)?sock->sk->sk_xid:0,
+               size, len);
+       return len;
 }
 
 int sock_recvmsg(struct socket *sock, struct msghdr *msg, 
@@ -611,25 +618,6 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg,
        return ret;
 }
 
-int kernel_recvmsg(struct socket *sock, struct msghdr *msg, 
-                  struct kvec *vec, size_t num,
-                  size_t size, int flags)
-{
-       mm_segment_t oldfs = get_fs();
-       int result;
-
-       set_fs(KERNEL_DS);
-       /*
-        * the following is safe, since for compiler definitions of kvec and
-        * iovec are identical, yielding the same in-core layout and alignment
-        */
-       msg->msg_iov = (struct iovec *)vec,
-       msg->msg_iovlen = num;
-       result = sock_recvmsg(sock, msg, size, flags);
-       set_fs(oldfs);
-       return result;
-}
-
 static void sock_aio_dtor(struct kiocb *iocb)
 {
        kfree(iocb->private);
@@ -727,6 +715,9 @@ ssize_t sock_sendpage(struct file *file, struct page *page,
        struct socket *sock;
        int flags;
 
+       if (ppos != &file->f_pos)
+               return -ESPIPE;
+
        sock = SOCKET_I(file->f_dentry->d_inode);
 
        flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
@@ -1085,6 +1076,10 @@ static int __sock_create(int family, int type, int protocol, struct socket **res
        if (type < 0 || type >= SOCK_MAX)
                return -EINVAL;
 
+       /* disable IPv6 inside vservers for now */
+       if (family == PF_INET6 && !vx_check(0, VX_ADMIN))
+               return -EAFNOSUPPORT;
+
        /* Compatibility.
 
           This uglymoron is moved from INET layer to here to avoid
@@ -1193,6 +1188,7 @@ asmlinkage long sys_socket(int family, int type, int protocol)
        if (retval < 0)
                goto out;
 
+       set_bit(SOCK_USER_SOCKET, &sock->flags);
        retval = sock_map_fd(sock);
        if (retval < 0)
                goto out_release;
@@ -1223,10 +1219,12 @@ asmlinkage long sys_socketpair(int family, int type, int protocol, int __user *u
        err = sock_create(family, type, protocol, &sock1);
        if (err < 0)
                goto out;
+       set_bit(SOCK_USER_SOCKET, &sock1->flags);
 
        err = sock_create(family, type, protocol, &sock2);
        if (err < 0)
                goto out_release_1;
+       set_bit(SOCK_USER_SOCKET, &sock2->flags);
 
        err = sock1->ops->socketpair(sock1, sock2);
        if (err < 0) 
@@ -2102,5 +2100,3 @@ EXPORT_SYMBOL(sock_sendmsg);
 EXPORT_SYMBOL(sock_unregister);
 EXPORT_SYMBOL(sock_wake_async);
 EXPORT_SYMBOL(sockfd_lookup);
-EXPORT_SYMBOL(kernel_sendmsg);
-EXPORT_SYMBOL(kernel_recvmsg);