2001-10-11 17:16:06

by Gerhard Mack

[permalink] [raw]
Subject: linux-2.4.12 breaks debian install disks

When trying to load a reiserfs enabled boot disk on a Dell PowerEdge
I get:

RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem) readonly.
Freeimg unused kernel memory: 192k freed
(hangs here)

The problem appears on 2.4.11-pre6 and 2.4.12 but 2.4.9 was fine.
This problem appears both whith and without the Dell AACraid patches.

Gerhard

--
Gerhard Mack

[email protected]

<>< As a computer I find your faith in technology amusing.


2001-10-12 05:49:14

by Paul Mackerras

[permalink] [raw]
Subject: Re: linux-2.4.12 breaks debian install disks

Gerhard Mack writes:

> When trying to load a reiserfs enabled boot disk on a Dell PowerEdge
> I get:
>
> RAMDISK: Compressed image found at block 0
> VFS: Mounted root (ext2 filesystem) readonly.
> Freeimg unused kernel memory: 192k freed
> (hangs here)
>
> The problem appears on 2.4.11-pre6 and 2.4.12 but 2.4.9 was fine.
> This problem appears both whith and without the Dell AACraid patches.

This could be the same problem that I reported some time ago, where if
you send a signal to the init process while it is running /linuxrc,
the system will hang. In my case the problem was with this code in
prepare_namespace() in init/main.c:

pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
if (pid>0)
while (pid != wait(&i));

If a signal becomes pending, the wait will not block, but the signal
never gets delivered because the process is still running inside the
kernel (signals only get delivered on the exit from kernel to user
space).

One solution would be to change it to something like this (caution,
completely untested):

pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
if (pid > 0) {
while (pid != wait(&i)) {
if (signal_pending(current)) {
spin_lock_irq(&current->sigmask_lock);
flush_signals(current);
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
}
}
}

Another alternative would be to block signals like request_module() in
kernel/kmod.c does.

HTH,
Paul.