mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
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: Johann Felix Soden <johfel@users.sourceforge.net> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
5d87a052c7
commit
02cf01aea5
12
fs/splice.c
12
fs/splice.c
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user