Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c net/bridge/br_multicast.c net/ipv6/sit.c The conflicts were minor: 1) sit.c changes overlap with change to ip_tunnel_xmit() signature. 2) br_multicast.c had an overlap between computing max_delay using msecs_to_jiffies and turning MLDV2_MRC() into an inline function with a name using lowercase instead of uppercase letters. 3) stmmac had two overlapping changes, one which conditionally allocated and hooked up a dma_cfg based upon the presence of the pbl OF property, and another one handling store-and-forward DMA made. The latter of which should not go into the new of_find_property() basic block. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -364,7 +364,7 @@ int genl_unregister_ops(struct genl_family *family, struct genl_ops *ops)
|
||||
EXPORT_SYMBOL(genl_unregister_ops);
|
||||
|
||||
/**
|
||||
* genl_register_family - register a generic netlink family
|
||||
* __genl_register_family - register a generic netlink family
|
||||
* @family: generic netlink family
|
||||
*
|
||||
* Registers the specified family after validating it first. Only one
|
||||
@@ -374,7 +374,7 @@ EXPORT_SYMBOL(genl_unregister_ops);
|
||||
*
|
||||
* Return 0 on success or a negative error code.
|
||||
*/
|
||||
int genl_register_family(struct genl_family *family)
|
||||
int __genl_register_family(struct genl_family *family)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
|
||||
@@ -430,10 +430,10 @@ errout_locked:
|
||||
errout:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(genl_register_family);
|
||||
EXPORT_SYMBOL(__genl_register_family);
|
||||
|
||||
/**
|
||||
* genl_register_family_with_ops - register a generic netlink family
|
||||
* __genl_register_family_with_ops - register a generic netlink family
|
||||
* @family: generic netlink family
|
||||
* @ops: operations to be registered
|
||||
* @n_ops: number of elements to register
|
||||
@@ -457,12 +457,12 @@ EXPORT_SYMBOL(genl_register_family);
|
||||
*
|
||||
* Return 0 on success or a negative error code.
|
||||
*/
|
||||
int genl_register_family_with_ops(struct genl_family *family,
|
||||
int __genl_register_family_with_ops(struct genl_family *family,
|
||||
struct genl_ops *ops, size_t n_ops)
|
||||
{
|
||||
int err, i;
|
||||
|
||||
err = genl_register_family(family);
|
||||
err = __genl_register_family(family);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -476,7 +476,7 @@ err_out:
|
||||
genl_unregister_family(family);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(genl_register_family_with_ops);
|
||||
EXPORT_SYMBOL(__genl_register_family_with_ops);
|
||||
|
||||
/**
|
||||
* genl_unregister_family - unregister generic netlink family
|
||||
@@ -544,6 +544,30 @@ void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
|
||||
}
|
||||
EXPORT_SYMBOL(genlmsg_put);
|
||||
|
||||
static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
{
|
||||
struct genl_ops *ops = cb->data;
|
||||
int rc;
|
||||
|
||||
genl_lock();
|
||||
rc = ops->dumpit(skb, cb);
|
||||
genl_unlock();
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int genl_lock_done(struct netlink_callback *cb)
|
||||
{
|
||||
struct genl_ops *ops = cb->data;
|
||||
int rc = 0;
|
||||
|
||||
if (ops->done) {
|
||||
genl_lock();
|
||||
rc = ops->done(cb);
|
||||
genl_unlock();
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int genl_family_rcv_msg(struct genl_family *family,
|
||||
struct sk_buff *skb,
|
||||
struct nlmsghdr *nlh)
|
||||
@@ -572,15 +596,34 @@ static int genl_family_rcv_msg(struct genl_family *family,
|
||||
return -EPERM;
|
||||
|
||||
if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) {
|
||||
struct netlink_dump_control c = {
|
||||
.dump = ops->dumpit,
|
||||
.done = ops->done,
|
||||
};
|
||||
int rc;
|
||||
|
||||
if (ops->dumpit == NULL)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return netlink_dump_start(net->genl_sock, skb, nlh, &c);
|
||||
if (!family->parallel_ops) {
|
||||
struct netlink_dump_control c = {
|
||||
.module = family->module,
|
||||
.data = ops,
|
||||
.dump = genl_lock_dumpit,
|
||||
.done = genl_lock_done,
|
||||
};
|
||||
|
||||
genl_unlock();
|
||||
rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
|
||||
genl_lock();
|
||||
|
||||
} else {
|
||||
struct netlink_dump_control c = {
|
||||
.module = family->module,
|
||||
.dump = ops->dumpit,
|
||||
.done = ops->done,
|
||||
};
|
||||
|
||||
rc = __netlink_dump_start(net->genl_sock, skb, nlh, &c);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (ops->doit == NULL)
|
||||
|
Reference in New Issue
Block a user