[NET]: proto_unregister: fix sleeping while atomic
authorPatrick McHardy <kaber@trash.net>
Wed, 7 Sep 2005 02:47:50 +0000 (19:47 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Sep 2005 02:47:50 +0000 (19:47 -0700)
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>
net/core/sock.c

index b32b1815ae5a362beb8b73f904fe06a8715d3f0f..ac63b56e23b29c45113df81fa226bc2c9568d758 100644 (file)
@@ -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);