]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
futex: fix init order
authorThomas Gleixner <tglx@linutronix.de>
Sun, 24 Feb 2008 02:10:06 +0000 (02:10 +0000)
committerChris Wright <chrisw@sous-sol.org>
Mon, 24 Mar 2008 18:47:18 +0000 (11:47 -0700)
commit: 3e4ab747efa8e78562ec6782b08bbf21a00aba1b

When the futex init code fails to initialize the futex pseudo file system it
returns early without initializing the hash queues.  Should the boot succeed
then a futex syscall which tries to enqueue a waiter on the hashqueue will
crash due to the unitilialized plist heads.

Initialize the hash queues before the filesystem.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Ingo Molnar <mingo@elte.hu>
Cc: Lennert Buytenhek <buytenh@wantstofly.org>
Cc: Riku Voipio <riku.voipio@movial.fi>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
kernel/futex.c

index 55d78b5a9622ed43441cc7c398ea17ec2e36f695..176cddb6dbe951edb49cbeebf8f64472f35ed468 100644 (file)
@@ -2123,8 +2123,14 @@ static struct file_system_type futex_fs_type = {
 
 static int __init init(void)
 {
-       int i = register_filesystem(&futex_fs_type);
+       int i;
 
+       for (i = 0; i < ARRAY_SIZE(futex_queues); i++) {
+               plist_head_init(&futex_queues[i].chain, &futex_queues[i].lock);
+               spin_lock_init(&futex_queues[i].lock);
+       }
+
+       i = register_filesystem(&futex_fs_type);
        if (i)
                return i;
 
@@ -2134,10 +2140,6 @@ static int __init init(void)
                return PTR_ERR(futex_mnt);
        }
 
-       for (i = 0; i < ARRAY_SIZE(futex_queues); i++) {
-               plist_head_init(&futex_queues[i].chain, &futex_queues[i].lock);
-               spin_lock_init(&futex_queues[i].lock);
-       }
        return 0;
 }
 __initcall(init);