diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-24 15:57:12 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-24 15:57:12 -0700 |
commit | 03746bad30890284cc14fc39184c5b60b9cb8bc9 (patch) | |
tree | 598728021adf309e2e46130bdef86ecf1b601054 /net/netlink | |
parent | 719be62903a6e6419789557cb3ed0e840d3e4ca9 (diff) | |
parent | 3f5f4346b6d3c8bc33780a941da2473c4be2c989 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[8021Q]: vlan_ioctl_handler: fix return value
[GENETLINK]: Correctly report errors while registering a multicast group
[GENETLINK]: Fix adjustment of number of multicast groups
[GENETLINK]: Fix race in genl_unregister_mc_groups()
[NETFILTER]: Clean up duplicate includes in net/netfilter/
[NETFILTER]: Clean up duplicate includes in net/bridge/
[NETFILTER]: Fix logging regression
[TCPv6] MD5SIG: Ensure to reset allocation count to avoid panic.
Diffstat (limited to 'net/netlink')
-rw-r--r-- | net/netlink/genetlink.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index e146531faf1..8c11ca4a212 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c @@ -184,7 +184,7 @@ int genl_register_mc_group(struct genl_family *family, } err = netlink_change_ngroups(genl_sock, - sizeof(unsigned long) * NETLINK_GENERIC); + mc_groups_longs * BITS_PER_LONG); if (err) goto out; @@ -196,10 +196,22 @@ int genl_register_mc_group(struct genl_family *family, genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, grp); out: genl_unlock(); - return 0; + return err; } EXPORT_SYMBOL(genl_register_mc_group); +static void __genl_unregister_mc_group(struct genl_family *family, + struct genl_multicast_group *grp) +{ + BUG_ON(grp->family != family); + netlink_clear_multicast_users(genl_sock, grp->id); + clear_bit(grp->id, mc_groups); + list_del(&grp->list); + genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, grp); + grp->id = 0; + grp->family = NULL; +} + /** * genl_unregister_mc_group - unregister a multicast group * @@ -217,14 +229,8 @@ EXPORT_SYMBOL(genl_register_mc_group); void genl_unregister_mc_group(struct genl_family *family, struct genl_multicast_group *grp) { - BUG_ON(grp->family != family); genl_lock(); - netlink_clear_multicast_users(genl_sock, grp->id); - clear_bit(grp->id, mc_groups); - list_del(&grp->list); - genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, grp); - grp->id = 0; - grp->family = NULL; + __genl_unregister_mc_group(family, grp); genl_unlock(); } @@ -232,8 +238,10 @@ static void genl_unregister_mc_groups(struct genl_family *family) { struct genl_multicast_group *grp, *tmp; + genl_lock(); list_for_each_entry_safe(grp, tmp, &family->mcast_groups, list) - genl_unregister_mc_group(family, grp); + __genl_unregister_mc_group(family, grp); + genl_unlock(); } /** |