I think there's a race condition in spawn() in mountall - AFAICS, there's nothing in the code that ensures spawn_child_handler is registered as a signal handler before calling execve(), so if fsck exits very fast, mountall may miss the signal that the child process has exited since it's passed to the default signal handler instead. This would explain why when the filesystem is clean and doesn't need checking, mountall locks up; but when it does a full fsck, mountall finishes fine.
Scott,
I think there's a race condition in spawn() in mountall - AFAICS, there's nothing in the code that ensures spawn_child_handler is registered as a signal handler before calling execve(), so if fsck exits very fast, mountall may miss the signal that the child process has exited since it's passed to the default signal handler instead. This would explain why when the filesystem is clean and doesn't need checking, mountall locks up; but when it does a full fsck, mountall finishes fine.