aboutsummaryrefslogtreecommitdiffstats
path: root/net/netlink/af_netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/netlink/af_netlink.c')
-rw-r--r--net/netlink/af_netlink.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 0007b8180397..d479b32d5826 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -114,14 +114,14 @@ static atomic_t nl_table_users = ATOMIC_INIT(0);
114DEFINE_MUTEX(nl_sk_hash_lock); 114DEFINE_MUTEX(nl_sk_hash_lock);
115EXPORT_SYMBOL_GPL(nl_sk_hash_lock); 115EXPORT_SYMBOL_GPL(nl_sk_hash_lock);
116 116
117static int lockdep_nl_sk_hash_is_held(void) 117#ifdef CONFIG_PROVE_LOCKING
118static int lockdep_nl_sk_hash_is_held(void *parent)
118{ 119{
119#ifdef CONFIG_LOCKDEP
120 if (debug_locks) 120 if (debug_locks)
121 return lockdep_is_held(&nl_sk_hash_lock) || lockdep_is_held(&nl_table_lock); 121 return lockdep_is_held(&nl_sk_hash_lock) || lockdep_is_held(&nl_table_lock);
122#endif
123 return 1; 122 return 1;
124} 123}
124#endif
125 125
126static ATOMIC_NOTIFIER_HEAD(netlink_chain); 126static ATOMIC_NOTIFIER_HEAD(netlink_chain);
127 127
@@ -1092,7 +1092,7 @@ static int netlink_insert(struct sock *sk, struct net *net, u32 portid)
1092 1092
1093 nlk_sk(sk)->portid = portid; 1093 nlk_sk(sk)->portid = portid;
1094 sock_hold(sk); 1094 sock_hold(sk);
1095 rhashtable_insert(&table->hash, &nlk_sk(sk)->node, GFP_KERNEL); 1095 rhashtable_insert(&table->hash, &nlk_sk(sk)->node);
1096 err = 0; 1096 err = 0;
1097err: 1097err:
1098 mutex_unlock(&nl_sk_hash_lock); 1098 mutex_unlock(&nl_sk_hash_lock);
@@ -1105,7 +1105,7 @@ static void netlink_remove(struct sock *sk)
1105 1105
1106 mutex_lock(&nl_sk_hash_lock); 1106 mutex_lock(&nl_sk_hash_lock);
1107 table = &nl_table[sk->sk_protocol]; 1107 table = &nl_table[sk->sk_protocol];
1108 if (rhashtable_remove(&table->hash, &nlk_sk(sk)->node, GFP_KERNEL)) { 1108 if (rhashtable_remove(&table->hash, &nlk_sk(sk)->node)) {
1109 WARN_ON(atomic_read(&sk->sk_refcnt) == 1); 1109 WARN_ON(atomic_read(&sk->sk_refcnt) == 1);
1110 __sock_put(sk); 1110 __sock_put(sk);
1111 } 1111 }
@@ -2401,7 +2401,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
2401 } 2401 }
2402 2402
2403 skb_reset_transport_header(data_skb); 2403 skb_reset_transport_header(data_skb);
2404 err = skb_copy_datagram_iovec(data_skb, 0, msg->msg_iov, copied); 2404 err = skb_copy_datagram_msg(data_skb, 0, msg, copied);
2405 2405
2406 if (msg->msg_name) { 2406 if (msg->msg_name) {
2407 DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name); 2407 DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name);
@@ -3134,7 +3134,9 @@ static int __init netlink_proto_init(void)
3134 .max_shift = 16, /* 64K */ 3134 .max_shift = 16, /* 64K */
3135 .grow_decision = rht_grow_above_75, 3135 .grow_decision = rht_grow_above_75,
3136 .shrink_decision = rht_shrink_below_30, 3136 .shrink_decision = rht_shrink_below_30,
3137#ifdef CONFIG_PROVE_LOCKING
3137 .mutex_is_held = lockdep_nl_sk_hash_is_held, 3138 .mutex_is_held = lockdep_nl_sk_hash_is_held,
3139#endif
3138 }; 3140 };
3139 3141
3140 if (err != 0) 3142 if (err != 0)