|
@@ -1161,7 +1161,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
|
|
long ret, bytes;
|
|
long ret, bytes;
|
|
umode_t i_mode;
|
|
umode_t i_mode;
|
|
size_t len;
|
|
size_t len;
|
|
- int i, flags;
|
|
|
|
|
|
+ int i, flags, more;
|
|
|
|
|
|
/*
|
|
/*
|
|
* We require the input being a regular file, as we don't want to
|
|
* We require the input being a regular file, as we don't want to
|
|
@@ -1204,6 +1204,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
|
|
* Don't block on output, we have to drain the direct pipe.
|
|
* Don't block on output, we have to drain the direct pipe.
|
|
*/
|
|
*/
|
|
sd->flags &= ~SPLICE_F_NONBLOCK;
|
|
sd->flags &= ~SPLICE_F_NONBLOCK;
|
|
|
|
+ more = sd->flags & SPLICE_F_MORE;
|
|
|
|
|
|
while (len) {
|
|
while (len) {
|
|
size_t read_len;
|
|
size_t read_len;
|
|
@@ -1216,6 +1217,15 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
|
|
read_len = ret;
|
|
read_len = ret;
|
|
sd->total_len = read_len;
|
|
sd->total_len = read_len;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If more data is pending, set SPLICE_F_MORE
|
|
|
|
+ * If this is the last data and SPLICE_F_MORE was not set
|
|
|
|
+ * initially, clears it.
|
|
|
|
+ */
|
|
|
|
+ if (read_len < len)
|
|
|
|
+ sd->flags |= SPLICE_F_MORE;
|
|
|
|
+ else if (!more)
|
|
|
|
+ sd->flags &= ~SPLICE_F_MORE;
|
|
/*
|
|
/*
|
|
* NOTE: nonblocking mode only applies to the input. We
|
|
* NOTE: nonblocking mode only applies to the input. We
|
|
* must not do the output in nonblocking mode as then we
|
|
* must not do the output in nonblocking mode as then we
|