diff options
author | Bernard Pidoux <f6bvp@amsat.org> | 2008-04-19 21:41:51 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-19 21:41:51 -0400 |
commit | 43837b1e6c5aef803d57009a68db18df13e64892 (patch) | |
tree | 39a43bfa8b64c9ffcddacead8dde0a751fccd555 /net/rose/af_rose.c | |
parent | d129f188abf14bbc13816667e4c0d465aac2c934 (diff) |
rose: Socket lock was not released before returning to user space
================================================
[ BUG: lock held when returning to user space! ]
------------------------------------------------
xfbbd/3683 is leaving the kernel with locks still held!
1 lock held by xfbbd/3683:
#0: (sk_lock-AF_ROSE){--..}, at: [<c8cd1eb3>] rose_connect+0x73/0x420 [rose]
INFO: task xfbbd:3683 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
xfbbd D 00000246 0 3683 3669
c6965ee0 00000092 c02c5c40 00000246 c0f6b5f0 c0f6b5c0 c0f6b5f0 c0f6b5c0
c0f6b614 c6965f18 c024b74b ffffffff c06ba070 00000000 00000000 00000001
c6ab07c0 c012d450 c0f6b634 c0f6b634 c7b5bf10 c0d6004c c7b5bf10 c6965f40
Call Trace:
[<c024b74b>] lock_sock_nested+0x6b/0xd0
[<c012d450>] ? autoremove_wake_function+0x0/0x40
[<c02488f1>] sock_fasync+0x41/0x150
[<c0249e69>] sock_close+0x19/0x40
[<c0175d54>] __fput+0xb4/0x170
[<c0176018>] fput+0x18/0x20
[<c017300e>] filp_close+0x3e/0x70
[<c01744e9>] sys_close+0x69/0xb0
[<c0103bda>] sysenter_past_esp+0x5f/0xa5
=======================
INFO: lockdep is turned off.
Signed-off-by: Bernard Pidoux <f6bvp@amsat.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rose/af_rose.c')
-rw-r--r-- | net/rose/af_rose.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index d1ff3f885c5d..1ebf65294405 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -760,8 +760,10 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le | |||
760 | 760 | ||
761 | rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, | 761 | rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, |
762 | &diagnostic); | 762 | &diagnostic); |
763 | if (!rose->neighbour) | 763 | if (!rose->neighbour) { |
764 | return -ENETUNREACH; | 764 | err = -ENETUNREACH; |
765 | goto out_release; | ||
766 | } | ||
765 | 767 | ||
766 | rose->lci = rose_new_lci(rose->neighbour); | 768 | rose->lci = rose_new_lci(rose->neighbour); |
767 | if (!rose->lci) { | 769 | if (!rose->lci) { |