提交 03746bad 编写于 作者: L Linus Torvalds

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.
...@@ -810,6 +810,7 @@ static int vlan_ioctl_handler(void __user *arg) ...@@ -810,6 +810,7 @@ static int vlan_ioctl_handler(void __user *arg)
err = -EINVAL; err = -EINVAL;
break; break;
case GET_VLAN_REALDEV_NAME_CMD: case GET_VLAN_REALDEV_NAME_CMD:
err = 0;
vlan_dev_get_realdev_name(dev, args.u.device2); vlan_dev_get_realdev_name(dev, args.u.device2);
if (copy_to_user(arg, &args, if (copy_to_user(arg, &args,
sizeof(struct vlan_ioctl_args))) { sizeof(struct vlan_ioctl_args))) {
...@@ -818,6 +819,7 @@ static int vlan_ioctl_handler(void __user *arg) ...@@ -818,6 +819,7 @@ static int vlan_ioctl_handler(void __user *arg)
break; break;
case GET_VLAN_VID_CMD: case GET_VLAN_VID_CMD:
err = 0;
vlan_dev_get_vid(dev, &vid); vlan_dev_get_vid(dev, &vid);
args.u.VID = vid; args.u.VID = vid;
if (copy_to_user(arg, &args, if (copy_to_user(arg, &args,
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
* *
*/ */
#include <linux/in.h>
#include <linux/netfilter_bridge/ebtables.h> #include <linux/netfilter_bridge/ebtables.h>
#include <linux/netfilter_bridge/ebt_log.h> #include <linux/netfilter_bridge/ebt_log.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
...@@ -196,10 +195,8 @@ static int __init ebt_log_init(void) ...@@ -196,10 +195,8 @@ static int __init ebt_log_init(void)
ret = ebt_register_watcher(&log); ret = ebt_register_watcher(&log);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = nf_log_register(PF_BRIDGE, &ebt_log_logger); nf_log_register(PF_BRIDGE, &ebt_log_logger);
if (ret < 0 && ret != -EEXIST) return 0;
ebt_unregister_watcher(&log);
return ret;
} }
static void __exit ebt_log_fini(void) static void __exit ebt_log_fini(void)
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/netlink.h> #include <linux/netlink.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/module.h>
#include <linux/netfilter_bridge/ebtables.h> #include <linux/netfilter_bridge/ebtables.h>
#include <linux/netfilter_bridge/ebt_ulog.h> #include <linux/netfilter_bridge/ebt_ulog.h>
#include <net/sock.h> #include <net/sock.h>
...@@ -308,12 +307,8 @@ static int __init ebt_ulog_init(void) ...@@ -308,12 +307,8 @@ static int __init ebt_ulog_init(void)
else if ((ret = ebt_register_watcher(&ulog))) else if ((ret = ebt_register_watcher(&ulog)))
sock_release(ebtulognl->sk_socket); sock_release(ebtulognl->sk_socket);
if (nf_log_register(PF_BRIDGE, &ebt_ulog_logger) < 0) { if (ret == 0)
printk(KERN_WARNING "ebt_ulog: not logging via ulog " nf_log_register(PF_BRIDGE, &ebt_ulog_logger);
"since somebody else already registered for PF_BRIDGE\n");
/* we cannot make module load fail here, since otherwise
* ebtables userspace would abort */
}
return ret; return ret;
} }
......
...@@ -479,10 +479,8 @@ static int __init ipt_log_init(void) ...@@ -479,10 +479,8 @@ static int __init ipt_log_init(void)
ret = xt_register_target(&ipt_log_reg); ret = xt_register_target(&ipt_log_reg);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = nf_log_register(PF_INET, &ipt_log_logger); nf_log_register(PF_INET, &ipt_log_logger);
if (ret < 0 && ret != -EEXIST) return 0;
xt_unregister_target(&ipt_log_reg);
return ret;
} }
static void __exit ipt_log_fini(void) static void __exit ipt_log_fini(void)
......
...@@ -493,10 +493,8 @@ static int __init ip6t_log_init(void) ...@@ -493,10 +493,8 @@ static int __init ip6t_log_init(void)
ret = xt_register_target(&ip6t_log_reg); ret = xt_register_target(&ip6t_log_reg);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = nf_log_register(PF_INET6, &ip6t_logger); nf_log_register(PF_INET6, &ip6t_logger);
if (ret < 0 && ret != -EEXIST) return 0;
xt_unregister_target(&ip6t_log_reg);
return ret;
} }
static void __exit ip6t_log_fini(void) static void __exit ip6t_log_fini(void)
......
...@@ -633,6 +633,7 @@ static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer) ...@@ -633,6 +633,7 @@ static int tcp_v6_md5_do_del(struct sock *sk, struct in6_addr *peer)
if (tp->md5sig_info->entries6 == 0) { if (tp->md5sig_info->entries6 == 0) {
kfree(tp->md5sig_info->keys6); kfree(tp->md5sig_info->keys6);
tp->md5sig_info->keys6 = NULL; tp->md5sig_info->keys6 = NULL;
tp->md5sig_info->alloced6 = 0;
tcp_free_md5sig_pool(); tcp_free_md5sig_pool();
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/netfilter.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/in.h> #include <linux/in.h>
#include <linux/tcp.h> #include <linux/tcp.h>
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/udp.h> #include <linux/udp.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/udp.h> #include <linux/udp.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/netfilter_bridge.h> #include <linux/netfilter_bridge.h>
#include <linux/netfilter/xt_physdev.h> #include <linux/netfilter/xt_physdev.h>
#include <linux/netfilter/x_tables.h> #include <linux/netfilter/x_tables.h>
#include <linux/netfilter_bridge.h>
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Bart De Schuymer <bdschuym@pandora.be>"); MODULE_AUTHOR("Bart De Schuymer <bdschuym@pandora.be>");
......
...@@ -184,7 +184,7 @@ int genl_register_mc_group(struct genl_family *family, ...@@ -184,7 +184,7 @@ int genl_register_mc_group(struct genl_family *family,
} }
err = netlink_change_ngroups(genl_sock, err = netlink_change_ngroups(genl_sock,
sizeof(unsigned long) * NETLINK_GENERIC); mc_groups_longs * BITS_PER_LONG);
if (err) if (err)
goto out; goto out;
...@@ -196,10 +196,22 @@ int genl_register_mc_group(struct genl_family *family, ...@@ -196,10 +196,22 @@ int genl_register_mc_group(struct genl_family *family,
genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, grp); genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, grp);
out: out:
genl_unlock(); genl_unlock();
return 0; return err;
} }
EXPORT_SYMBOL(genl_register_mc_group); 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 * genl_unregister_mc_group - unregister a multicast group
* *
...@@ -217,14 +229,8 @@ EXPORT_SYMBOL(genl_register_mc_group); ...@@ -217,14 +229,8 @@ EXPORT_SYMBOL(genl_register_mc_group);
void genl_unregister_mc_group(struct genl_family *family, void genl_unregister_mc_group(struct genl_family *family,
struct genl_multicast_group *grp) struct genl_multicast_group *grp)
{ {
BUG_ON(grp->family != family);
genl_lock(); genl_lock();
netlink_clear_multicast_users(genl_sock, grp->id); __genl_unregister_mc_group(family, grp);
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_unlock(); genl_unlock();
} }
...@@ -232,8 +238,10 @@ static void genl_unregister_mc_groups(struct genl_family *family) ...@@ -232,8 +238,10 @@ static void genl_unregister_mc_groups(struct genl_family *family)
{ {
struct genl_multicast_group *grp, *tmp; struct genl_multicast_group *grp, *tmp;
genl_lock();
list_for_each_entry_safe(grp, tmp, &family->mcast_groups, list) 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();
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册