]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/netlink/genetlink.c
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[karo-tx-linux.git] / net / netlink / genetlink.c
index bc0e504f33a68ee92897cb3c45241d4d3348deba..f830326b3b1dbaf63e727e7a4f4f496d5108db64 100644 (file)
@@ -185,7 +185,7 @@ static int genl_allocate_reserve_groups(int n_groups, int *first_id)
                        }
                }
 
-               if (id >= mc_groups_longs * BITS_PER_LONG) {
+               if (id + n_groups > mc_groups_longs * BITS_PER_LONG) {
                        unsigned long new_longs = mc_groups_longs +
                                                  BITS_TO_LONGS(n_groups);
                        size_t nlen = new_longs * sizeof(unsigned long);
@@ -513,6 +513,20 @@ void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
 }
 EXPORT_SYMBOL(genlmsg_put);
 
+static int genl_lock_start(struct netlink_callback *cb)
+{
+       /* our ops are always const - netlink API doesn't propagate that */
+       const struct genl_ops *ops = cb->data;
+       int rc = 0;
+
+       if (ops->start) {
+               genl_lock();
+               rc = ops->start(cb);
+               genl_unlock();
+       }
+       return rc;
+}
+
 static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
 {
        /* our ops are always const - netlink API doesn't propagate that */
@@ -577,6 +591,7 @@ static int genl_family_rcv_msg(struct genl_family *family,
                                .module = family->module,
                                /* we have const, but the netlink API doesn't */
                                .data = (void *)ops,
+                               .start = genl_lock_start,
                                .dump = genl_lock_dumpit,
                                .done = genl_lock_done,
                        };
@@ -588,6 +603,7 @@ static int genl_family_rcv_msg(struct genl_family *family,
                } else {
                        struct netlink_dump_control c = {
                                .module = family->module,
+                               .start = ops->start,
                                .dump = ops->dumpit,
                                .done = ops->done,
                        };