vserver 1.9.5.x5
[linux-2.6.git] / net / decnet / af_decnet.c
index e0d5284..056bac6 100644 (file)
@@ -151,12 +151,12 @@ static void dn_keepalive(struct sock *sk);
 
 static kmem_cache_t *dn_sk_cachep;
 static struct proto_ops dn_proto_ops;
-static rwlock_t dn_hash_lock = RW_LOCK_UNLOCKED;
+static DEFINE_RWLOCK(dn_hash_lock);
 static struct hlist_head dn_sk_hash[DN_SK_HASH_SIZE];
 static struct hlist_head dn_wild_sk;
 
-static int __dn_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen, int flags);
-static int __dn_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen, int flags);
+static int __dn_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen, int flags);
+static int __dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen, int flags);
 
 static struct hlist_head *dn_find_list(struct sock *sk)
 {
@@ -246,7 +246,7 @@ static void dn_unhash_sock_bh(struct sock *sk)
        write_unlock_bh(&dn_hash_lock);
 }
 
-struct hlist_head *listen_hash(struct sockaddr_dn *addr)
+static struct hlist_head *listen_hash(struct sockaddr_dn *addr)
 {
        int i;
        unsigned hash = addr->sdn_objnum;
@@ -447,7 +447,7 @@ static void dn_destruct(struct sock *sk)
        dst_release(xchg(&sk->sk_dst_cache, NULL));
 }
 
-struct sock *dn_alloc_sock(struct socket *sock, int gfp)
+static struct sock *dn_alloc_sock(struct socket *sock, int gfp)
 {
        struct dn_scp *scp;
        struct sock *sk = sk_alloc(PF_DECnet, gfp, sizeof(struct dn_sock),
@@ -578,7 +578,6 @@ int dn_destroy_timer(struct sock *sk)
        if (sk->sk_socket)
                return 0;
 
-       dn_stop_fast_timer(sk); /* unlikely, but possible that this is runninng */
        if ((jiffies - scp->stamp) >= (HZ * decnet_time_wait)) {
                dn_unhash_sock(sk);
                sock_put(sk);
@@ -631,7 +630,6 @@ disc_reject:
                default:
                        printk(KERN_DEBUG "DECnet: dn_destroy_sock passed socket in invalid state\n");
                case DN_O:
-                       dn_stop_fast_timer(sk);
                        dn_stop_slow_timer(sk);
 
                        dn_unhash_sock_bh(sk);
@@ -1075,7 +1073,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags)
                skb = dn_wait_for_connect(sk, &timeo);
                if (IS_ERR(skb)) {
                        release_sock(sk);
-                       return PTR_ERR(sk);
+                       return PTR_ERR(skb);
                }
        }
 
@@ -1212,7 +1210,7 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        {
        case SIOCGIFADDR:
        case SIOCSIFADDR:
-               return dn_dev_ioctl(cmd, (void *)arg);
+               return dn_dev_ioctl(cmd, (void __user *)arg);
 
        case SIOCATMARK:
                lock_sock(sk);
@@ -1226,7 +1224,7 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
                if (amount < 0)
                        amount = 0;
-               err = put_user(amount, (int *)arg);
+               err = put_user(amount, (int __user *)arg);
                break;
 
        case TIOCINQ:
@@ -1244,11 +1242,11 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        }
                }
                release_sock(sk);
-               err = put_user(amount, (int *)arg);
+               err = put_user(amount, (int __user *)arg);
                break;
 
        default:
-               err = dev_ioctl(cmd, (void *)arg);
+               err = dev_ioctl(cmd, (void __user *)arg);
                break;
        }
 
@@ -1313,7 +1311,7 @@ out:
        return err;
 }
 
-static int dn_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen)
+static int dn_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
 {
        struct sock *sk = sock->sk;
        int err;
@@ -1325,7 +1323,7 @@ static int dn_setsockopt(struct socket *sock, int level, int optname, char *optv
        return err;
 }
 
-static int __dn_setsockopt(struct socket *sock, int level,int optname, char *optval, int optlen, int flags) 
+static int __dn_setsockopt(struct socket *sock, int level,int optname, char __user *optval, int optlen, int flags) 
 {
        struct  sock *sk = sock->sk;
        struct dn_scp *scp = DN_SK(sk);
@@ -1490,7 +1488,7 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char *opt
        return 0;
 }
 
-static int dn_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
+static int dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
 {
        struct sock *sk = sock->sk;
        int err;
@@ -1502,7 +1500,7 @@ static int dn_getsockopt(struct socket *sock, int level, int optname, char *optv
        return err;
 }
 
-static int __dn_getsockopt(struct socket *sock, int level,int optname, char *optval,int *optlen, int flags)
+static int __dn_getsockopt(struct socket *sock, int level,int optname, char __user *optval,int __user *optlen, int flags)
 {
        struct  sock *sk = sock->sk;
        struct dn_scp *scp = DN_SK(sk);
@@ -1723,7 +1721,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
                        goto out;
 
                if (signal_pending(current)) {
-                       rv = -ERESTARTSYS;
+                       rv = sock_intr_errno(timeo);
                        goto out;
                }
 
@@ -1905,7 +1903,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
        unsigned char fctype;
        long timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
 
-       if (flags & ~(MSG_TRYHARD|MSG_OOB|MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL|MSG_MORE))
+       if (flags & ~(MSG_TRYHARD|MSG_OOB|MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL|MSG_MORE|MSG_CMSG_COMPAT))
                return -EOPNOTSUPP;
 
        if (addr_len && (addr_len != sizeof(struct sockaddr_dn)))
@@ -1957,7 +1955,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
                        goto out;
 
                if (signal_pending(current)) {
-                       err = -ERESTARTSYS;
+                       err = sock_intr_errno(timeo);
                        goto out;
                }
 
@@ -1992,7 +1990,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
                /*
                 * Get a suitably sized skb.
                 */
-               skb = dn_alloc_send_skb(sk, &len, flags & MSG_DONTWAIT, &err);
+               skb = dn_alloc_send_skb(sk, &len, flags & MSG_DONTWAIT, timeo, &err);
 
                if (err)
                        break;