|
@@ -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,
|
|
|
};
|