net,pppoe: fixup module init/exit subsequent calls
authorCyrill Gorcunov <gorcunov@openvz.org>
Wed, 12 Aug 2009 23:39:16 +0000 (16:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 12 Aug 2009 23:39:16 +0000 (16:39 -0700)
pernet data should allocated first and freed last
on module init/exit routines otherwise it's possible
to have unserialized calls to packet handling routines.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/pppoe.c

index 5f20902..7cbf6f9 100644 (file)
@@ -1185,17 +1185,17 @@ static int __init pppoe_init(void)
 {
        int err;
 
-       err = proto_register(&pppoe_sk_proto, 0);
+       err = register_pernet_gen_device(&pppoe_net_id, &pppoe_net_ops);
        if (err)
                goto out;
 
-       err = register_pppox_proto(PX_PROTO_OE, &pppoe_proto);
+       err = proto_register(&pppoe_sk_proto, 0);
        if (err)
-               goto out_unregister_pppoe_proto;
+               goto out_unregister_net_ops;
 
-       err = register_pernet_gen_device(&pppoe_net_id, &pppoe_net_ops);
+       err = register_pppox_proto(PX_PROTO_OE, &pppoe_proto);
        if (err)
-               goto out_unregister_pppox_proto;
+               goto out_unregister_pppoe_proto;
 
        dev_add_pack(&pppoes_ptype);
        dev_add_pack(&pppoed_ptype);
@@ -1203,22 +1203,22 @@ static int __init pppoe_init(void)
 
        return 0;
 
-out_unregister_pppox_proto:
-       unregister_pppox_proto(PX_PROTO_OE);
 out_unregister_pppoe_proto:
        proto_unregister(&pppoe_sk_proto);
+out_unregister_net_ops:
+       unregister_pernet_gen_device(pppoe_net_id, &pppoe_net_ops);
 out:
        return err;
 }
 
 static void __exit pppoe_exit(void)
 {
-       unregister_pppox_proto(PX_PROTO_OE);
-       dev_remove_pack(&pppoes_ptype);
-       dev_remove_pack(&pppoed_ptype);
        unregister_netdevice_notifier(&pppoe_notifier);
-       unregister_pernet_gen_device(pppoe_net_id, &pppoe_net_ops);
+       dev_remove_pack(&pppoed_ptype);
+       dev_remove_pack(&pppoes_ptype);
+       unregister_pppox_proto(PX_PROTO_OE);
        proto_unregister(&pppoe_sk_proto);
+       unregister_pernet_gen_device(pppoe_net_id, &pppoe_net_ops);
 }
 
 module_init(pppoe_init);