[BUG] stream_sock: disable I/O on fds reporting an error

Upon read or write error, we cannot immediately close the FD because
we want to first report the error to the upper layer which will do it
itself. However, we want to prevent any further I/O from being performed
on the FD. This is especially important in case of speculative I/O where
nothing else could stop the FD from still being polled until the upper
layer takes care of the condition.
This commit is contained in:
Willy Tarreau 2009-03-28 20:54:53 +01:00
parent 1eead503da
commit 1714e0ffda

View File

@ -495,6 +495,7 @@ int stream_sock_read(int fd) {
fdtab[fd].state = FD_STERROR;
fdtab[fd].ev &= ~FD_POLL_STICKY;
EV_FD_REM(fd);
si->flags |= SI_FL_ERR;
retval = 1;
goto out_wakeup;
@ -756,6 +757,7 @@ int stream_sock_write(int fd)
fdtab[fd].state = FD_STERROR;
fdtab[fd].ev &= ~FD_POLL_STICKY;
EV_FD_REM(fd);
si->flags |= SI_FL_ERR;
task_wakeup(si->owner, TASK_WOKEN_IO);
return 1;
@ -972,6 +974,7 @@ void stream_sock_chk_snd(struct stream_interface *si)
*/
fdtab[si->fd].state = FD_STERROR;
fdtab[si->fd].ev &= ~FD_POLL_STICKY;
EV_FD_REM(si->fd);
si->flags |= SI_FL_ERR;
goto out_wakeup;
}