

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 <akpm@osdl.org>
---

 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 <linux/unistd.h>
 #include <linux/rmap.h>
 #include <linux/mempolicy.h>
+#include <linux/key.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -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);
_
