Thayne Harbaugh
2004-Oct-25 11:52 UTC
[klibc] chicken/egg between pipefs and initramfs/hotplug
I have a hotplug setup in initramfs. Everytime that modprobe is called I get a kernel oops: NULL pointer dereference: Unable to handle kernel NULL pointer dereference<1>Unable to handle kernel NULL pointer dereference at virtual address 00000014 printing eip: c015db49 *pde = 00000000 Oops: 0000 [#1] PREEMPT SMP Modules linked in: CPU: 3 EIP: 0060:[<c015db49>] Not tainted EFLAGS: 00010296 (2.6.8) EIP is at get_pipe_inode+0x9/0xb2 eax: 00000000 ebx: f74f4780 ecx: 00000000 edx: 00000000 esi: f7575580 edi: 0805cbdc ebp: f767a000 esp: f767bf3c ds: 007b es: 007b ss: 0068 Process default.hotplug (pid: 184, threadinfo=f767a000 task=f74d9110) Stack: f74f4780 f74f4780 c015dc24 f74d9110 c0168225 f7963ef0 c0392e80 f74f4780 ffffffe9 f74f4080 f767bfac 00000ff8 c014ff5f f7963cb0 00000001 00000ff8 f767bfac c0162d17 00000000 f74f4080 fffffff7 bfffdeec f767bfb0 0805cbdc Call Trace: [<c015dc24>] do_pipe+0x32/0x20e [<c0168225>] dput+0x9e/0x2b0 [<c014ff5f>] vfs_read+0x94/0x103 [<c0162d17>] do_fcntl+0x18c/0x21f [<c010a8ad>] sys_pipe+0x11/0x49 [<c0103f2f>] syscall_call+0x7/0xb Code: 8b 40 14 89 04 24 e8 4e d5 00 00 85 c0 89 c3 0f 84 8d 00 00 It appears that linux/init/main.c:init() has a chicken/egg problem. Apparently modprobe and other programs need a pipe and pipefs isn't mounted until later on in do_basic_setup()/do_initcalls(). That means that linux/fs/pipe.c:static struct vfsmount *pipe_mnt; isn't initialized and blows up when it's derefernced in linux/fs/pipe.c:get_pipe_inode(). Has this been discussed before? Is there something that userspace can wait on until pipefs is mounted or more of the kernel is initialized? I did some searching and I just can't turn up a previous discussion about this - my apologies if it's already been covered. -- Thayne Harbaugh Linux Networx
Andrew Morton
2004-Oct-26 16:25 UTC
[klibc] Re: chicken/egg between pipefs and initramfs/hotplug
Thayne Harbaugh <tharbaugh@lnxi.com> wrote:> > It appears that linux/init/main.c:init() has a chicken/egg problem. > Apparently modprobe and other programs need a pipe and pipefs isn't > mounted until later on in do_basic_setup()/do_initcalls(). That means > that linux/fs/pipe.c:static struct vfsmount *pipe_mnt; isn't > initialized and blows up when it's derefernced in > linux/fs/pipe.c:get_pipe_inode().That's a bit sad. Does this fix it? --- 25/fs/pipe.c~a Tue Oct 26 16:28:44 2004 +++ 25-akpm/fs/pipe.c Tue Oct 26 16:28:52 2004 @@ -718,5 +718,5 @@ static void __exit exit_pipe_fs(void) mntput(pipe_mnt); } -module_init(init_pipe_fs) +fs_initcall(init_pipe_fs) module_exit(exit_pipe_fs) _