From: Andrew Morton As noted by Kevin, tipc's release() does down_interruptible() and ignores the return value. So if signal_pending() we'll end up doing up() on a non-downed semaphore. Fix. Cc: Kevin Winchester Cc: Per Liden Cc: Jon Maloy Cc: Allan Stephens Cc: "David S. Miller" Cc: Signed-off-by: Andrew Morton --- net/tipc/socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN net/tipc/socket.c~tipc-fix-semaphore-handling net/tipc/socket.c --- a/net/tipc/socket.c~tipc-fix-semaphore-handling +++ a/net/tipc/socket.c @@ -253,7 +253,7 @@ static int release(struct socket *sock) dbg("sock_delete: %x\n",tsock); if (!tsock) return 0; - down_interruptible(&tsock->sem); + down(&tsock->sem); if (!sock->sk) { up(&tsock->sem); return 0; _