The data structures which are set up by key_init() are used by exec(). And we're using exec() super-early via the hotplug events from do_basic_setup():driver_init(). So call key_init() directly, prior to driver_init(). Signed-off-by: Andrew Morton --- 25-akpm/include/linux/key.h | 2 ++ 25-akpm/init/main.c | 3 ++- 25-akpm/security/keys/key.c | 11 ++--------- 3 files changed, 6 insertions(+), 10 deletions(-) diff -puN init/main.c~key_init-ordering-fix init/main.c --- 25/init/main.c~key_init-ordering-fix 2004-10-28 22:53:09.599744576 -0700 +++ 25-akpm/init/main.c 2004-10-28 22:54:11.191381224 -0700 @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -639,7 +640,7 @@ static void __init do_basic_setup(void) /* drivers will send hotplug events */ init_workqueues(); usermodehelper_init(); - + key_init(); driver_init(); #ifdef CONFIG_SYSCTL diff -puN include/linux/key.h~key_init-ordering-fix include/linux/key.h --- 25/include/linux/key.h~key_init-ordering-fix 2004-10-28 22:53:09.627740320 -0700 +++ 25-akpm/include/linux/key.h 2004-10-28 22:53:54.601903208 -0700 @@ -263,6 +263,7 @@ extern int suid_keys(struct task_struct extern int exec_keys(struct task_struct *tsk); extern void key_fsuid_changed(struct task_struct *tsk); extern void key_fsgid_changed(struct task_struct *tsk); +extern void key_init(void); #else /* CONFIG_KEYS */ @@ -278,6 +279,7 @@ extern void key_fsgid_changed(struct tas #define exec_keys(t) do { } while(0) #define key_fsuid_changed(t) do { } while(0) #define key_fsgid_changed(t) do { } while(0) +#define key_init() do { } while(0) #endif /* CONFIG_KEYS */ #endif /* __KERNEL__ */ diff -puN security/keys/key.c~key_init-ordering-fix security/keys/key.c --- 25/security/keys/key.c~key_init-ordering-fix 2004-10-28 22:53:09.666734392 -0700 +++ 25-akpm/security/keys/key.c 2004-10-28 22:54:41.041843264 -0700 @@ -998,13 +998,11 @@ EXPORT_SYMBOL(unregister_key_type); /* * initialise the key management stuff */ -static int __init key_init(void) +void __init key_init(void) { /* allocate a slab in which we can store keys */ key_jar = kmem_cache_create("key_jar", sizeof(struct key), - 0, SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!key_jar) - panic("Cannot create key jar\n"); + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); /* add the special key types */ list_add_tail(&key_type_keyring.link, &key_types_list); @@ -1031,9 +1029,4 @@ static int __init key_init(void) /* link the two root keyrings together */ key_link(&root_session_keyring, &root_user_keyring); - - return 0; - } /* end key_init() */ - -security_initcall(key_init); _