Put CIFS sockets in their own class to avoid some lockdep warnings. CIFS
sockets are not exposed to user-space, and so are not subject to the
same deadlock scenarios.

A similar change was made a couple of years ago for RPC sockets in commit
ed07536ed6731775219c1df7fa26a7588753e693.

This patch should prevent lockdep false-positives like this one:

================================================== =====
[ INFO: possible circular locking dependency detected ]
2.6.18-98.el5.jtltest.38.bz456320.1debug #1
-------------------------------------------------------
test5/2483 is trying to acquire lock:
(sk_lock-AF_INET){--..}, at: [] tcp_sendmsg+0x1c/0xb2f

but task is already holding lock:
(&inode->i_alloc_sem){--..}, at: [] notify_change+0xf5/0x2e0

which lock already depends on the new lock.


the existing dependency chain (in reverse order) is:

-> #3 (&inode->i_alloc_sem){--..}:
[] __lock_acquire+0x9a9/0xadf
[] lock_acquire+0x55/0x70
[] notify_change+0xf5/0x2e0
[] down_write+0x3c/0x68
[] notify_change+0xf5/0x2e0
[] do_truncate+0x50/0x6b
[] get_write_access+0x40/0x46
[] may_open+0x1d3/0x22e
[] open_namei+0x2c6/0x6dd
[] do_filp_open+0x1c/0x38
[] _spin_unlock+0x17/0x20
[] get_unused_fd+0xf9/0x107
[] do_sys_open+0x44/0xbe
[] system_call+0x7e/0x83
[] 0xffffffffffffffff

-> #2 (&sysfs_inode_imutex_key){--..}:
[] __lock_acquire+0x9a9/0xadf
[] create_dir+0x26/0x1d7
[] lock_acquire+0x55/0x70
[] create_dir+0x26/0x1d7
[] mutex_lock_nested+0x104/0x29c
[] __lock_acquire+0x9ca/0xadf
[] create_dir+0x26/0x1d7
[] sysfs_create_dir+0x58/0x76
[] kobject_add+0xdb/0x198
[] class_device_add+0xb2/0x465
[] kobject_get+0x12/0x17
[] register_netdevice+0x270/0x33e
[] register_netdev+0x59/0x67
[] net_olddevs_init+0xb/0xac
[] init+0x1f9/0x2fc
[] _spin_unlock_irq+0x24/0x27
[] trace_hardirqs_on_thunk+0x35/0x37
[] child_rip+0xa/0x11
[] _spin_unlock_irq+0x24/0x27
[] restore_args+0x0/0x30
[] acpi_ds_init_one_object+0x0/0x80
[] init+0x0/0x2fc
[] child_rip+0x0/0x11
[] 0xffffffffffffffff

-> #1 (rtnl_mutex){--..}:
[] __lock_acquire+0x9a9/0xadf
[] ip_mc_leave_group+0x23/0xb7
[] lock_acquire+0x55/0x70
[] ip_mc_leave_group+0x23/0xb7
[] mutex_lock_nested+0x104/0x29c
[] ip_mc_leave_group+0x23/0xb7
[] do_ip_setsockopt+0x6d1/0x9bf
[] lock_release_holdtime+0x27/0x48
[] lock_release_holdtime+0x27/0x48
[] do_page_fault+0x503/0x835
[] socket_has_perm+0x5b/0x68
[] ip_setsockopt+0x22/0x78
[] sys_setsockopt+0x91/0xb7
[] tracesys+0xd5/0xdf
[] 0xffffffffffffffff

-> #0 (sk_lock-AF_INET){--..}:
[] print_stack_trace+0x59/0x68
[] __lock_acquire+0x8bf/0xadf
[] lock_acquire+0x55/0x70
[] tcp_sendmsg+0x1c/0xb2f
[] lock_sock+0xd4/0xe4
[] _local_bh_enable+0xcb/0xe0
[] restore_args+0x0/0x30
[] tcp_sendmsg+0x1c/0xb2f
[] sock_sendmsg+0xf3/0x110
[] autoremove_wake_function+0x0/0x2e
[] kernel_text_address+0x1a/0x26
[] dump_trace+0x211/0x23a
[] find_usage_backwards+0x5f/0x88
[] MD5Final+0xaf/0xc2 [cifs]
[] cifs_calculate_signature+0x55/0x69 [cifs]
[] kernel_sendmsg+0x35/0x47
[] smb_send+0xa3/0x151 [cifs]
[] SendReceive+0x1a2/0x448 [cifs]
[] __lock_acquire+0x95c/0xadf
[] CIFSSMBSetEOF+0x20d/0x25b [cifs]
[] cifs_set_file_size+0x110/0x3b7 [cifs]
[] cifs_setattr+0x3b2/0x6f6 [cifs]
[] notify_change+0xf5/0x2e0
[] notify_change+0x145/0x2e0
[] do_truncate+0x50/0x6b
[] get_write_access+0x40/0x46
[] may_open+0x1d3/0x22e
[] open_namei+0x2c6/0x6dd
[] do_filp_open+0x1c/0x38
[] _spin_unlock+0x17/0x20
[] get_unused_fd+0xf9/0x107
[] do_sys_open+0x44/0xbe
[] tracesys+0xd5/0xdf
[] 0xffffffffffffffff

other info that might help us debug this:

2 locks held by test5/2483:
#0: (&inode->i_mutex){--..}, at: [] do_truncate+0x45/0x6b
#1: (&inode->i_alloc_sem){--..}, at: [] notify_change+0xf5/0x2e0

stack backtrace:

Call Trace:
[] print_circular_bug_tail+0x65/0x6e
[] print_stack_trace+0x59/0x68
[] __lock_acquire+0x8bf/0xadf
[] lock_acquire+0x55/0x70
[] tcp_sendmsg+0x1c/0xb2f
[] lock_sock+0xd4/0xe4
[] _local_bh_enable+0xcb/0xe0
[] restore_args+0x0/0x30
[] tcp_sendmsg+0x1c/0xb2f
[] sock_sendmsg+0xf3/0x110
[] autoremove_wake_function+0x0/0x2e
[] kernel_text_address+0x1a/0x26
[] dump_trace+0x211/0x23a
[] find_usage_backwards+0x5f/0x88
[] :cifs:MD5Final+0xaf/0xc2
[] :cifs:cifs_calculate_signature+0x55/0x69
[] kernel_sendmsg+0x35/0x47
[] :cifs:smb_send+0xa3/0x151
[] :cifs:SendReceive+0x1a2/0x448
[] __lock_acquire+0x95c/0xadf
[] :cifs:CIFSSMBSetEOF+0x20d/0x25b
[] :cifs:cifs_set_file_size+0x110/0x3b7
[] :cifs:cifs_setattr+0x3b2/0x6f6
[] notify_change+0xf5/0x2e0
[] notify_change+0x145/0x2e0
[] do_truncate+0x50/0x6b
[] get_write_access+0x40/0x46
[] may_open+0x1d3/0x22e
[] open_namei+0x2c6/0x6dd
[] do_filp_open+0x1c/0x38
[] _spin_unlock+0x17/0x20
[] get_unused_fd+0xf9/0x107
[] do_sys_open+0x44/0xbe
[] tracesys+0xd5/0xdf


Signed-off-by: Jeff Layton
Acked-by: Peter Zijlstra
---
fs/cifs/connect.c | 35 +++++++++++++++++++++++++++++++++++
1 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index e8fa46c..6444627 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -1461,6 +1461,39 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
return rc;
}

+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+static struct lock_class_key cifs_key[2];
+static struct lock_class_key cifs_slock_key[2];
+
+static inline void
+cifs_reclassify_socket4(struct socket *sock)
+{
+ struct sock *sk = sock->sk;
+ BUG_ON(sock_owned_by_user(sk));
+ sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
+ &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
+}
+
+static inline void
+cifs_reclassify_socket6(struct socket *sock)
+{
+ struct sock *sk = sock->sk;
+ BUG_ON(sock_owned_by_user(sk));
+ sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
+ &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
+}
+#else
+static inline void
+cifs_reclassify_socket4(struct socket *sock)
+{
+}
+
+static inline void
+cifs_reclassify_socket6(struct socket *sock)
+{
+}
+#endif
+
/* See RFC1001 section 14 on representation of Netbios names */
static void rfc1002mangle(char *target, char *source, unsigned int length)
{
@@ -1495,6 +1528,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* BB other socket options to set KEEPALIVE, NODELAY? */
cFYI(1, ("Socket created"));
(*csocket)->sk->sk_allocation = GFP_NOFS;
+ cifs_reclassify_socket4(*csocket);
}
}

@@ -1627,6 +1661,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
/* BB other socket options to set KEEPALIVE, NODELAY? */
cFYI(1, ("ipv6 Socket created"));
(*csocket)->sk->sk_allocation = GFP_NOFS;
+ cifs_reclassify_socket6(*csocket);
}
}

--
1.5.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/