mirror of https://gitee.com/openkylin/linux.git
splice: reinstate SIGPIPE/EPIPE handling
Commit8924feff66
("splice: lift pipe_lock out of splice_to_pipe()") caused a regression when there were no more readers left on a pipe that was being spliced into: rather than the expected SIGPIPE and -EPIPE return value, the writer would end up waiting forever for space to free up (which obviously was not going to happen with no readers around). Fixes:8924feff66
("splice: lift pipe_lock out of splice_to_pipe()") Reported-and-tested-by: Andreas Schwab <schwab@linux-m68k.org> Debugged-by: Al Viro <viro@zeniv.linux.org.uk> Cc: stable@kernel.org # v4.9 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0c961c5511
commit
52bce91165
|
@ -1087,7 +1087,13 @@ EXPORT_SYMBOL(do_splice_direct);
|
|||
|
||||
static int wait_for_space(struct pipe_inode_info *pipe, unsigned flags)
|
||||
{
|
||||
while (pipe->nrbufs == pipe->buffers) {
|
||||
for (;;) {
|
||||
if (unlikely(!pipe->readers)) {
|
||||
send_sig(SIGPIPE, current, 0);
|
||||
return -EPIPE;
|
||||
}
|
||||
if (pipe->nrbufs != pipe->buffers)
|
||||
return 0;
|
||||
if (flags & SPLICE_F_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
if (signal_pending(current))
|
||||
|
@ -1096,7 +1102,6 @@ static int wait_for_space(struct pipe_inode_info *pipe, unsigned flags)
|
|||
pipe_wait(pipe);
|
||||
pipe->waiting_writers--;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe,
|
||||
|
|
Loading…
Reference in New Issue