Merge branch 'for-2.6.37' of git://linux-nfs.org/~bfields/linux
[~shefty/rdma-dev.git] / net / socket.c
index 0c37b0037b979e8d8ac77f93988fabe51a1b8162..7f67c072d4969670a0355c7aaad033dbdc651a5f 100644 (file)
@@ -209,8 +209,8 @@ int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr)
  *     specified. Zero is returned for a success.
  */
 
-int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr,
-                     int __user *ulen)
+static int move_addr_to_user(struct sockaddr *kaddr, int klen,
+                            void __user *uaddr, int __user *ulen)
 {
        int err;
        int len;
@@ -502,6 +502,7 @@ static int sock_no_open(struct inode *irrelevant, struct file *dontcare)
 const struct file_operations bad_sock_fops = {
        .owner = THIS_MODULE,
        .open = sock_no_open,
+       .llseek = noop_llseek,
 };
 
 /**
@@ -535,14 +536,13 @@ void sock_release(struct socket *sock)
 }
 EXPORT_SYMBOL(sock_release);
 
-int sock_tx_timestamp(struct msghdr *msg, struct sock *sk,
-                     union skb_shared_tx *shtx)
+int sock_tx_timestamp(struct sock *sk, __u8 *tx_flags)
 {
-       shtx->flags = 0;
+       *tx_flags = 0;
        if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
-               shtx->hardware = 1;
+               *tx_flags |= SKBTX_HW_TSTAMP;
        if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
-               shtx->software = 1;
+               *tx_flags |= SKBTX_SW_TSTAMP;
        return 0;
 }
 EXPORT_SYMBOL(sock_tx_timestamp);
@@ -662,7 +662,8 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
 }
 EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
 
-inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
+static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
+                                  struct sk_buff *skb)
 {
        if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount)
                put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
@@ -1920,7 +1921,8 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
                 * Afterwards, it will be a kernel pointer. Thus the compiler-assisted
                 * checking falls down on this.
                 */
-               if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control,
+               if (copy_from_user(ctl_buf,
+                                  (void __user __force *)msg_sys.msg_control,
                                   ctl_len))
                        goto out_freectl;
                msg_sys.msg_control = ctl_buf;
@@ -3055,14 +3057,19 @@ int kernel_getsockopt(struct socket *sock, int level, int optname,
                        char *optval, int *optlen)
 {
        mm_segment_t oldfs = get_fs();
+       char __user *uoptval;
+       int __user *uoptlen;
        int err;
 
+       uoptval = (char __user __force *) optval;
+       uoptlen = (int __user __force *) optlen;
+
        set_fs(KERNEL_DS);
        if (level == SOL_SOCKET)
-               err = sock_getsockopt(sock, level, optname, optval, optlen);
+               err = sock_getsockopt(sock, level, optname, uoptval, uoptlen);
        else
-               err = sock->ops->getsockopt(sock, level, optname, optval,
-                                           optlen);
+               err = sock->ops->getsockopt(sock, level, optname, uoptval,
+                                           uoptlen);
        set_fs(oldfs);
        return err;
 }
@@ -3072,13 +3079,16 @@ int kernel_setsockopt(struct socket *sock, int level, int optname,
                        char *optval, unsigned int optlen)
 {
        mm_segment_t oldfs = get_fs();
+       char __user *uoptval;
        int err;
 
+       uoptval = (char __user __force *) optval;
+
        set_fs(KERNEL_DS);
        if (level == SOL_SOCKET)
-               err = sock_setsockopt(sock, level, optname, optval, optlen);
+               err = sock_setsockopt(sock, level, optname, uoptval, optlen);
        else
-               err = sock->ops->setsockopt(sock, level, optname, optval,
+               err = sock->ops->setsockopt(sock, level, optname, uoptval,
                                            optlen);
        set_fs(oldfs);
        return err;