summaryrefslogtreecommitdiffstats
path: root/net/core/sock.c
diff options
context:
space:
mode:
authorPatrick McHardy2005-09-07 04:47:50 +0200
committerDavid S. Miller2005-09-07 04:47:50 +0200
commit0a3f4358ac6283fe3a565183eaf9716de28b6fd0 (patch)
treec325ab565db7956b966f391714c9155d0aacc83f /net/core/sock.c
parent[IPV4]: Reassembly trim not clearing CHECKSUM_HW (diff)
downloadkernel-qcow2-linux-0a3f4358ac6283fe3a565183eaf9716de28b6fd0.tar.gz
kernel-qcow2-linux-0a3f4358ac6283fe3a565183eaf9716de28b6fd0.tar.xz
kernel-qcow2-linux-0a3f4358ac6283fe3a565183eaf9716de28b6fd0.zip
[NET]: proto_unregister: fix sleeping while atomic
proto_unregister holds a lock while calling kmem_cache_destroy, which can sleep. Noticed by Daniele Orlandi <daniele@orlandi.com>. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/sock.c')
-rw-r--r--net/core/sock.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index b32b1815ae5a..ac63b56e23b2 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1529,6 +1529,8 @@ EXPORT_SYMBOL(proto_register);
void proto_unregister(struct proto *prot)
{
write_lock(&proto_list_lock);
+ list_del(&prot->node);
+ write_unlock(&proto_list_lock);
if (prot->slab != NULL) {
kmem_cache_destroy(prot->slab);
@@ -1550,9 +1552,6 @@ void proto_unregister(struct proto *prot)
kfree(name);
prot->twsk_slab = NULL;
}
-
- list_del(&prot->node);
- write_unlock(&proto_list_lock);
}
EXPORT_SYMBOL(proto_unregister);