Merge tag 'net-next-6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev...
[platform/kernel/linux-starfive.git] / net / socket.c
index e46b162..2b0e54b 100644 (file)
@@ -57,6 +57,7 @@
 #include <linux/mm.h>
 #include <linux/socket.h>
 #include <linux/file.h>
+#include <linux/splice.h>
 #include <linux/net.h>
 #include <linux/interrupt.h>
 #include <linux/thread_info.h>
@@ -126,11 +127,10 @@ static long compat_sock_ioctl(struct file *file,
                              unsigned int cmd, unsigned long arg);
 #endif
 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);
+static void sock_splice_eof(struct file *file);
 
 #ifdef CONFIG_PROC_FS
 static void sock_show_fdinfo(struct seq_file *m, struct file *f)
@@ -162,9 +162,9 @@ static const struct file_operations socket_file_ops = {
        .mmap =         sock_mmap,
        .release =      sock_close,
        .fasync =       sock_fasync,
-       .sendpage =     sock_sendpage,
-       .splice_write = generic_splice_sendpage,
+       .splice_write = splice_to_socket,
        .splice_read =  sock_splice_read,
+       .splice_eof =   sock_splice_eof,
        .show_fdinfo =  sock_show_fdinfo,
 };
 
@@ -1067,26 +1067,6 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
 }
 EXPORT_SYMBOL(kernel_recvmsg);
 
-static ssize_t sock_sendpage(struct file *file, struct page *page,
-                            int offset, size_t size, loff_t *ppos, int more)
-{
-       struct socket *sock;
-       int flags;
-       int ret;
-
-       sock = file->private_data;
-
-       flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
-       /* more is a combination of MSG_MORE and MSG_SENDPAGE_NOTLAST */
-       flags |= more;
-
-       ret = kernel_sendpage(sock, page, offset, size, flags);
-
-       if (trace_sock_send_length_enabled())
-               call_trace_sock_send_length(sock->sk, ret, 0);
-       return ret;
-}
-
 static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
                                struct pipe_inode_info *pipe, size_t len,
                                unsigned int flags)
@@ -1099,6 +1079,14 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
        return sock->ops->splice_read(sock, ppos, pipe, len, flags);
 }
 
+static void sock_splice_eof(struct file *file)
+{
+       struct socket *sock = file->private_data;
+
+       if (sock->ops->splice_eof)
+               sock->ops->splice_eof(sock);
+}
+
 static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
 {
        struct file *file = iocb->ki_filp;
@@ -2139,6 +2127,7 @@ int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
                msg.msg_name = (struct sockaddr *)&address;
                msg.msg_namelen = addr_len;
        }
+       flags &= ~MSG_INTERNAL_SENDMSG_FLAGS;
        if (sock->file->f_flags & O_NONBLOCK)
                flags |= MSG_DONTWAIT;
        msg.msg_flags = flags;
@@ -2484,6 +2473,7 @@ static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys,
                msg_sys->msg_control = ctl_buf;
                msg_sys->msg_control_is_user = false;
        }
+       flags &= ~MSG_INTERNAL_SENDMSG_FLAGS;
        msg_sys->msg_flags = flags;
 
        if (sock->file->f_flags & O_NONBLOCK)
@@ -3564,54 +3554,6 @@ int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
 EXPORT_SYMBOL(kernel_getpeername);
 
 /**
- *     kernel_sendpage - send a &page through a socket (kernel space)
- *     @sock: socket
- *     @page: page
- *     @offset: page offset
- *     @size: total size in bytes
- *     @flags: flags (MSG_DONTWAIT, ...)
- *
- *     Returns the total amount sent in bytes or an error.
- */
-
-int kernel_sendpage(struct socket *sock, struct page *page, int offset,
-                   size_t size, int flags)
-{
-       if (sock->ops->sendpage) {
-               /* Warn in case the improper page to zero-copy send */
-               WARN_ONCE(!sendpage_ok(page), "improper page for zero-copy send");
-               return sock->ops->sendpage(sock, page, offset, size, flags);
-       }
-       return sock_no_sendpage(sock, page, offset, size, flags);
-}
-EXPORT_SYMBOL(kernel_sendpage);
-
-/**
- *     kernel_sendpage_locked - send a &page through the locked sock (kernel space)
- *     @sk: sock
- *     @page: page
- *     @offset: page offset
- *     @size: total size in bytes
- *     @flags: flags (MSG_DONTWAIT, ...)
- *
- *     Returns the total amount sent in bytes or an error.
- *     Caller must hold @sk.
- */
-
-int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
-                          size_t size, int flags)
-{
-       struct socket *sock = sk->sk_socket;
-
-       if (sock->ops->sendpage_locked)
-               return sock->ops->sendpage_locked(sk, page, offset, size,
-                                                 flags);
-
-       return sock_no_sendpage_locked(sk, page, offset, size, flags);
-}
-EXPORT_SYMBOL(kernel_sendpage_locked);
-
-/**
  *     kernel_sock_shutdown - shut down part of a full-duplex connection (kernel space)
  *     @sock: socket
  *     @how: connection part