Yang Xiaopeng writes:
authorEric Andersen <andersen@codepoet.org>
Tue, 29 Jul 2003 06:33:12 +0000 (06:33 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 29 Jul 2003 06:33:12 +0000 (06:33 -0000)
>I'm sure that no user process use old root now,  but when run "umount
>/old_root", it says:
>   umount: /old_root: Device or resource busy
>
>I have tried to remount /proc within the new root *after* chroot, but
>get the same result.
>
>
I found the problem, I said that no user process use old root when run
my scripts, but
I'm wrong, actually there is a '3' fd open the file
"/old_root/dev/console". By adding
debug message in init/init.c, I found the problem: when init restart(in
exec_signal()),
before open the new terminal device, there is still a file opened(I
don't know which file it is), so the
terminal device(stdin) get fd '1', and the first dup(0)(stdout) return
'2', the second(stderr) return '3'.

I attach a simple patch to solve this problem.

init/init.c

index 7e24eacdddc0665e368cfb630feaf109739a80b9..1ecc43e16613a85dbf7b85b088e3f74d208335eb 100644 (file)
@@ -735,6 +735,11 @@ static void exec_signal(int sig)
                        sigaddset(&unblock_signals, SIGTSTP);
                        sigprocmask(SIG_UNBLOCK, &unblock_signals, NULL);
 
+                       /* Close whatever files are open. */
+                       close(0);
+                       close(1);
+                       close(2);
+
                        /* Open the new terminal device */
                        if ((device_open(a->terminal, O_RDWR)) < 0) {
                                if (stat(a->terminal, &sb) != 0) {