From 540add1b55bcae67e16feede0a5f0a0163db3c12 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 20 Feb 2008 10:34:51 +0100 Subject: [PATCH] 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 and Patrick McManus . Tested-by: Johann Felix Soden Signed-off-by: Jens Axboe Signed-off-by: Oliver Pinter --- fs/splice.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/fs/splice.c b/fs/splice.c index 5e375733cd..9aa7acb38b 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -1489,6 +1489,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); /* @@ -1529,11 +1536,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; - } } } -- 2.11.4.GIT