Commit 4bab0ea1 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
  net: Fix recursive descent in __scm_destroy().
  iwl3945: fix deadlock on suspend
  iwl3945: do not send scan command if channel count zero
  iwl3945: clear scanning bits upon failure
  ath5k: correct handling of rx status fields
  zd1211rw: Add 2 device IDs
  Fix logic error in rfkill_check_duplicity
  iwlagn: avoid sleep in softirq context
  iwlwifi: clear scanning bits upon failure
  Revert "ath5k: honor FIF_BCN_PRBRESP_PROMISC in STA mode"
  tcp: Fix recvmsg MSG_PEEK influence of blocking behavior.
  netfilter: netns ct: walk netns list under RTNL
  ipv6: fix run pending DAD when interface becomes ready
  net/9p: fix printk format warnings
  net: fix packet socket delivery in rx irq handler
  xfrm: Have af-specific init_tempsel() initialize family field of temporary selector
parents a15a82f4 ca409d6e
...@@ -2942,8 +2942,10 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, ...@@ -2942,8 +2942,10 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw,
sc->opmode != NL80211_IFTYPE_MESH_POINT && sc->opmode != NL80211_IFTYPE_MESH_POINT &&
test_bit(ATH_STAT_PROMISC, sc->status)) test_bit(ATH_STAT_PROMISC, sc->status))
rfilt |= AR5K_RX_FILTER_PROM; rfilt |= AR5K_RX_FILTER_PROM;
if (sc->opmode == NL80211_IFTYPE_ADHOC) if (sc->opmode == NL80211_IFTYPE_STATION ||
sc->opmode == NL80211_IFTYPE_ADHOC) {
rfilt |= AR5K_RX_FILTER_BEACON; rfilt |= AR5K_RX_FILTER_BEACON;
}
/* Set filters */ /* Set filters */
ath5k_hw_set_rx_filter(ah,rfilt); ath5k_hw_set_rx_filter(ah,rfilt);
......
...@@ -531,10 +531,10 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah, ...@@ -531,10 +531,10 @@ static int ath5k_hw_proc_5210_rx_status(struct ath5k_hw *ah,
AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL); AR5K_5210_RX_DESC_STATUS0_RECEIVE_SIGNAL);
rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0, rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0,
AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE); AR5K_5210_RX_DESC_STATUS0_RECEIVE_RATE);
rs->rs_antenna = rx_status->rx_status_0 & rs->rs_antenna = AR5K_REG_MS(rx_status->rx_status_0,
AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANTENNA; AR5K_5210_RX_DESC_STATUS0_RECEIVE_ANTENNA);
rs->rs_more = rx_status->rx_status_0 & rs->rs_more = !!(rx_status->rx_status_0 &
AR5K_5210_RX_DESC_STATUS0_MORE; AR5K_5210_RX_DESC_STATUS0_MORE);
/* TODO: this timestamp is 13 bit, later on we assume 15 bit */ /* TODO: this timestamp is 13 bit, later on we assume 15 bit */
rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1,
AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); AR5K_5210_RX_DESC_STATUS1_RECEIVE_TIMESTAMP);
...@@ -607,10 +607,10 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah, ...@@ -607,10 +607,10 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah,
AR5K_5212_RX_DESC_STATUS0_RECEIVE_SIGNAL); AR5K_5212_RX_DESC_STATUS0_RECEIVE_SIGNAL);
rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0, rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0,
AR5K_5212_RX_DESC_STATUS0_RECEIVE_RATE); AR5K_5212_RX_DESC_STATUS0_RECEIVE_RATE);
rs->rs_antenna = rx_status->rx_status_0 & rs->rs_antenna = AR5K_REG_MS(rx_status->rx_status_0,
AR5K_5212_RX_DESC_STATUS0_RECEIVE_ANTENNA; AR5K_5212_RX_DESC_STATUS0_RECEIVE_ANTENNA);
rs->rs_more = rx_status->rx_status_0 & rs->rs_more = !!(rx_status->rx_status_0 &
AR5K_5212_RX_DESC_STATUS0_MORE; AR5K_5212_RX_DESC_STATUS0_MORE);
rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1, rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1,
AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP); AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP);
rs->rs_status = 0; rs->rs_status = 0;
......
...@@ -3252,7 +3252,11 @@ static void iwl4965_mac_update_tkip_key(struct ieee80211_hw *hw, ...@@ -3252,7 +3252,11 @@ static void iwl4965_mac_update_tkip_key(struct ieee80211_hw *hw,
return; return;
} }
iwl_scan_cancel_timeout(priv, 100); if (iwl_scan_cancel(priv)) {
/* cancel scan failed, just live w/ bad key and rely
briefly on SW decryption */
return;
}
key_flags |= (STA_KEY_FLG_TKIP | STA_KEY_FLG_MAP_KEY_MSK); key_flags |= (STA_KEY_FLG_TKIP | STA_KEY_FLG_MAP_KEY_MSK);
key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
......
...@@ -896,6 +896,13 @@ static void iwl_bg_request_scan(struct work_struct *data) ...@@ -896,6 +896,13 @@ static void iwl_bg_request_scan(struct work_struct *data)
return; return;
done: done:
/* Cannot perform scan. Make sure we clear scanning
* bits from status so next scan request can be performed.
* If we don't clear scanning status bit here all next scan
* will fail
*/
clear_bit(STATUS_SCAN_HW, &priv->status);
clear_bit(STATUS_SCANNING, &priv->status);
/* inform mac80211 scan aborted */ /* inform mac80211 scan aborted */
queue_work(priv->workqueue, &priv->scan_completed); queue_work(priv->workqueue, &priv->scan_completed);
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
......
...@@ -5768,7 +5768,6 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv) ...@@ -5768,7 +5768,6 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv)
if (priv->error_recovering) if (priv->error_recovering)
iwl3945_error_recovery(priv); iwl3945_error_recovery(priv);
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
return; return;
restart: restart:
...@@ -6013,6 +6012,7 @@ static void iwl3945_bg_alive_start(struct work_struct *data) ...@@ -6013,6 +6012,7 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
iwl3945_alive_start(priv); iwl3945_alive_start(priv);
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
} }
static void iwl3945_bg_rf_kill(struct work_struct *work) static void iwl3945_bg_rf_kill(struct work_struct *work)
...@@ -6256,6 +6256,11 @@ static void iwl3945_bg_request_scan(struct work_struct *data) ...@@ -6256,6 +6256,11 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
n_probes, n_probes,
(void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]);
if (scan->channel_count == 0) {
IWL_DEBUG_SCAN("channel count %d\n", scan->channel_count);
goto done;
}
cmd.len += le16_to_cpu(scan->tx_cmd.len) + cmd.len += le16_to_cpu(scan->tx_cmd.len) +
scan->channel_count * sizeof(struct iwl3945_scan_channel); scan->channel_count * sizeof(struct iwl3945_scan_channel);
cmd.data = scan; cmd.data = scan;
...@@ -6273,6 +6278,14 @@ static void iwl3945_bg_request_scan(struct work_struct *data) ...@@ -6273,6 +6278,14 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
return; return;
done: done:
/* can not perform scan make sure we clear scanning
* bits from status so next scan request can be performed.
* if we dont clear scanning status bit here all next scan
* will fail
*/
clear_bit(STATUS_SCAN_HW, &priv->status);
clear_bit(STATUS_SCANNING, &priv->status);
/* inform mac80211 scan aborted */ /* inform mac80211 scan aborted */
queue_work(priv->workqueue, &priv->scan_completed); queue_work(priv->workqueue, &priv->scan_completed);
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
......
...@@ -61,6 +61,7 @@ static struct usb_device_id usb_ids[] = { ...@@ -61,6 +61,7 @@ static struct usb_device_id usb_ids[] = {
{ USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 }, { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 },
/* ZD1211B */ /* ZD1211B */
{ USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x0ace, 0xb215), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B },
...@@ -82,6 +83,7 @@ static struct usb_device_id usb_ids[] = { ...@@ -82,6 +83,7 @@ static struct usb_device_id usb_ids[] = {
{ USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B },
{ USB_DEVICE(0x07fa, 0x1196), .driver_info = DEVICE_ZD1211B },
/* "Driverless" devices that need ejecting */ /* "Driverless" devices that need ejecting */
{ USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
{ USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER }, { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },
......
...@@ -114,6 +114,8 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev); ...@@ -114,6 +114,8 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev);
extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
u16 vlan_tci, int polling); u16 vlan_tci, int polling);
extern int vlan_hwaccel_do_receive(struct sk_buff *skb);
#else #else
static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev)
{ {
...@@ -133,6 +135,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, ...@@ -133,6 +135,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
BUG(); BUG();
return NET_XMIT_SUCCESS; return NET_XMIT_SUCCESS;
} }
static inline int vlan_hwaccel_do_receive(struct sk_buff *skb)
{
return 0;
}
#endif #endif
/** /**
......
...@@ -3,11 +3,20 @@ ...@@ -3,11 +3,20 @@
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include "vlan.h" #include "vlan.h"
struct vlan_hwaccel_cb {
struct net_device *dev;
};
static inline struct vlan_hwaccel_cb *vlan_hwaccel_cb(struct sk_buff *skb)
{
return (struct vlan_hwaccel_cb *)skb->cb;
}
/* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */ /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
u16 vlan_tci, int polling) u16 vlan_tci, int polling)
{ {
struct net_device_stats *stats; struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb);
if (skb_bond_should_drop(skb)) { if (skb_bond_should_drop(skb)) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
...@@ -15,23 +24,35 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, ...@@ -15,23 +24,35 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
} }
skb->vlan_tci = vlan_tci; skb->vlan_tci = vlan_tci;
cb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
return (polling ? netif_receive_skb(skb) : netif_rx(skb));
}
EXPORT_SYMBOL(__vlan_hwaccel_rx);
int vlan_hwaccel_do_receive(struct sk_buff *skb)
{
struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb);
struct net_device *dev = cb->dev;
struct net_device_stats *stats;
netif_nit_deliver(skb); netif_nit_deliver(skb);
skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); if (dev == NULL) {
if (skb->dev == NULL) { kfree_skb(skb);
dev_kfree_skb_any(skb); return -1;
/* Not NET_RX_DROP, this is not being dropped
* due to congestion. */
return NET_RX_SUCCESS;
} }
skb->dev->last_rx = jiffies;
skb->dev = dev;
skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci);
skb->vlan_tci = 0; skb->vlan_tci = 0;
stats = &skb->dev->stats; dev->last_rx = jiffies;
stats = &dev->stats;
stats->rx_packets++; stats->rx_packets++;
stats->rx_bytes += skb->len; stats->rx_bytes += skb->len;
skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci);
switch (skb->pkt_type) { switch (skb->pkt_type) {
case PACKET_BROADCAST: case PACKET_BROADCAST:
break; break;
...@@ -43,13 +64,12 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, ...@@ -43,13 +64,12 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
* This allows the VLAN to have a different MAC than the * This allows the VLAN to have a different MAC than the
* underlying device, and still route correctly. */ * underlying device, and still route correctly. */
if (!compare_ether_addr(eth_hdr(skb)->h_dest, if (!compare_ether_addr(eth_hdr(skb)->h_dest,
skb->dev->dev_addr)) dev->dev_addr))
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
break; break;
}; };
return (polling ? netif_receive_skb(skb) : netif_rx(skb)); return 0;
} }
EXPORT_SYMBOL(__vlan_hwaccel_rx);
struct net_device *vlan_dev_real_dev(const struct net_device *dev) struct net_device *vlan_dev_real_dev(const struct net_device *dev)
{ {
......
...@@ -2218,6 +2218,9 @@ int netif_receive_skb(struct sk_buff *skb) ...@@ -2218,6 +2218,9 @@ int netif_receive_skb(struct sk_buff *skb)
int ret = NET_RX_DROP; int ret = NET_RX_DROP;
__be16 type; __be16 type;
if (skb->vlan_tci && vlan_hwaccel_do_receive(skb))
return NET_RX_SUCCESS;
/* if we've gotten here through NAPI, check netpoll */ /* if we've gotten here through NAPI, check netpoll */
if (netpoll_receive_skb(skb)) if (netpoll_receive_skb(skb))
return NET_RX_DROP; return NET_RX_DROP;
......
...@@ -1374,8 +1374,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, ...@@ -1374,8 +1374,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
sk->sk_state == TCP_CLOSE || sk->sk_state == TCP_CLOSE ||
(sk->sk_shutdown & RCV_SHUTDOWN) || (sk->sk_shutdown & RCV_SHUTDOWN) ||
!timeo || !timeo ||
signal_pending(current) || signal_pending(current))
(flags & MSG_PEEK))
break; break;
} else { } else {
if (sock_flag(sk, SOCK_DONE)) if (sock_flag(sk, SOCK_DONE))
......
...@@ -33,6 +33,7 @@ __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl, ...@@ -33,6 +33,7 @@ __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl,
x->sel.dport_mask = htons(0xffff); x->sel.dport_mask = htons(0xffff);
x->sel.sport = xfrm_flowi_sport(fl); x->sel.sport = xfrm_flowi_sport(fl);
x->sel.sport_mask = htons(0xffff); x->sel.sport_mask = htons(0xffff);
x->sel.family = AF_INET;
x->sel.prefixlen_d = 32; x->sel.prefixlen_d = 32;
x->sel.prefixlen_s = 32; x->sel.prefixlen_s = 32;
x->sel.proto = fl->proto; x->sel.proto = fl->proto;
......
...@@ -2483,8 +2483,10 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, ...@@ -2483,8 +2483,10 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
if (!idev && dev->mtu >= IPV6_MIN_MTU) if (!idev && dev->mtu >= IPV6_MIN_MTU)
idev = ipv6_add_dev(dev); idev = ipv6_add_dev(dev);
if (idev) if (idev) {
idev->if_flags |= IF_READY; idev->if_flags |= IF_READY;
run_pending = 1;
}
} else { } else {
if (!addrconf_qdisc_ok(dev)) { if (!addrconf_qdisc_ok(dev)) {
/* device is still not ready. */ /* device is still not ready. */
......
...@@ -34,6 +34,7 @@ __xfrm6_init_tempsel(struct xfrm_state *x, struct flowi *fl, ...@@ -34,6 +34,7 @@ __xfrm6_init_tempsel(struct xfrm_state *x, struct flowi *fl,
x->sel.dport_mask = htons(0xffff); x->sel.dport_mask = htons(0xffff);
x->sel.sport = xfrm_flowi_sport(fl); x->sel.sport = xfrm_flowi_sport(fl);
x->sel.sport_mask = htons(0xffff); x->sel.sport_mask = htons(0xffff);
x->sel.family = AF_INET6;
x->sel.prefixlen_d = 128; x->sel.prefixlen_d = 128;
x->sel.prefixlen_s = 128; x->sel.prefixlen_s = 128;
x->sel.proto = fl->proto; x->sel.proto = fl->proto;
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/rculist.h> #include <linux/rculist.h>
#include <linux/rtnetlink.h>
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_l3proto.h> #include <net/netfilter/nf_conntrack_l3proto.h>
...@@ -167,10 +168,12 @@ void nf_conntrack_helper_unregister(struct nf_conntrack_helper *me) ...@@ -167,10 +168,12 @@ void nf_conntrack_helper_unregister(struct nf_conntrack_helper *me)
*/ */
synchronize_rcu(); synchronize_rcu();
rtnl_lock();
spin_lock_bh(&nf_conntrack_lock); spin_lock_bh(&nf_conntrack_lock);
for_each_net(net) for_each_net(net)
__nf_conntrack_helper_unregister(me, net); __nf_conntrack_helper_unregister(me, net);
spin_unlock_bh(&nf_conntrack_lock); spin_unlock_bh(&nf_conntrack_lock);
rtnl_unlock();
} }
EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/rtnetlink.h>
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_l3proto.h> #include <net/netfilter/nf_conntrack_l3proto.h>
...@@ -221,8 +222,10 @@ void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto) ...@@ -221,8 +222,10 @@ void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
synchronize_rcu(); synchronize_rcu();
/* Remove all contrack entries for this protocol */ /* Remove all contrack entries for this protocol */
rtnl_lock();
for_each_net(net) for_each_net(net)
nf_ct_iterate_cleanup(net, kill_l3proto, proto); nf_ct_iterate_cleanup(net, kill_l3proto, proto);
rtnl_unlock();
} }
EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister); EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister);
...@@ -333,8 +336,10 @@ void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto) ...@@ -333,8 +336,10 @@ void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto)
synchronize_rcu(); synchronize_rcu();
/* Remove all contrack entries for this protocol */ /* Remove all contrack entries for this protocol */
rtnl_lock();
for_each_net(net) for_each_net(net)
nf_ct_iterate_cleanup(net, kill_l4proto, l4proto); nf_ct_iterate_cleanup(net, kill_l4proto, l4proto);
rtnl_unlock();
} }
EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister); EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister);
......
...@@ -603,7 +603,7 @@ static int rfkill_check_duplicity(const struct rfkill *rfkill) ...@@ -603,7 +603,7 @@ static int rfkill_check_duplicity(const struct rfkill *rfkill)
} }
/* 0: first switch of its kind */ /* 0: first switch of its kind */
return test_bit(rfkill->type, seen); return (test_bit(rfkill->type, seen)) ? 1 : 0;
} }
static int rfkill_add_switch(struct rfkill *rfkill) static int rfkill_add_switch(struct rfkill *rfkill)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment