{
        int ret = 0;
 
-       if (net == &init_net)
-               ret = nf_conntrack_l3proto_register_net(proto);
+       if (proto->init_net) {
+               ret = proto->init_net(net);
+               if (ret < 0)
+                       return ret;
+       }
 
+       ret = nf_ct_l3proto_register_sysctl(net, proto);
        if (ret < 0)
                return ret;
 
-       if (proto->init_net) {
-               ret = proto->init_net(net);
+       if (net == &init_net) {
+               ret = nf_conntrack_l3proto_register_net(proto);
                if (ret < 0)
-                       return ret;
+                       nf_ct_l3proto_unregister_sysctl(net, proto);
        }
-       return nf_ct_l3proto_register_sysctl(net, proto);
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_register);
 
                                  struct nf_conntrack_l4proto *l4proto)
 {
        int ret = 0;
-       if (net == &init_net)
-               ret = nf_conntrack_l4proto_register_net(l4proto);
 
-       if (ret < 0)
-               return ret;
-
-       if (l4proto->init_net)
+       if (l4proto->init_net) {
                ret = l4proto->init_net(net);
+               if (ret < 0)
+                       return ret;
+       }
 
+       ret = nf_ct_l4proto_register_sysctl(net, l4proto);
        if (ret < 0)
                return ret;
 
-       return nf_ct_l4proto_register_sysctl(net, l4proto);
+       if (net == &init_net) {
+               ret = nf_conntrack_l4proto_register_net(l4proto);
+               if (ret < 0)
+                       nf_ct_l4proto_unregister_sysctl(net, l4proto);
+       }
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_register);