]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/netlink/genetlink.c
Merge branch 'tip/perf/jump-label-2' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / net / netlink / genetlink.c
index aa4308afcc7f07168d9317235e795218d878acdd..1781d99145e2d2594fc961e1a2fc9307aad957a5 100644 (file)
@@ -303,6 +303,7 @@ int genl_register_ops(struct genl_family *family, struct genl_ops *ops)
 errout:
        return err;
 }
+EXPORT_SYMBOL(genl_register_ops);
 
 /**
  * genl_unregister_ops - unregister generic netlink operations
@@ -337,6 +338,7 @@ int genl_unregister_ops(struct genl_family *family, struct genl_ops *ops)
 
        return -ENOENT;
 }
+EXPORT_SYMBOL(genl_unregister_ops);
 
 /**
  * genl_register_family - register a generic netlink family
@@ -405,6 +407,7 @@ errout_locked:
 errout:
        return err;
 }
+EXPORT_SYMBOL(genl_register_family);
 
 /**
  * genl_register_family_with_ops - register a generic netlink family
@@ -485,6 +488,7 @@ int genl_unregister_family(struct genl_family *family)
 
        return -ENOENT;
 }
+EXPORT_SYMBOL(genl_unregister_family);
 
 static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 {
@@ -543,8 +547,20 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
        info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN;
        info.attrs = family->attrbuf;
        genl_info_net_set(&info, net);
+       memset(&info.user_ptr, 0, sizeof(info.user_ptr));
+
+       if (family->pre_doit) {
+               err = family->pre_doit(ops, skb, &info);
+               if (err)
+                       return err;
+       }
+
+       err = ops->doit(skb, &info);
+
+       if (family->post_doit)
+               family->post_doit(ops, skb, &info);
 
-       return ops->doit(skb, &info);
+       return err;
 }
 
 static void genl_rcv(struct sk_buff *skb)
@@ -873,11 +889,7 @@ static int __init genl_init(void)
        for (i = 0; i < GENL_FAM_TAB_SIZE; i++)
                INIT_LIST_HEAD(&family_ht[i]);
 
-       err = genl_register_family(&genl_ctrl);
-       if (err < 0)
-               goto problem;
-
-       err = genl_register_ops(&genl_ctrl, &genl_ctrl_ops);
+       err = genl_register_family_with_ops(&genl_ctrl, &genl_ctrl_ops, 1);
        if (err < 0)
                goto problem;
 
@@ -899,11 +911,6 @@ problem:
 
 subsys_initcall(genl_init);
 
-EXPORT_SYMBOL(genl_register_ops);
-EXPORT_SYMBOL(genl_unregister_ops);
-EXPORT_SYMBOL(genl_register_family);
-EXPORT_SYMBOL(genl_unregister_family);
-
 static int genlmsg_mcast(struct sk_buff *skb, u32 pid, unsigned long group,
                         gfp_t flags)
 {