Bug#291357: A Better Example
It appears the example I gave happens on a working
kernel as well. This one doesn't:
rstuart@ras:~$ ssh 10.7.0.3
Linux titan.brisbane.lube 2.4.27-6-lube-686-smp #1 SMP Thu Jan 13 16:01:29 EST 2005 i686 GNU/Linux
rstuart@titan:~$ ps -fu $LOGNAME
UID PID PPID C STIME TTY TIME CMD
rstuart 15870 15868 0 23:33 ? 00:00:00 sshd: rstuart@pts/0
rstuart 15872 15870 2 23:33 pts/0 00:00:00 -bash
rstuart 15895 15872 0 23:33 pts/0 00:00:00 ps -fu rstuart
rstuart@titan:~$ (sleep 2; kill -9 15870) & sleep 12345
[1] 15900
Connection to 10.7.0.3 closed by remote host.
Connection to 10.7.0.3 closed.
rstuart@ras:~$ ssh 10.7.0.3
Linux titan.brisbane.lube 2.4.27-6-lube-686-smp #1 SMP Thu Jan 13 16:01:29 EST 2005 i686 GNU/Linux
rstuart@titan:~$ ps -fu $LOGNAME
UID PID PPID C STIME TTY TIME CMD
rstuart 15872 1 0 23:33 ? 00:00:00 -bash
rstuart 15901 15872 0 23:33 ? 00:00:00 sleep 12345
rstuart 15905 15903 0 23:33 ? 00:00:00 sshd: rstuart@pts/2
rstuart 15907 15905 2 23:33 pts/2 00:00:00 -bash
rstuart 15932 15907 0 23:33 pts/2 00:00:00 ps -fu rstuart
rstuart@titan:~$
Notice the sleep is still running. On a working kernel is isn't
because it has been sent a SIGHUP.
By the way, it appears the code concerned was copied from 2.6.8,
or a 2.6 kernel a least. In 2.6.8, the code looks like this:
/* Defer ldisc switch */
/* tty_deferred_ldisc_switch(N_TTY);
This should get done automatically when the port closes and
tty_release is called */
read_lock(&tasklist_lock);
When copied to 2.4.27, the code ended up like this:
/* Defer ldisc switch */
/* tty_deferred_ldisc_switch(N_TTY);
read_lock(&tasklist_lock);
When the trailing */ is restored, the kernel works again.
Reply to: