Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1815 commits) mac80211: fix reorder buffer release iwmc3200wifi: Enable wimax core through module parameter iwmc3200wifi: Add wifi-wimax coexistence mode as a module parameter iwmc3200wifi: Coex table command does not expect a response iwmc3200wifi: Update wiwi priority table iwlwifi: driver version track kernel version iwlwifi: indicate uCode type when fail dump error/event log iwl3945: remove duplicated event logging code b43: fix two warnings ipw2100: fix rebooting hang with driver loaded cfg80211: indent regulatory messages with spaces iwmc3200wifi: fix NULL pointer dereference in pmkid update mac80211: Fix TX status reporting for injected data frames ath9k: enable 2GHz band only if the device supports it airo: Fix integer overflow warning rt2x00: Fix padding bug on L2PAD devices. WE: Fix set events not propagated b43legacy: avoid PPC fault during resume b43: avoid PPC fault during resume tcp: fix a timewait refcnt race ... Fix up conflicts due to sysctl cleanups (dead sysctl_check code and CTL_UNNUMBERED removed) in kernel/sysctl_check.c net/ipv4/sysctl_net_ipv4.c net/ipv6/addrconf.c net/sctp/sysctl.c
This commit is contained in:
@@ -675,11 +675,12 @@ char *dn_addr2asc(__u16 addr, char *buf)
|
||||
|
||||
|
||||
|
||||
static int dn_create(struct net *net, struct socket *sock, int protocol)
|
||||
static int dn_create(struct net *net, struct socket *sock, int protocol,
|
||||
int kern)
|
||||
{
|
||||
struct sock *sk;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
switch(sock->type) {
|
||||
@@ -749,9 +750,9 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
|
||||
if (!(saddr->sdn_flags & SDF_WILD)) {
|
||||
if (le16_to_cpu(saddr->sdn_nodeaddrl)) {
|
||||
read_lock(&dev_base_lock);
|
||||
rcu_read_lock();
|
||||
ldev = NULL;
|
||||
for_each_netdev(&init_net, dev) {
|
||||
for_each_netdev_rcu(&init_net, dev) {
|
||||
if (!dev->dn_ptr)
|
||||
continue;
|
||||
if (dn_dev_islocal(dev, dn_saddr2dn(saddr))) {
|
||||
@@ -759,7 +760,7 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
break;
|
||||
}
|
||||
}
|
||||
read_unlock(&dev_base_lock);
|
||||
rcu_read_unlock();
|
||||
if (ldev == NULL)
|
||||
return -EADDRNOTAVAIL;
|
||||
}
|
||||
@@ -1955,7 +1956,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||
}
|
||||
|
||||
if ((flags & MSG_TRYHARD) && sk->sk_dst_cache)
|
||||
dst_negative_advice(&sk->sk_dst_cache);
|
||||
dst_negative_advice(&sk->sk_dst_cache, sk);
|
||||
|
||||
mss = scp->segsize_rem;
|
||||
fctype = scp->services_rem & NSP_FC_MASK;
|
||||
@@ -2325,7 +2326,7 @@ static const struct file_operations dn_socket_seq_fops = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct net_proto_family dn_family_ops = {
|
||||
static const struct net_proto_family dn_family_ops = {
|
||||
.family = AF_DECnet,
|
||||
.create = dn_create,
|
||||
.owner = THIS_MODULE,
|
||||
|
@@ -68,7 +68,7 @@ extern struct neigh_table dn_neigh_table;
|
||||
*/
|
||||
__le16 decnet_address = 0;
|
||||
|
||||
static DEFINE_RWLOCK(dndev_lock);
|
||||
static DEFINE_SPINLOCK(dndev_lock);
|
||||
static struct net_device *decnet_default_device;
|
||||
static BLOCKING_NOTIFIER_HEAD(dnaddr_chain);
|
||||
|
||||
@@ -499,7 +499,8 @@ rarok:
|
||||
struct net_device *dn_dev_get_default(void)
|
||||
{
|
||||
struct net_device *dev;
|
||||
read_lock(&dndev_lock);
|
||||
|
||||
spin_lock(&dndev_lock);
|
||||
dev = decnet_default_device;
|
||||
if (dev) {
|
||||
if (dev->dn_ptr)
|
||||
@@ -507,7 +508,8 @@ struct net_device *dn_dev_get_default(void)
|
||||
else
|
||||
dev = NULL;
|
||||
}
|
||||
read_unlock(&dndev_lock);
|
||||
spin_unlock(&dndev_lock);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
@@ -517,13 +519,15 @@ int dn_dev_set_default(struct net_device *dev, int force)
|
||||
int rv = -EBUSY;
|
||||
if (!dev->dn_ptr)
|
||||
return -ENODEV;
|
||||
write_lock(&dndev_lock);
|
||||
|
||||
spin_lock(&dndev_lock);
|
||||
if (force || decnet_default_device == NULL) {
|
||||
old = decnet_default_device;
|
||||
decnet_default_device = dev;
|
||||
rv = 0;
|
||||
}
|
||||
write_unlock(&dndev_lock);
|
||||
spin_unlock(&dndev_lock);
|
||||
|
||||
if (old)
|
||||
dev_put(old);
|
||||
return rv;
|
||||
@@ -531,26 +535,29 @@ int dn_dev_set_default(struct net_device *dev, int force)
|
||||
|
||||
static void dn_dev_check_default(struct net_device *dev)
|
||||
{
|
||||
write_lock(&dndev_lock);
|
||||
spin_lock(&dndev_lock);
|
||||
if (dev == decnet_default_device) {
|
||||
decnet_default_device = NULL;
|
||||
} else {
|
||||
dev = NULL;
|
||||
}
|
||||
write_unlock(&dndev_lock);
|
||||
spin_unlock(&dndev_lock);
|
||||
|
||||
if (dev)
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called with RTNL
|
||||
*/
|
||||
static struct dn_dev *dn_dev_by_index(int ifindex)
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct dn_dev *dn_dev = NULL;
|
||||
dev = dev_get_by_index(&init_net, ifindex);
|
||||
if (dev) {
|
||||
|
||||
dev = __dev_get_by_index(&init_net, ifindex);
|
||||
if (dev)
|
||||
dn_dev = dev->dn_ptr;
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
return dn_dev;
|
||||
}
|
||||
@@ -571,7 +578,7 @@ static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||
struct dn_ifaddr *ifa, **ifap;
|
||||
int err = -EINVAL;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
goto errout;
|
||||
|
||||
err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy);
|
||||
@@ -610,7 +617,7 @@ static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||
struct dn_ifaddr *ifa;
|
||||
int err;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EINVAL;
|
||||
|
||||
err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy);
|
||||
@@ -724,7 +731,7 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
struct dn_dev *dn_db;
|
||||
struct dn_ifaddr *ifa;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return 0;
|
||||
|
||||
skip_ndevs = cb->args[0];
|
||||
@@ -768,13 +775,17 @@ static int dn_dev_get_first(struct net_device *dev, __le16 *addr)
|
||||
struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr;
|
||||
struct dn_ifaddr *ifa;
|
||||
int rv = -ENODEV;
|
||||
|
||||
if (dn_db == NULL)
|
||||
goto out;
|
||||
|
||||
rtnl_lock();
|
||||
ifa = dn_db->ifa_list;
|
||||
if (ifa != NULL) {
|
||||
*addr = ifa->ifa_local;
|
||||
rv = 0;
|
||||
}
|
||||
rtnl_unlock();
|
||||
out:
|
||||
return rv;
|
||||
}
|
||||
@@ -796,9 +807,7 @@ int dn_dev_bind_default(__le16 *addr)
|
||||
dev = dn_dev_get_default();
|
||||
last_chance:
|
||||
if (dev) {
|
||||
read_lock(&dev_base_lock);
|
||||
rv = dn_dev_get_first(dev, addr);
|
||||
read_unlock(&dev_base_lock);
|
||||
dev_put(dev);
|
||||
if (rv == 0 || dev == init_net.loopback_dev)
|
||||
return rv;
|
||||
@@ -1263,18 +1272,18 @@ static inline int is_dn_dev(struct net_device *dev)
|
||||
}
|
||||
|
||||
static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(&dev_base_lock)
|
||||
__acquires(rcu)
|
||||
{
|
||||
int i;
|
||||
struct net_device *dev;
|
||||
|
||||
read_lock(&dev_base_lock);
|
||||
rcu_read_lock();
|
||||
|
||||
if (*pos == 0)
|
||||
return SEQ_START_TOKEN;
|
||||
|
||||
i = 1;
|
||||
for_each_netdev(&init_net, dev) {
|
||||
for_each_netdev_rcu(&init_net, dev) {
|
||||
if (!is_dn_dev(dev))
|
||||
continue;
|
||||
|
||||
@@ -1295,7 +1304,7 @@ static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
if (v == SEQ_START_TOKEN)
|
||||
dev = net_device_entry(&init_net.dev_base_head);
|
||||
|
||||
for_each_netdev_continue(&init_net, dev) {
|
||||
for_each_netdev_continue_rcu(&init_net, dev) {
|
||||
if (!is_dn_dev(dev))
|
||||
continue;
|
||||
|
||||
@@ -1306,9 +1315,9 @@ static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
}
|
||||
|
||||
static void dn_dev_seq_stop(struct seq_file *seq, void *v)
|
||||
__releases(&dev_base_lock)
|
||||
__releases(rcu)
|
||||
{
|
||||
read_unlock(&dev_base_lock);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static char *dn_type2asc(char type)
|
||||
|
@@ -509,7 +509,7 @@ static int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *
|
||||
struct rtattr **rta = arg;
|
||||
struct rtmsg *r = NLMSG_DATA(nlh);
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EINVAL;
|
||||
|
||||
if (dn_fib_check_attr(r, rta))
|
||||
@@ -529,7 +529,7 @@ static int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *
|
||||
struct rtattr **rta = arg;
|
||||
struct rtmsg *r = NLMSG_DATA(nlh);
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EINVAL;
|
||||
|
||||
if (dn_fib_check_attr(r, rta))
|
||||
@@ -607,8 +607,8 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa)
|
||||
ASSERT_RTNL();
|
||||
|
||||
/* Scan device list */
|
||||
read_lock(&dev_base_lock);
|
||||
for_each_netdev(&init_net, dev) {
|
||||
rcu_read_lock();
|
||||
for_each_netdev_rcu(&init_net, dev) {
|
||||
dn_db = dev->dn_ptr;
|
||||
if (dn_db == NULL)
|
||||
continue;
|
||||
@@ -619,7 +619,7 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa)
|
||||
}
|
||||
}
|
||||
}
|
||||
read_unlock(&dev_base_lock);
|
||||
rcu_read_unlock();
|
||||
|
||||
if (found_it == 0) {
|
||||
fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa);
|
||||
|
@@ -908,8 +908,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
|
||||
dev_put(dev_out);
|
||||
goto out;
|
||||
}
|
||||
read_lock(&dev_base_lock);
|
||||
for_each_netdev(&init_net, dev) {
|
||||
rcu_read_lock();
|
||||
for_each_netdev_rcu(&init_net, dev) {
|
||||
if (!dev->dn_ptr)
|
||||
continue;
|
||||
if (!dn_dev_islocal(dev, oldflp->fld_src))
|
||||
@@ -922,7 +922,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
|
||||
dev_out = dev;
|
||||
break;
|
||||
}
|
||||
read_unlock(&dev_base_lock);
|
||||
rcu_read_unlock();
|
||||
if (dev_out == NULL)
|
||||
goto out;
|
||||
dev_hold(dev_out);
|
||||
@@ -1517,7 +1517,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
|
||||
struct sk_buff *skb;
|
||||
struct flowi fl;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EINVAL;
|
||||
|
||||
memset(&fl, 0, sizeof(fl));
|
||||
@@ -1602,7 +1602,7 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
int h, s_h;
|
||||
int idx, s_idx;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return 0;
|
||||
|
||||
if (NLMSG_PAYLOAD(cb->nlh, 0) < sizeof(struct rtmsg))
|
||||
|
@@ -33,7 +33,7 @@
|
||||
#include <net/dn_dev.h>
|
||||
#include <net/dn_route.h>
|
||||
|
||||
static struct fib_rules_ops dn_fib_rules_ops;
|
||||
static struct fib_rules_ops *dn_fib_rules_ops;
|
||||
|
||||
struct dn_fib_rule
|
||||
{
|
||||
@@ -56,7 +56,7 @@ int dn_fib_lookup(struct flowi *flp, struct dn_fib_res *res)
|
||||
};
|
||||
int err;
|
||||
|
||||
err = fib_rules_lookup(&dn_fib_rules_ops, flp, 0, &arg);
|
||||
err = fib_rules_lookup(dn_fib_rules_ops, flp, 0, &arg);
|
||||
res->r = arg.rule;
|
||||
|
||||
return err;
|
||||
@@ -217,9 +217,9 @@ static u32 dn_fib_rule_default_pref(struct fib_rules_ops *ops)
|
||||
struct list_head *pos;
|
||||
struct fib_rule *rule;
|
||||
|
||||
if (!list_empty(&dn_fib_rules_ops.rules_list)) {
|
||||
pos = dn_fib_rules_ops.rules_list.next;
|
||||
if (pos->next != &dn_fib_rules_ops.rules_list) {
|
||||
if (!list_empty(&dn_fib_rules_ops->rules_list)) {
|
||||
pos = dn_fib_rules_ops->rules_list.next;
|
||||
if (pos->next != &dn_fib_rules_ops->rules_list) {
|
||||
rule = list_entry(pos->next, struct fib_rule, list);
|
||||
if (rule->pref)
|
||||
return rule->pref - 1;
|
||||
@@ -234,7 +234,7 @@ static void dn_fib_rule_flush_cache(struct fib_rules_ops *ops)
|
||||
dn_rt_cache_flush(-1);
|
||||
}
|
||||
|
||||
static struct fib_rules_ops dn_fib_rules_ops = {
|
||||
static struct fib_rules_ops dn_fib_rules_ops_template = {
|
||||
.family = AF_DECnet,
|
||||
.rule_size = sizeof(struct dn_fib_rule),
|
||||
.addr_size = sizeof(u16),
|
||||
@@ -247,21 +247,23 @@ static struct fib_rules_ops dn_fib_rules_ops = {
|
||||
.flush_cache = dn_fib_rule_flush_cache,
|
||||
.nlgroup = RTNLGRP_DECnet_RULE,
|
||||
.policy = dn_fib_rule_policy,
|
||||
.rules_list = LIST_HEAD_INIT(dn_fib_rules_ops.rules_list),
|
||||
.owner = THIS_MODULE,
|
||||
.fro_net = &init_net,
|
||||
};
|
||||
|
||||
void __init dn_fib_rules_init(void)
|
||||
{
|
||||
BUG_ON(fib_default_rule_add(&dn_fib_rules_ops, 0x7fff,
|
||||
dn_fib_rules_ops =
|
||||
fib_rules_register(&dn_fib_rules_ops_template, &init_net);
|
||||
BUG_ON(IS_ERR(dn_fib_rules_ops));
|
||||
BUG_ON(fib_default_rule_add(dn_fib_rules_ops, 0x7fff,
|
||||
RT_TABLE_MAIN, 0));
|
||||
fib_rules_register(&dn_fib_rules_ops);
|
||||
}
|
||||
|
||||
void __exit dn_fib_rules_cleanup(void)
|
||||
{
|
||||
fib_rules_unregister(&dn_fib_rules_ops);
|
||||
fib_rules_unregister(dn_fib_rules_ops);
|
||||
rcu_barrier();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -471,7 +471,7 @@ int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
struct hlist_node *node;
|
||||
int dumped = 0;
|
||||
|
||||
if (net != &init_net)
|
||||
if (!net_eq(net, &init_net))
|
||||
return 0;
|
||||
|
||||
if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) &&
|
||||
@@ -581,8 +581,9 @@ static int dn_fib_table_insert(struct dn_fib_table *tb, struct rtmsg *r, struct
|
||||
DN_FIB_SCAN_KEY(f, fp, key) {
|
||||
if (fi->fib_priority != DN_FIB_INFO(f)->fib_priority)
|
||||
break;
|
||||
if (f->fn_type == type && f->fn_scope == r->rtm_scope
|
||||
&& DN_FIB_INFO(f) == fi)
|
||||
if (f->fn_type == type &&
|
||||
f->fn_scope == r->rtm_scope &&
|
||||
DN_FIB_INFO(f) == fi)
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user