This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / core / sock.c
index 9146be7..36e0a9e 100644 (file)
 #include <linux/ipsec.h>
 
 #include <linux/filter.h>
+#include <linux/vs_socket.h>
 
 #ifdef CONFIG_INET
 #include <net/tcp.h>
@@ -324,7 +325,10 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                        break;
 
                case SO_PASSCRED:
-                       sock->passcred = valbool;
+                       if (valbool)
+                               set_bit(SOCK_PASS_CRED, &sock->flags);
+                       else
+                               clear_bit(SOCK_PASS_CRED, &sock->flags);
                        break;
 
                case SO_TIMESTAMP:
@@ -548,7 +552,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                        break; 
 
                case SO_PASSCRED:
-                       v.val = sock->passcred;
+                       v.val = test_bit(SOCK_PASS_CRED, &sock->flags)?1:0;
                        break;
 
                case SO_PEERCRED:
@@ -623,6 +627,8 @@ struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab)
                        sock_lock_init(sk);
                }
                sk->sk_slab = slab;
+               sock_vx_init(sk);
+               sock_nx_init(sk);
                
                if (security_sk_alloc(sk, family, priority)) {
                        kmem_cache_free(slab, sk);
@@ -652,7 +658,17 @@ void sk_free(struct sock *sk)
                printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n",
                       __FUNCTION__, atomic_read(&sk->sk_omem_alloc));
 
+       /*
+        * If sendmsg cached page exists, toss it.
+        */
+       if (sk->sk_sndmsg_page) {
+               __free_page(sk->sk_sndmsg_page);
+               sk->sk_sndmsg_page = NULL;
+       }
+
        security_sk_free(sk);
+       BUG_ON(sk->sk_vx_info);
+       BUG_ON(sk->sk_nx_info);
        kmem_cache_free(sk->sk_slab, sk);
        module_put(owner);
 }
@@ -1057,12 +1073,30 @@ int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *
 ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
 {
        ssize_t res;
-       struct msghdr msg = {.msg_flags = flags};
-       struct kvec iov;
-       char *kaddr = kmap(page);
-       iov.iov_base = kaddr + offset;
+       struct msghdr msg;
+       struct iovec iov;
+       mm_segment_t old_fs;
+       char *kaddr;
+
+       kaddr = kmap(page);
+
+       msg.msg_name = NULL;
+       msg.msg_namelen = 0;
+       msg.msg_iov = &iov;
+       msg.msg_iovlen = 1;
+       msg.msg_control = NULL;
+       msg.msg_controllen = 0;
+       msg.msg_flags = flags;
+
+       /* This cast is ok because of the "set_fs(KERNEL_DS)" */
+       iov.iov_base = (void __user *) (kaddr + offset);
        iov.iov_len = size;
-       res = kernel_sendmsg(sock, &msg, &iov, 1, size);
+
+       old_fs = get_fs();
+       set_fs(KERNEL_DS);
+       res = sock_sendmsg(sock, &msg, size);
+       set_fs(old_fs);
+
        kunmap(page);
        return res;
 }
@@ -1195,6 +1229,11 @@ void sock_init_data(struct socket *sock, struct sock *sk)
        sk->sk_stamp.tv_sec     = -1L;
        sk->sk_stamp.tv_usec    = -1L;
 
+       sk->sk_vx_info          =       NULL;
+       sk->sk_xid              =       0;
+       sk->sk_nx_info          =       NULL;
+       sk->sk_nid              =       0;
+
        atomic_set(&sk->sk_refcnt, 1);
 }