2008-08-20 15:18:47

by Alexander Beregalov

[permalink] [raw]
Subject: Re: linux-next: Tree for August 20: tty: possible recursive locking detected

Hi
I got this on sparc64 system.

[ 91.266507] [ INFO: possible recursive locking detected ]
[ 91.266862] 2.6.27-rc3-next-20080820-dirty #3
[ 91.267170] ---------------------------------------------
[ 91.267522] sshd/1455 is trying to acquire lock:
[ 91.267840] (&tty->termios_mutex){--..}, at: [<00000000005b8ca0>]
tty_do_resize+0x44/0x128
[ 91.268405]
[ 91.268411] but task is already holding lock:
[ 91.268885] (&tty->termios_mutex){--..}, at: [<00000000005b8c74>]
tty_do_resize+0x18/0x128
[ 91.269436]
[ 91.269442] other info that might help us debug this:
[ 91.269944] 1 lock held by sshd/1455:
[ 91.270219] #0: (&tty->termios_mutex){--..}, at:
[<00000000005b8c74>] tty_do_resize+0x18/0x128
[ 91.270812]
[ 91.270818] stack backtrace:
[ 91.271229] Call Trace:
[ 91.271474] [000000000047757c] __lock_acquire+0xfcc/0x1900
[ 91.271839] [0000000000477f0c] lock_acquire+0x5c/0x74
[ 91.272198] [00000000006af2a8] mutex_lock_nested+0xf0/0x310
[ 91.272565] [00000000005b8ca0] tty_do_resize+0x44/0x128
[ 91.272916] [00000000005ba3cc] tty_ioctl+0x360/0x99c
[ 91.273266] [00000000004c0050] vfs_ioctl+0x2c/0x94
[ 91.273600] [00000000004c03b4] do_vfs_ioctl+0x2fc/0x31c
[ 91.273953] [00000000004c0408] sys_ioctl+0x34/0x5c
[ 91.274296] [00000000004e98f0] do_ioctl32_pointer+0x18/0x2c
[ 91.274666] [00000000004ebb04] compat_sys_ioctl+0x3b8/0x40c
[ 91.275043] [0000000000406154] linux_sparc_syscall32+0x34/0x40


It was dirtied by the following patch from David Howells
[PATCH] CRED: Further fix execve error handling

diff --git a/fs/compat.c b/fs/compat.c
index af24b8a..918f0f2 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -1373,7 +1373,7 @@ int compat_do_execve(char * filename,
file = open_exec(filename);
retval = PTR_ERR(file);
if (IS_ERR(file))
- goto out_unlock;
+ goto out_free;

sched_exec();

@@ -1427,6 +1427,7 @@ out_file:
allow_write_access(bprm->file);
fput(bprm->file);
}
+ goto out_free;

out_unlock:
mutex_unlock(&current->cred_exec_mutex);
diff --git a/fs/exec.c b/fs/exec.c
index 4b31a72..7b71679 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1319,7 +1319,7 @@ int do_execve(char * filename,
file = open_exec(filename);
retval = PTR_ERR(file);
if (IS_ERR(file))
- goto out_unlock;
+ goto out_free;

sched_exec();

@@ -1376,6 +1376,7 @@ out_file:
allow_write_access(bprm->file);
fput(bprm->file);
}
+ goto out_free;

out_unlock:
mutex_unlock(&current->cred_exec_mutex);