[PATCH 4.0 029/105] netlink: Disable insertions/removals during rehash

From: Greg Kroah-Hartman
Date: Fri Jun 19 2015 - 17:21:02 EST


4.0-stable review patch. If anyone has any objections, please let me know.

------------------

From: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>

[ Upstream commit: Not applicable ]

The current rhashtable rehash code is buggy and can't deal with
parallel insertions/removals without corrupting the hash table.

This patch disables it by partially reverting
c5adde9468b0714a051eac7f9666f23eb10b61f7 ("netlink: eliminate
nl_sk_hash_lock").

Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
net/netlink/af_netlink.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1052,7 +1052,7 @@ static int netlink_insert(struct sock *s
struct netlink_table *table = &nl_table[sk->sk_protocol];
int err;

- lock_sock(sk);
+ mutex_lock(&table->hash.mutex);

err = -EBUSY;
if (nlk_sk(sk)->portid)
@@ -1074,7 +1074,7 @@ static int netlink_insert(struct sock *s
}

err:
- release_sock(sk);
+ mutex_unlock(&table->hash.mutex);
return err;
}

@@ -1083,10 +1083,12 @@ static void netlink_remove(struct sock *
struct netlink_table *table;

table = &nl_table[sk->sk_protocol];
+ mutex_lock(&table->hash.mutex);
if (rhashtable_remove(&table->hash, &nlk_sk(sk)->node)) {
WARN_ON(atomic_read(&sk->sk_refcnt) == 1);
__sock_put(sk);
}
+ mutex_unlock(&table->hash.mutex);

netlink_table_grab();
if (nlk_sk(sk)->subscriptions) {


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/