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 | } |
