vfs: patch for unpause()/revive() race condition

. unpause() and revive() can race - revive() can run during
	  a device i/o unblock, causing two sendnb()s to occur, and the
	  2nd one to fail
	. this can easily happen when a process is blocking on tty and
	  is then killed by a signal - tty cancels the i/o and then
	  kills the process by a signal

Change-Id: Ia319acaedfa336b78c030a2c4af7246959bdcf87
This commit is contained in:
Ben Gras 2013-06-12 18:42:41 +00:00
parent a2fcba659c
commit 8f2749cca8

View file

@ -640,13 +640,14 @@ void unpause(endpoint_t proc_e)
panic("VFS: unknown block reason: %d", blocked_on);
}
rfp->fp_blocked_on = FP_BLOCKED_ON_NONE;
if ((blocked_on == FP_BLOCKED_ON_PIPE || blocked_on == FP_BLOCKED_ON_POPEN)&&
!wasreviving) {
susp_count--;
}
if(rfp->fp_blocked_on != FP_BLOCKED_ON_NONE) {
rfp->fp_blocked_on = FP_BLOCKED_ON_NONE;
replycode(proc_e, status); /* signal interrupted call */
}
}