This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / core / sock.c
index 8312e83..91608bc 100644 (file)
 #include <linux/ipsec.h>
 
 #include <linux/filter.h>
+#include <linux/vs_socket.h>
 
 #ifdef CONFIG_INET
 #include <net/tcp.h>
@@ -179,7 +180,7 @@ static void sock_disable_timestamp(struct sock *sk)
 {      
        if (sock_flag(sk, SOCK_TIMESTAMP)) { 
                sock_reset_flag(sk, SOCK_TIMESTAMP);
-               net_disable_timestamp();
+               atomic_dec(&netstamp_needed);
        }
 }
 
@@ -333,8 +334,25 @@ 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;
+
+#if defined(CONFIG_VNET) || defined(CONFIG_VNET_MODULE)
+               case SO_SETXID:
+                       if (current->xid) {
+                               ret = -EPERM;
+                               break;
+                       }
+                       if (val < 0 || val > MAX_S_CONTEXT) {
+                               ret = -EINVAL;
+                               break;
+                       }
+                       sk->sk_xid = val;
                        break;
+#endif
 
                case SO_TIMESTAMP:
                        sk->sk_rcvtstamp = valbool;
@@ -557,7 +575,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:
@@ -632,6 +650,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);
@@ -662,6 +682,8 @@ void sk_free(struct sock *sk)
                       __FUNCTION__, atomic_read(&sk->sk_omem_alloc));
 
        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);
 }
@@ -1175,8 +1197,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)
        } else
                sk->sk_sleep    =       NULL;
 
-       rwlock_init(&sk->sk_dst_lock);
-       rwlock_init(&sk->sk_callback_lock);
+       sk->sk_dst_lock         =       RW_LOCK_UNLOCKED;
+       sk->sk_callback_lock    =       RW_LOCK_UNLOCKED;
 
        sk->sk_state_change     =       sock_def_wakeup;
        sk->sk_data_ready       =       sock_def_readable;
@@ -1199,6 +1221,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);
 }
 
@@ -1226,6 +1253,9 @@ void fastcall release_sock(struct sock *sk)
 }
 EXPORT_SYMBOL(release_sock);
 
+/* When > 0 there are consumers of rx skb time stamps */
+atomic_t netstamp_needed = ATOMIC_INIT(0); 
+
 int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp)
 { 
        if (!sock_flag(sk, SOCK_TIMESTAMP))
@@ -1243,7 +1273,7 @@ void sock_enable_timestamp(struct sock *sk)
 {      
        if (!sock_flag(sk, SOCK_TIMESTAMP)) { 
                sock_set_flag(sk, SOCK_TIMESTAMP);
-               net_enable_timestamp();
+               atomic_inc(&netstamp_needed);
        }
 }
 EXPORT_SYMBOL(sock_enable_timestamp); 
@@ -1355,7 +1385,6 @@ void sk_free_slab(struct proto *prot)
 }
 
 EXPORT_SYMBOL(sk_free_slab);
-
 EXPORT_SYMBOL(sk_alloc);
 EXPORT_SYMBOL(sk_free);
 EXPORT_SYMBOL(sk_send_sigurg);