diff options
Diffstat (limited to 'net/netlink/af_netlink.c')
-rw-r--r-- | net/netlink/af_netlink.c | 14 |
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); | |||
114 | DEFINE_MUTEX(nl_sk_hash_lock); | 114 | DEFINE_MUTEX(nl_sk_hash_lock); |
115 | EXPORT_SYMBOL_GPL(nl_sk_hash_lock); | 115 | EXPORT_SYMBOL_GPL(nl_sk_hash_lock); |
116 | 116 | ||
117 | static int lockdep_nl_sk_hash_is_held(void) | 117 | #ifdef CONFIG_PROVE_LOCKING |
118 | static 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 | ||
126 | static ATOMIC_NOTIFIER_HEAD(netlink_chain); | 126 | static 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; |
1097 | err: | 1097 | err: |
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) |