]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/socket.c
[DCCP]: Make PARTOPEN an autonomous state
[linux-2.6-omap-h63xx.git] / net / socket.c
index 74784dfe8e5b2b6d304c68e34e9ba4c8194123e3..aeeab388cc3868d36c2906b736c909b16d0cd62a 100644 (file)
@@ -112,6 +112,9 @@ static long compat_sock_ioctl(struct file *file,
 static int sock_fasync(int fd, struct file *filp, int on);
 static ssize_t sock_sendpage(struct file *file, struct page *page,
                             int offset, size_t size, loff_t *ppos, int more);
+static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
+                               struct pipe_inode_info *pipe, size_t len,
+                               unsigned int flags);
 
 /*
  *     Socket files have a set of 'special' operations as well as the generic file ones. These don't appear
@@ -134,6 +137,7 @@ static const struct file_operations socket_file_ops = {
        .fasync =       sock_fasync,
        .sendpage =     sock_sendpage,
        .splice_write = generic_splice_sendpage,
+       .splice_read =  sock_splice_read,
 };
 
 /*
@@ -691,6 +695,15 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
        return sock->ops->sendpage(sock, page, offset, size, flags);
 }
 
+static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
+                               struct pipe_inode_info *pipe, size_t len,
+                               unsigned int flags)
+{
+       struct socket *sock = file->private_data;
+
+       return sock->ops->splice_read(sock, ppos, pipe, len, flags);
+}
+
 static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb,
                                         struct sock_iocb *siocb)
 {
@@ -1581,16 +1594,11 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
        struct msghdr msg;
        struct iovec iov;
        int fput_needed;
-       struct file *sock_file;
 
-       sock_file = fget_light(fd, &fput_needed);
-       err = -EBADF;
-       if (!sock_file)
+       sock = sockfd_lookup_light(fd, &err, &fput_needed);
+       if (!sock)
                goto out;
 
-       sock = sock_from_file(sock_file, &err);
-       if (!sock)
-               goto out_put;
        iov.iov_base = buff;
        iov.iov_len = len;
        msg.msg_name = NULL;
@@ -1612,7 +1620,7 @@ asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
        err = sock_sendmsg(sock, &msg, len);
 
 out_put:
-       fput_light(sock_file, fput_needed);
+       fput_light(sock->file, fput_needed);
 out:
        return err;
 }
@@ -1641,17 +1649,11 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
        struct msghdr msg;
        char address[MAX_SOCK_ADDR];
        int err, err2;
-       struct file *sock_file;
        int fput_needed;
 
-       sock_file = fget_light(fd, &fput_needed);
-       err = -EBADF;
-       if (!sock_file)
-               goto out;
-
-       sock = sock_from_file(sock_file, &err);
+       sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (!sock)
-               goto out_put;
+               goto out;
 
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
@@ -1670,8 +1672,8 @@ asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
                if (err2 < 0)
                        err = err2;
        }
-out_put:
-       fput_light(sock_file, fput_needed);
+
+       fput_light(sock->file, fput_needed);
 out:
        return err;
 }