Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02cf01ae authored by Jens Axboe's avatar Jens Axboe Committed by Jens Axboe
Browse files

splice: only return -EAGAIN if there's hope of more data



sys_tee() currently is a bit eager in returning -EAGAIN, it may do so
even if we don't have a chance of anymore data becoming available. So
improve the logic and only return -EAGAIN if we have an attached writer
to the input pipe.

Reported by Johann Felix Soden <johfel@gmx.de> and
Patrick McManus <mcmanus@ducksong.com>.

Tested-by: default avatarJohann Felix Soden <johfel@users.sourceforge.net>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 5d87a052
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -1669,6 +1669,13 @@ static int link_pipe(struct pipe_inode_info *ipipe,
		i++;
	} while (len);

	/*
	 * return EAGAIN if we have the potential of some data in the
	 * future, otherwise just return 0
	 */
	if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK))
		ret = -EAGAIN;

	inode_double_unlock(ipipe->inode, opipe->inode);

	/*
@@ -1709,11 +1716,8 @@ static long do_tee(struct file *in, struct file *out, size_t len,
		ret = link_ipipe_prep(ipipe, flags);
		if (!ret) {
			ret = link_opipe_prep(opipe, flags);
			if (!ret) {
			if (!ret)
				ret = link_pipe(ipipe, opipe, len, flags);
				if (!ret && (flags & SPLICE_F_NONBLOCK))
					ret = -EAGAIN;
			}
		}
	}