diff options
-rw-r--r-- | fs/splice.c | 5 | ||||
-rw-r--r-- | include/linux/socket.h | 2 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 2 | ||||
-rw-r--r-- | net/socket.c | 6 |
4 files changed, 9 insertions, 6 deletions
diff --git a/fs/splice.c b/fs/splice.c index 5f883de7ef3a..f8476841eb04 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/uio.h> | 30 | #include <linux/uio.h> |
31 | #include <linux/security.h> | 31 | #include <linux/security.h> |
32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
33 | #include <linux/socket.h> | ||
33 | 34 | ||
34 | /* | 35 | /* |
35 | * Attempt to steal a page from a pipe buffer. This should perhaps go into | 36 | * Attempt to steal a page from a pipe buffer. This should perhaps go into |
@@ -690,7 +691,9 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
690 | if (!likely(file->f_op && file->f_op->sendpage)) | 691 | if (!likely(file->f_op && file->f_op->sendpage)) |
691 | return -EINVAL; | 692 | return -EINVAL; |
692 | 693 | ||
693 | more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len; | 694 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; |
695 | if (sd->len < sd->total_len) | ||
696 | more |= MSG_SENDPAGE_NOTLAST; | ||
694 | return file->f_op->sendpage(file, buf->page, buf->offset, | 697 | return file->f_op->sendpage(file, buf->page, buf->offset, |
695 | sd->len, &pos, more); | 698 | sd->len, &pos, more); |
696 | } | 699 | } |
diff --git a/include/linux/socket.h b/include/linux/socket.h index da2d3e2543f3..b84bbd48b874 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
@@ -265,7 +265,7 @@ struct ucred { | |||
265 | #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ | 265 | #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ |
266 | #define MSG_MORE 0x8000 /* Sender will send more */ | 266 | #define MSG_MORE 0x8000 /* Sender will send more */ |
267 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ | 267 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ |
268 | 268 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ | |
269 | #define MSG_EOF MSG_FIN | 269 | #define MSG_EOF MSG_FIN |
270 | 270 | ||
271 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file | 271 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 2ff6f45a76f4..5d54ed30e821 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -860,7 +860,7 @@ wait_for_memory: | |||
860 | } | 860 | } |
861 | 861 | ||
862 | out: | 862 | out: |
863 | if (copied && !(flags & MSG_MORE)) | 863 | if (copied && !(flags & MSG_SENDPAGE_NOTLAST)) |
864 | tcp_push(sk, flags, mss_now, tp->nonagle); | 864 | tcp_push(sk, flags, mss_now, tp->nonagle); |
865 | return copied; | 865 | return copied; |
866 | 866 | ||
diff --git a/net/socket.c b/net/socket.c index 484cc6953fc6..851edcd6b098 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -811,9 +811,9 @@ static ssize_t sock_sendpage(struct file *file, struct page *page, | |||
811 | 811 | ||
812 | sock = file->private_data; | 812 | sock = file->private_data; |
813 | 813 | ||
814 | flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT; | 814 | flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; |
815 | if (more) | 815 | /* more is a combination of MSG_MORE and MSG_SENDPAGE_NOTLAST */ |
816 | flags |= MSG_MORE; | 816 | flags |= more; |
817 | 817 | ||
818 | return kernel_sendpage(sock, page, offset, size, flags); | 818 | return kernel_sendpage(sock, page, offset, size, flags); |
819 | } | 819 | } |