* Re: kernel BUG at net/ipv4/tcp_output.c:1006!
From: David Miller @ 2011-05-13 20:01 UTC (permalink / raw)
To: eric.dumazet; +Cc: lkml, linux-kernel, netdev
In-Reply-To: <1305316058.3120.6.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Fri, 13 May 2011 21:47:38 +0200
> I suspect we should push commit 2fceec13375e5d98 (tcp: len check is
> unnecessarily devastating, change to WARN_ON) to stable if not already
> done...
>
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=2fceec13375e5d98
>
> David, is this commit in your stable queue ?
No, but now it is.
^ permalink raw reply
* Re: [PATCH] bridge: fix forwarding of IPv6
From: David Miller @ 2011-05-13 20:02 UTC (permalink / raw)
To: eric.dumazet; +Cc: shemminger, noahm, herbert, ben, bridge, netdev
In-Reply-To: <1305316844.3120.8.camel@edumazet-laptop>
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Fri, 13 May 2011 22:00:44 +0200
> Le vendredi 13 mai 2011 à 12:53 -0700, Stephen Hemminger a écrit :
>> The commit 6b1e960fdbd75dcd9bcc3ba5ff8898ff1ad30b6e
>> bridge: Reset IPCB when entering IP stack on NF_FORWARD
>> broke forwarding of IPV6 packets in bridge because it would
>> call bp_parse_ip_options with an IPV6 packet.
>>
>> Reported-by: Noah Meyerhans <noahm@debian.org>
>> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>>
>> ---
>> Patch against net-next-2.6 but must be applied to net-2.6
>> and stable as well
>>
>
> Well, stable is not needed, since faulty commit is not in 2.6.38
>
> Reviewed-by: Eric Dumazet <eric.dumazet@gmail.com>
I do need to queue it up for -stable because the faulty commit is
also queued up there :-)
^ permalink raw reply
* Re: [PATCH] bridge: fix forwarding of IPv6
From: David Miller @ 2011-05-13 20:03 UTC (permalink / raw)
To: shemminger; +Cc: noahm, herbert, ben, bridge, netdev
In-Reply-To: <20110513125314.66861b31@nehalam>
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Fri, 13 May 2011 12:53:14 -0700
> The commit 6b1e960fdbd75dcd9bcc3ba5ff8898ff1ad30b6e
> bridge: Reset IPCB when entering IP stack on NF_FORWARD
> broke forwarding of IPV6 packets in bridge because it would
> call bp_parse_ip_options with an IPV6 packet.
>
> Reported-by: Noah Meyerhans <noahm@debian.org>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
> ---
> Patch against net-next-2.6 but must be applied to net-2.6
> and stable as well
Applied and queued up for -stable, thanks!
^ permalink raw reply
* Re: [PATCH] bridge: fix forwarding of IPv6
From: Eric Dumazet @ 2011-05-13 20:05 UTC (permalink / raw)
To: David Miller; +Cc: shemminger, noahm, herbert, ben, bridge, netdev
In-Reply-To: <20110513.160232.1127228366429050055.davem@davemloft.net>
Le vendredi 13 mai 2011 à 16:02 -0400, David Miller a écrit :
> I do need to queue it up for -stable because the faulty commit is
> also queued up there :-)
okay ;)
^ permalink raw reply
* Re: [PATCH v3] net: ipv4: add IPPROTO_ICMP socket kind
From: David Miller @ 2011-05-13 20:08 UTC (permalink / raw)
To: segoon
Cc: solar, linux-kernel, netdev, peak, kees.cook, dan.j.rosenberg,
eugene, nelhage, kuznet, pekkas, jmorris, yoshfuji, kaber
In-Reply-To: <20110513200100.GA3875@albatros>
From: Vasiliy Kulikov <segoon@openwall.com>
Date: Sat, 14 May 2011 00:01:00 +0400
> This patch adds IPPROTO_ICMP socket kind.
Applied, thanks for following through on all the review feedback.
^ permalink raw reply
* Re: [PATCH] drivers/isdn/hisax: Drop unused list
From: David Miller @ 2011-05-13 20:10 UTC (permalink / raw)
To: julia; +Cc: isdn, kernel-janitors, netdev, linux-kernel
In-Reply-To: <1305296139-16773-1-git-send-email-julia@diku.dk>
From: Julia Lawall <julia@diku.dk>
Date: Fri, 13 May 2011 16:15:39 +0200
> The file st5481_init.c locally defines and initializes the adapter_list
> variable, but does not use it for anything. Removing the list makes it
> possible to remove the list field from the st5481_adapter data structure.
> In the function probe_st5481, it also makes it possible to free the locally
> allocated adapter value on an error exit.
>
> Signed-off-by: Julia Lawall <julia@diku.dk>
Applied, thanks a lot Julia.
^ permalink raw reply
* Re: [net-next 1/2 (V2)] stmmac: don't go through ethtool to start auto-negotiation
From: David Miller @ 2011-05-13 20:12 UTC (permalink / raw)
To: peppe.cavallaro; +Cc: netdev, decot
In-Reply-To: <1305268085-603-1-git-send-email-peppe.cavallaro@st.com>
From: Giuseppe CAVALLARO <peppe.cavallaro@st.com>
Date: Fri, 13 May 2011 08:28:04 +0200
> From: David Decotigny <decot@google.com>
>
> The driver used to call phy's ethtool configuration routine to start
> auto-negotiation. This change has it call directly phy's routine to
> start auto-negotiation.
>
> The initial version was hiding phy_start_aneg() return value,
> this patch returns it (<0 upon error).
>
> Tested: module compiles, tested on STM HDK7108 STB.
>
> Signed-off-by: David Decotigny <decot@google.com>
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Applied.
^ permalink raw reply
* Re: [net-next 2/2] stmmac: fix autoneg in set_pauseparam
From: David Miller @ 2011-05-13 20:12 UTC (permalink / raw)
To: peppe.cavallaro; +Cc: netdev
In-Reply-To: <1305268085-603-2-git-send-email-peppe.cavallaro@st.com>
From: Giuseppe CAVALLARO <peppe.cavallaro@st.com>
Date: Fri, 13 May 2011 08:28:05 +0200
> This patch fixes a bug in the set_pauseparam
> function that didn't well manage the ANE
> field and returned broken values when use
> ethtool -A|-a.
>
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Applied.
^ permalink raw reply
* Re: [Bridge] [PATCH] bridge: fix forwarding of IPv6
From: Stephen Hemminger @ 2011-05-13 20:24 UTC (permalink / raw)
To: David Miller; +Cc: eric.dumazet, netdev, noahm, bridge, herbert, ben
In-Reply-To: <20110513.160232.1127228366429050055.davem@davemloft.net>
On Fri, 13 May 2011 16:02:32 -0400 (EDT)
David Miller <davem@davemloft.net> wrote:
> From: Eric Dumazet <eric.dumazet@gmail.com>
> Date: Fri, 13 May 2011 22:00:44 +0200
>
> > Le vendredi 13 mai 2011 à 12:53 -0700, Stephen Hemminger a écrit :
> >> The commit 6b1e960fdbd75dcd9bcc3ba5ff8898ff1ad30b6e
> >> bridge: Reset IPCB when entering IP stack on NF_FORWARD
> >> broke forwarding of IPV6 packets in bridge because it would
> >> call bp_parse_ip_options with an IPV6 packet.
> >>
> >> Reported-by: Noah Meyerhans <noahm@debian.org>
> >> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
> >>
> >> ---
> >> Patch against net-next-2.6 but must be applied to net-2.6
> >> and stable as well
> >>
> >
> > Well, stable is not needed, since faulty commit is not in 2.6.38
> >
> > Reviewed-by: Eric Dumazet <eric.dumazet@gmail.com>
>
> I do need to queue it up for -stable because the faulty commit is
> also queued up there :-)
The faulty commit was in 2.6.38.4
^ permalink raw reply
* [GIT] Networking
From: David Miller @ 2011-05-13 20:40 UTC (permalink / raw)
To: torvalds; +Cc: akpm, netdev, linux-kernel
Some stragglers, the bridging one is pretty important as it hits
virtualization users:
1) Do not run ipv4 options parser on ipv6 packets in bridging,
from Stephen Hemminger.
2) Regression fix, changes to TOS/tclass handling made ECN stop
being done on ipv6 connections. Fix from Steinar H. Gunderson.
3) On-wire packets for bridging modes were defined in a way (lacking
necessary __packed directives), such that they didn't work properly
on some architectures (namely, ARM). Fix from Vitalii Demianets.
4) Long ago net_device_ops conversion broke several m68k drivers
based upon the 8390 infrastructure. Fix from Geert Uytterhoeven.
5) SFC needs to map certain chip memory as uncacheable, from Ben
Hutchings.
6) Memory hotplug oops fix in ehea driver from Anton Blanchard.
7) IBSS oops fix in intel wireless drivers, from Stanislaw Gruszka.
8) Command pending queue locking fix in libertas.
Please pull, thanks a lot!
The following changes since commit 3568bd9720b4a775f28a718fcbb462ce2f386988:
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client (2011-05-11 19:13:34 -0700)
are available in the git repository at:
master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6.git master
Anton Blanchard (1):
ehea: Fix memory hotplug oops
Ben Hutchings (1):
sfc: Always map MCDI shared memory as uncacheable
David S. Miller (2):
Merge branch 'master' of git://git.kernel.org/.../linville/wireless-2.6
Merge branch 'sfc-2.6.39' of git://git.kernel.org/.../bwh/sfc-2.6
Geert Uytterhoeven (3):
zorro8390: Fix regression caused during net_device_ops conversion
hydra: Fix regression caused during net_device_ops conversion
ne-h8300: Fix regression caused during net_device_ops conversion
Luciano Coelho (1):
mac80211: don't start the dynamic ps timer if not associated
Mohammed Shafi Shajakhan (1):
ath9k: Fix a warning due to a queued work during S3 state
Paul Fox (1):
libertas: fix cmdpendingq locking
Stanislaw Gruszka (1):
iwlegacy: fix IBSS mode crashes
Steinar H. Gunderson (1):
ipv6: restore correct ECN handling on TCP xmit
Stephen Hemminger (1):
bridge: fix forwarding of IPv6
Vitalii Demianets (1):
bonding,llc: Fix structure sizeof incompatibility for some PDUs
drivers/net/Makefile | 6 ++--
drivers/net/bonding/bond_3ad.h | 10 +++---
drivers/net/ehea/ehea_main.c | 6 ++--
drivers/net/hydra.c | 14 ++++----
drivers/net/ne-h8300.c | 16 +++++-----
drivers/net/sfc/mcdi.c | 49 ++++++++++++++++++-----------
drivers/net/sfc/nic.h | 2 +
drivers/net/sfc/siena.c | 25 +++++++++++++--
drivers/net/wireless/ath/ath9k/main.c | 8 +++++
drivers/net/wireless/iwlegacy/iwl-core.c | 7 ++++
drivers/net/wireless/iwlegacy/iwl-dev.h | 6 ++++
drivers/net/wireless/libertas/cmd.c | 6 ++-
drivers/net/zorro8390.c | 12 ++++----
include/net/inet_ecn.h | 16 ++++++++--
include/net/llc_pdu.h | 8 ++--
net/bridge/br_netfilter.c | 2 +-
net/mac80211/tx.c | 4 ++
17 files changed, 132 insertions(+), 65 deletions(-)
^ permalink raw reply
* [PATCH] olympic: convert to seq_file
From: Alexey Dobriyan @ 2011-05-13 20:42 UTC (permalink / raw)
To: davem; +Cc: netdev
->read_proc interface is going away, switch to seq_file.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---
drivers/net/tokenring/olympic.c | 57 +++++++++++++++++++---------------------
1 file changed, 28 insertions(+), 29 deletions(-)
--- a/drivers/net/tokenring/olympic.c
+++ b/drivers/net/tokenring/olympic.c
@@ -86,6 +86,7 @@
#include <linux/timer.h>
#include <linux/in.h>
#include <linux/ioport.h>
+#include <linux/seq_file.h>
#include <linux/string.h>
#include <linux/proc_fs.h>
#include <linux/ptrace.h>
@@ -193,7 +194,7 @@ static void olympic_arb_cmd(struct net_device *dev);
static int olympic_change_mtu(struct net_device *dev, int mtu);
static void olympic_srb_bh(struct net_device *dev) ;
static void olympic_asb_bh(struct net_device *dev) ;
-static int olympic_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data) ;
+static const struct file_operations olympic_proc_ops;
static const struct net_device_ops olympic_netdev_ops = {
.ndo_open = olympic_open,
@@ -272,7 +273,7 @@ static int __devinit olympic_probe(struct pci_dev *pdev, const struct pci_device
char proc_name[20] ;
strcpy(proc_name,"olympic_") ;
strcat(proc_name,dev->name) ;
- create_proc_read_entry(proc_name,0,init_net.proc_net,olympic_proc_info,(void *)dev) ;
+ proc_create_data(proc_name, 0, init_net.proc_net, &olympic_proc_ops, dev);
printk("Olympic: Network Monitor information: /proc/%s\n",proc_name);
}
return 0 ;
@@ -1615,29 +1616,25 @@ static int olympic_change_mtu(struct net_device *dev, int mtu)
return 0 ;
}
-static int olympic_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
+static int olympic_proc_show(struct seq_file *m, void *v)
{
- struct net_device *dev = (struct net_device *)data ;
+ struct net_device *dev = m->private;
struct olympic_private *olympic_priv=netdev_priv(dev);
u8 __iomem *oat = (olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ;
u8 __iomem *opt = (olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ;
- int size = 0 ;
- int len=0;
- off_t begin=0;
- off_t pos=0;
u8 addr[6];
u8 addr2[6];
int i;
- size = sprintf(buffer,
+ seq_printf(m,
"IBM Pit/Pit-Phy/Olympic Chipset Token Ring Adapter %s\n",dev->name);
- size += sprintf(buffer+size, "\n%6s: Adapter Address : Node Address : Functional Addr\n",
+ seq_printf(m, "\n%6s: Adapter Address : Node Address : Functional Addr\n",
dev->name);
for (i = 0 ; i < 6 ; i++)
addr[i] = readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr) + i);
- size += sprintf(buffer+size, "%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
+ seq_printf(m, "%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
dev->name,
dev->dev_addr, addr,
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)),
@@ -1645,9 +1642,9 @@ static int olympic_proc_info(char *buffer, char **start, off_t offset, int lengt
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
- size += sprintf(buffer+size, "\n%6s: Token Ring Parameters Table:\n", dev->name);
+ seq_printf(m, "\n%6s: Token Ring Parameters Table:\n", dev->name);
- size += sprintf(buffer+size, "%6s: Physical Addr : Up Node Address : Poll Address : AccPri : Auth Src : Att Code :\n",
+ seq_printf(m, "%6s: Physical Addr : Up Node Address : Poll Address : AccPri : Auth Src : Att Code :\n",
dev->name) ;
for (i = 0 ; i < 6 ; i++)
@@ -1655,7 +1652,7 @@ static int olympic_proc_info(char *buffer, char **start, off_t offset, int lengt
for (i = 0 ; i < 6 ; i++)
addr2[i] = readb(opt+offsetof(struct olympic_parameters_table, poll_addr) + i);
- size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x : %pM : %pM : %04x : %04x : %04x :\n",
+ seq_printf(m, "%6s: %02x:%02x:%02x:%02x : %pM : %pM : %04x : %04x : %04x :\n",
dev->name,
readb(opt+offsetof(struct olympic_parameters_table, phys_addr)),
readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+1),
@@ -1666,12 +1663,12 @@ static int olympic_proc_info(char *buffer, char **start, off_t offset, int lengt
swab16(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))),
swab16(readw(opt+offsetof(struct olympic_parameters_table, att_code))));
- size += sprintf(buffer+size, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
+ seq_printf(m, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
dev->name) ;
for (i = 0 ; i < 6 ; i++)
addr[i] = readb(opt+offsetof(struct olympic_parameters_table, source_addr) + i);
- size += sprintf(buffer+size, "%6s: %pM : %04x : %04x : %04x : %04x : %04x : %04x : \n",
+ seq_printf(m, "%6s: %pM : %04x : %04x : %04x : %04x : %04x : %04x : \n",
dev->name, addr,
swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))),
swab16(readw(opt+offsetof(struct olympic_parameters_table, major_vector))),
@@ -1680,12 +1677,12 @@ static int olympic_proc_info(char *buffer, char **start, off_t offset, int lengt
swab16(readw(opt+offsetof(struct olympic_parameters_table, mon_error))),
swab16(readw(opt+offsetof(struct olympic_parameters_table, frame_correl))));
- size += sprintf(buffer+size, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n",
+ seq_printf(m, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n",
dev->name) ;
for (i = 0 ; i < 6 ; i++)
addr[i] = readb(opt+offsetof(struct olympic_parameters_table, beacon_naun) + i);
- size += sprintf(buffer+size, "%6s: : %02x : %02x : %pM : %02x:%02x:%02x:%02x : \n",
+ seq_printf(m, "%6s: : %02x : %02x : %pM : %02x:%02x:%02x:%02x : \n",
dev->name,
swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
@@ -1695,19 +1692,21 @@ static int olympic_proc_info(char *buffer, char **start, off_t offset, int lengt
readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+2),
readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+3));
- len=size;
- pos=begin+size;
- if (pos<offset) {
- len=0;
- begin=pos;
- }
- *start=buffer+(offset-begin); /* Start of wanted data */
- len-=(offset-begin); /* Start slop */
- if(len>length)
- len=length; /* Ending slop */
- return len;
+ return 0;
}
+static int olympic_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, olympic_proc_show, PDE(inode)->data);
+}
+
+static const struct file_operations olympic_proc_ops = {
+ .open = olympic_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
static void __devexit olympic_remove_one(struct pci_dev *pdev)
{
struct net_device *dev = pci_get_drvdata(pdev) ;
^ permalink raw reply
* Re: [PATCH] net: netlink: don't try unicast when dst_pid is zero for NETLINK_USERSOCK
From: David Miller @ 2011-05-13 20:48 UTC (permalink / raw)
To: xiaosuo; +Cc: netdev
In-Reply-To: <1305267894-3314-1-git-send-email-xiaosuo@gmail.com>
From: Changli Gao <xiaosuo@gmail.com>
Date: Fri, 13 May 2011 14:24:54 +0800
> For NETLINK_USERSOCK, no one listens on PID 0, so sending a message only to
> to a multicast group should not return -ECONNREFUSED.
>
> Signed-off-by: Changli Gao <xiaosuo@gmail.com>
I don't think this is a great idea, creating different semantics for
NETLINK_USERSOCK vs. other types.
You have to set the pid to something which will receive the unicast
message, and then you can also (on top of that) send it to a multicast
group as well.
But the base operation is always the unicast send, and that is what
determines success/failure of the operation.
I'm not applying this patch.
^ permalink raw reply
* Re: [PATCH net-next] net:set valid name before calling ndo_init()
From: David Miller @ 2011-05-13 20:50 UTC (permalink / raw)
To: jpirko
Cc: panweiping3, eric.dumazet, mirq-linux, therbert, bhutchings,
netdev, linux-kernel
In-Reply-To: <20110513071508.GC2733@psychotron>
From: Jiri Pirko <jpirko@redhat.com>
Date: Fri, 13 May 2011 09:15:09 +0200
> Fri, May 13, 2011 at 03:46:56AM CEST, panweiping3@gmail.com wrote:
>>In commit 1c5cae815d19 (net: call dev_alloc_name from register_netdevice),
>>a bug of bonding was invloved, see example 1 and 2.
...
>
> Reviewed-by: Jiri Pirko <jpirko@redhat.com>
Applied, thanks everyone.
^ permalink raw reply
* Re: [PATCH] olympic: convert to seq_file
From: David Miller @ 2011-05-13 20:51 UTC (permalink / raw)
To: adobriyan; +Cc: netdev
In-Reply-To: <20110513204203.GB29261@p183>
From: Alexey Dobriyan <adobriyan@gmail.com>
Date: Fri, 13 May 2011 23:42:03 +0300
> ->read_proc interface is going away, switch to seq_file.
>
> Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Applied to net-next-2.6, thanks Alexey.
^ permalink raw reply
* Re: [PATCH] bridge: fix forwarding of IPv6
From: Noah Meyerhans @ 2011-05-13 21:00 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: Herbert Xu, David Miller, Ben Hutchings, bridge, netdev
In-Reply-To: <20110513125314.66861b31@nehalam>
[-- Attachment #1: Type: text/plain, Size: 1063 bytes --]
On Fri, May 13, 2011 at 12:53:14PM -0700, Stephen Hemminger wrote:
> The commit 6b1e960fdbd75dcd9bcc3ba5ff8898ff1ad30b6e
> bridge: Reset IPCB when entering IP stack on NF_FORWARD
> broke forwarding of IPV6 packets in bridge because it would
> call bp_parse_ip_options with an IPV6 packet.
>
> Reported-by: Noah Meyerhans <noahm@debian.org>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
> ---
> Patch against net-next-2.6 but must be applied to net-2.6
> and stable as well
>
> --- a/net/bridge/br_netfilter.c 2011-05-13 12:37:30.289646958 -0700
> +++ b/net/bridge/br_netfilter.c 2011-05-13 12:38:07.820333938 -0700
> @@ -737,7 +737,7 @@ static unsigned int br_nf_forward_ip(uns
> nf_bridge->mask |= BRNF_PKT_TYPE;
> }
>
> - if (br_parse_ip_options(skb))
> + if (pf == PF_INET && br_parse_ip_options(skb))
> return NF_DROP;
>
> /* The physdev module checks on this */
>
I can confirm that this patch fixes the behavior I've been seeing in the
stable-2.6.38.y tree. Thank you, Stephen!
noah
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* Re: [PATCH 6/9] Bluetooth: Silence DEBUG_STRICT_USER_COPY_CHECKS=y warning
From: Gustavo F. Padovan @ 2011-05-13 21:06 UTC (permalink / raw)
To: Stephen Boyd
Cc: linux-bluetooth-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA, Marcel Holtmann
In-Reply-To: <1305244212-19183-7-git-send-email-sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Hi Stephen,
* Stephen Boyd <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> [2011-05-12 16:50:09 -0700]:
> Enabling DEBUG_STRICT_USER_COPY_CHECKS causes the following
> warning:
>
> In function 'copy_from_user',
> inlined from 'rfcomm_sock_setsockopt' at
> net/bluetooth/rfcomm/sock.c:705:
> arch/x86/include/asm/uaccess_64.h:65:
> warning: call to 'copy_from_user_overflow' declared with
> attribute warning: copy_from_user() buffer size is not provably
> correct
>
> presumably due to buf_size being signed causing GCC to fail to
> see that buf_size can't become negative.
>
> Cc: Marcel Holtmann <marcel-kz+m5ild9QBg9hUCZPvPmw@public.gmane.org>
> Cc: Gustavo F. Padovan <padovan-Y3ZbgMPKUGA34EUeqzHoZw@public.gmane.org>
> Signed-off-by: Stephen Boyd <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
> ---
> net/bluetooth/rfcomm/sock.c | 3 ++-
> 1 files changed, 2 insertions(+), 1 deletions(-)
Applied, thanks.
--
Gustavo F. Padovan
http://profusion.mobi
^ permalink raw reply
* [PATCH] slub: Make CONFIG_PAGE_ALLOC work with new fastpath
From: Christoph Lameter @ 2011-05-13 21:15 UTC (permalink / raw)
To: Eric Dumazet
Cc: Vegard Nossum, Pekka Enberg, casteyde.christian, Andrew Morton,
netdev, bugzilla-daemon, bugme-daemon
In-Reply-To: <1305083543.2437.39.camel@edumazet-laptop>
I ran this with hackbench under KVM with CONFIG_DEBUG_PAGEALLOC and I saw
no failures.
Subject: slub: Make CONFIG_PAGE_ALLOC work with new fastpath
Fastpath can do a speculative access to a page that CONFIG_PAGE_ALLOC may have
marked as invalid to retrieve the pointer to the next free object.
Use probe_kernel_read in that case in order not to cause a page fault.
Signed-off-by: Christoph Lameter <cl@linux.com>
---
mm/slub.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
Index: linux-2.6/mm/slub.c
===================================================================
--- linux-2.6.orig/mm/slub.c 2011-05-10 14:31:28.000000000 -0500
+++ linux-2.6/mm/slub.c 2011-05-10 14:31:35.000000000 -0500
@@ -261,6 +261,18 @@ static inline void *get_freepointer(stru
return *(void **)(object + s->offset);
}
+static inline void *get_freepointer_safe(struct kmem_cache *s, void *object)
+{
+ void *p;
+
+#ifdef CONFIG_DEBUG_PAGEALLOC
+ probe_kernel_read(&p, (void **)(object + s->offset), sizeof(p));
+#else
+ p = get_freepointer(s, object);
+#endif
+ return p;
+}
+
static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp)
{
*(void **)(object + s->offset) = fp;
@@ -1933,7 +1945,7 @@ redo:
if (unlikely(!irqsafe_cpu_cmpxchg_double(
s->cpu_slab->freelist, s->cpu_slab->tid,
object, tid,
- get_freepointer(s, object), next_tid(tid)))) {
+ get_freepointer_safe(s, object), next_tid(tid)))) {
note_cmpxchg_failure("slab_alloc", s, tid);
goto redo;
^ permalink raw reply
* [PATCH] ipv4: Kill spurious write to iph->daddr in ip_forward_options().
From: David Miller @ 2011-05-13 21:16 UTC (permalink / raw)
To: netdev
This code block executes when opt->srr_is_hit is set. It will be
set only by ip_options_rcv_srr().
ip_options_rcv_srr() walks until it hits a matching nexthop in the SRR
option addresses, and when it matches one 1) looks up the route for
that nexthop and 2) on route lookup success it writes that nexthop
value into iph->daddr.
ip_forward_options() runs later, and again walks the SRR option
addresses looking for the option matching the destination of the route
stored in skb_rtable(). This route will be the same exact one looked
up for the nexthop by ip_options_rcv_srr().
Therefore "rt->rt_dst == iph->daddr" must be true.
All it really needs to do is record the route's source address in the
matching SRR option adddress. It need not write iph->daddr again,
since that has already been done by ip_options_rcv_srr() as detailed
above.
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/ipv4/ip_options.c | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c
index c5c2619..c6474cd 100644
--- a/net/ipv4/ip_options.c
+++ b/net/ipv4/ip_options.c
@@ -573,7 +573,6 @@ void ip_forward_options(struct sk_buff *skb)
if (srrptr + 3 <= srrspace) {
opt->is_changed = 1;
ip_rt_get_source(&optptr[srrptr-1], rt);
- ip_hdr(skb)->daddr = rt->rt_dst;
optptr[2] = srrptr+4;
} else if (net_ratelimit())
printk(KERN_CRIT "ip_forward(): Argh! Destination lost!\n");
--
1.7.4.4
^ permalink raw reply related
* [RFC/PATCH 00/13] wl12xx re-factor
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless, netdev, linux-kernel, Felipe Balbi
Hi Luca,
this is the re-factor I was talking to you
about. Please have a look and give your
comments.
It probably won't work as is, I compile
tested only, but it shows the idea.
Felipe Balbi (13):
net: wl12xx: sdio: id_tables should be __devinitconst
net: wl12xx: sdio: add a context structure
net: wl12xx: remove some unnecessary prints
net: wl12xx: care for optional operations
net: wl12xx: remove the nops
net: wl12xx: remove unnecessary prints
net: wl12xx: spi: add a context structure
net: wl12xx: spi: add a platform_device
net: wl12xx: sdio: add a platform_device
net: wl12xx: main: add platform device
net: wireless: wl12xx: re-factor all drivers
net: wireless: wl12xx: mark some symbols static
net: wl12xx: main: drop unneded plat_dev
drivers/net/wireless/wl12xx/io.c | 10 +-
drivers/net/wireless/wl12xx/io.h | 21 +--
drivers/net/wireless/wl12xx/main.c | 191 +++++++++++-----
drivers/net/wireless/wl12xx/sdio.c | 220 +++++++-----------
drivers/net/wireless/wl12xx/spi.c | 246 ++++++++------------
drivers/net/wireless/wl12xx/wl12xx.h | 16 +-
drivers/net/wireless/wl12xx/wl12xx_platform_data.c | 4 +-
include/linux/wl12xx.h | 4 +-
8 files changed, 336 insertions(+), 376 deletions(-)
--
1.7.4.1.343.ga91df
^ permalink raw reply
* [RFC/PATCH 01/13] net: wl12xx: sdio: id_tables should be __devinitconst
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless, netdev, linux-kernel, Felipe Balbi
In-Reply-To: <1305321990-22041-1-git-send-email-balbi@ti.com>
That's only needed during init anyway, let's free
some space after we're done probing.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/net/wireless/wl12xx/sdio.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index b1c7d03..1268efe 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -45,7 +45,7 @@
#define SDIO_DEVICE_ID_TI_WL1271 0x4076
#endif
-static const struct sdio_device_id wl1271_devices[] = {
+static const struct sdio_device_id wl1271_devices[] __devinitconst = {
{ SDIO_DEVICE(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271) },
{}
};
--
1.7.4.1.343.ga91df
^ permalink raw reply related
* [RFC/PATCH 02/13] net: wl12xx: sdio: add a context structure
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless, netdev, linux-kernel, Felipe Balbi
In-Reply-To: <1305321990-22041-1-git-send-email-balbi@ti.com>
this will help re-structuring the driver so
that we avoid all duplications which are
currently on this driver.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/net/wireless/wl12xx/sdio.c | 78 +++++++++++++++++++++++++-----------
1 files changed, 54 insertions(+), 24 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index 1268efe..fe775d3 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -45,20 +45,25 @@
#define SDIO_DEVICE_ID_TI_WL1271 0x4076
#endif
+struct wl12xx_sdio_glue {
+ struct device *dev;
+ struct wl1271 *wl;
+};
+
static const struct sdio_device_id wl1271_devices[] __devinitconst = {
{ SDIO_DEVICE(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271) },
{}
};
MODULE_DEVICE_TABLE(sdio, wl1271_devices);
-static inline struct sdio_func *wl_to_func(struct wl1271 *wl)
+static inline struct wl12xx_sdio_glue *wl_to_glue(struct wl1271 *wl)
{
return wl->if_priv;
}
static struct device *wl1271_sdio_wl_to_dev(struct wl1271 *wl)
{
- return &(wl_to_func(wl)->dev);
+ return wl_to_glue(wl)->dev;
}
static irqreturn_t wl1271_hardirq(int irq, void *cookie)
@@ -101,8 +106,9 @@ static void wl1271_sdio_init(struct wl1271 *wl)
static void wl1271_sdio_raw_read(struct wl1271 *wl, int addr, void *buf,
size_t len, bool fixed)
{
- int ret;
- struct sdio_func *func = wl_to_func(wl);
+ struct wl12xx_sdio_glue *glue = wl_to_glue(wl);
+ struct sdio_func *func = dev_to_sdio_func(glue->dev);
+ int ret;
if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
((u8 *)buf)[0] = sdio_f0_readb(func, addr, &ret);
@@ -126,8 +132,9 @@ static void wl1271_sdio_raw_read(struct wl1271 *wl, int addr, void *buf,
static void wl1271_sdio_raw_write(struct wl1271 *wl, int addr, void *buf,
size_t len, bool fixed)
{
- int ret;
- struct sdio_func *func = wl_to_func(wl);
+ struct wl12xx_sdio_glue *glue = wl_to_glue(wl);
+ struct sdio_func *func = dev_to_sdio_func(glue->dev);
+ int ret;
if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
sdio_f0_writeb(func, ((u8 *)buf)[0], addr, &ret);
@@ -150,8 +157,9 @@ static void wl1271_sdio_raw_write(struct wl1271 *wl, int addr, void *buf,
static int wl1271_sdio_power_on(struct wl1271 *wl)
{
- struct sdio_func *func = wl_to_func(wl);
- int ret;
+ struct wl12xx_sdio_glue *glue = wl_to_glue(wl);
+ struct sdio_func *func = dev_to_sdio_func(glue->dev);
+ int ret;
/* Make sure the card will not be powered off by runtime PM */
ret = pm_runtime_get_sync(&func->dev);
@@ -172,8 +180,9 @@ out:
static int wl1271_sdio_power_off(struct wl1271 *wl)
{
- struct sdio_func *func = wl_to_func(wl);
- int ret;
+ struct wl12xx_sdio_glue *glue = wl_to_glue(wl);
+ struct sdio_func *func = dev_to_sdio_func(glue->dev);
+ int ret;
sdio_disable_func(func);
sdio_release_host(func);
@@ -209,24 +218,39 @@ static struct wl1271_if_operations sdio_ops = {
static int __devinit wl1271_probe(struct sdio_func *func,
const struct sdio_device_id *id)
{
- struct ieee80211_hw *hw;
const struct wl12xx_platform_data *wlan_data;
- struct wl1271 *wl;
- int ret;
+
+ struct wl12xx_sdio_glue *glue;
+ struct ieee80211_hw *hw;
+ struct wl1271 *wl;
+
+ int ret = -ENOMEM;
/* We are only able to handle the wlan function */
if (func->num != 0x02)
return -ENODEV;
+ glue = kzalloc(sizeof(*glue), GFP_KERNEL);
+ if (!glue) {
+ dev_err(&func->dev, "not enough memory\n");
+ goto err0;
+ }
+
hw = wl1271_alloc_hw();
- if (IS_ERR(hw))
- return PTR_ERR(hw);
+ if (IS_ERR(hw)) {
+ dev_err(&func->dev, "can't allocate hw\n");
+ ret = PTR_ERR(hw);
+ goto err1;
+ }
wl = hw->priv;
- wl->if_priv = func;
+ wl->if_priv = glue;
wl->if_ops = &sdio_ops;
+ glue->dev = &func->dev;
+ glue->wl = wl;
+
/* Grab access to FN0 for ELP reg. */
func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
@@ -234,7 +258,7 @@ static int __devinit wl1271_probe(struct sdio_func *func,
if (IS_ERR(wlan_data)) {
ret = PTR_ERR(wlan_data);
wl1271_error("missing wlan platform data: %d", ret);
- goto out_free;
+ goto err2;
}
wl->irq = wlan_data->irq;
@@ -245,20 +269,20 @@ static int __devinit wl1271_probe(struct sdio_func *func,
DRIVER_NAME, wl);
if (ret < 0) {
wl1271_error("request_irq() failed: %d", ret);
- goto out_free;
+ goto err2;
}
disable_irq(wl->irq);
ret = wl1271_init_ieee80211(wl);
if (ret)
- goto out_irq;
+ goto err3;
ret = wl1271_register_hw(wl);
if (ret)
- goto out_irq;
+ goto err3;
- sdio_set_drvdata(func, wl);
+ sdio_set_drvdata(func, glue);
/* Tell PM core that we don't need the card to be powered now */
pm_runtime_put_noidle(&func->dev);
@@ -267,18 +291,23 @@ static int __devinit wl1271_probe(struct sdio_func *func,
return 0;
- out_irq:
+err3:
free_irq(wl->irq, wl);
- out_free:
+err2:
wl1271_free_hw(wl);
+err1:
+ kfree(glue);
+
+err0:
return ret;
}
static void __devexit wl1271_remove(struct sdio_func *func)
{
- struct wl1271 *wl = sdio_get_drvdata(func);
+ struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
+ struct wl1271 *wl = glue->wl;
/* Undo decrement done above in wl1271_probe */
pm_runtime_get_noresume(&func->dev);
@@ -286,6 +315,7 @@ static void __devexit wl1271_remove(struct sdio_func *func)
wl1271_unregister_hw(wl);
free_irq(wl->irq, wl);
wl1271_free_hw(wl);
+ kfree(glue);
}
static int wl1271_suspend(struct device *dev)
--
1.7.4.1.343.ga91df
^ permalink raw reply related
* [RFC/PATCH 03/13] net: wl12xx: remove some unnecessary prints
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho
Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
netdev-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA, Felipe Balbi
In-Reply-To: <1305321990-22041-1-git-send-email-balbi-l0cyMroinI0@public.gmane.org>
Those have little value. Remove those to make
the driver less noisy.
Signed-off-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
---
drivers/net/wireless/wl12xx/sdio.c | 15 +--------------
1 files changed, 1 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index fe775d3..0832b80 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -287,8 +287,6 @@ static int __devinit wl1271_probe(struct sdio_func *func,
/* Tell PM core that we don't need the card to be powered now */
pm_runtime_put_noidle(&func->dev);
- wl1271_notice("initialized");
-
return 0;
err3:
@@ -347,23 +345,12 @@ static struct sdio_driver wl1271_sdio_driver = {
static int __init wl1271_init(void)
{
- int ret;
-
- ret = sdio_register_driver(&wl1271_sdio_driver);
- if (ret < 0) {
- wl1271_error("failed to register sdio driver: %d", ret);
- goto out;
- }
-
-out:
- return ret;
+ return sdio_register_driver(&wl1271_sdio_driver);
}
static void __exit wl1271_exit(void)
{
sdio_unregister_driver(&wl1271_sdio_driver);
^ permalink raw reply related
* [RFC/PATCH 04/13] net: wl12xx: care for optional operations
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless, netdev, linux-kernel, Felipe Balbi
In-Reply-To: <1305321990-22041-1-git-send-email-balbi@ti.com>
->init and ->reset are optional - at least
sdio.c doesn't implement them - so allow those
pointers to be NULL.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/net/wireless/wl12xx/io.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/io.c b/drivers/net/wireless/wl12xx/io.c
index d557f73..57bc646 100644
--- a/drivers/net/wireless/wl12xx/io.c
+++ b/drivers/net/wireless/wl12xx/io.c
@@ -117,12 +117,14 @@ EXPORT_SYMBOL_GPL(wl1271_set_partition);
void wl1271_io_reset(struct wl1271 *wl)
{
- wl->if_ops->reset(wl);
+ if (wl->if_ops->reset)
+ wl->if_ops->reset(wl);
}
void wl1271_io_init(struct wl1271 *wl)
{
- wl->if_ops->init(wl);
+ if (wl->if_ops->init)
+ wl->if_ops->init(wl);
}
void wl1271_top_reg_write(struct wl1271 *wl, int addr, u16 val)
--
1.7.4.1.343.ga91df
^ permalink raw reply related
* [RFC/PATCH 05/13] net: wl12xx: remove the nops
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless, netdev, linux-kernel, Felipe Balbi
In-Reply-To: <1305321990-22041-1-git-send-email-balbi@ti.com>
Nops aren't needed. When we actually need
those calls, then we add them with meat
and barbecue sauce.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/net/wireless/wl12xx/sdio.c | 30 ------------------------------
1 files changed, 0 insertions(+), 30 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index 0832b80..bb7569c 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -95,14 +95,6 @@ static void wl1271_sdio_enable_interrupts(struct wl1271 *wl)
enable_irq(wl->irq);
}
-static void wl1271_sdio_reset(struct wl1271 *wl)
-{
-}
-
-static void wl1271_sdio_init(struct wl1271 *wl)
-{
-}
-
static void wl1271_sdio_raw_read(struct wl1271 *wl, int addr, void *buf,
size_t len, bool fixed)
{
@@ -207,8 +199,6 @@ static int wl1271_sdio_set_power(struct wl1271 *wl, bool enable)
static struct wl1271_if_operations sdio_ops = {
.read = wl1271_sdio_raw_read,
.write = wl1271_sdio_raw_write,
- .reset = wl1271_sdio_reset,
- .init = wl1271_sdio_init,
.power = wl1271_sdio_set_power,
.dev = wl1271_sdio_wl_to_dev,
.enable_irq = wl1271_sdio_enable_interrupts,
@@ -316,31 +306,11 @@ static void __devexit wl1271_remove(struct sdio_func *func)
kfree(glue);
}
-static int wl1271_suspend(struct device *dev)
-{
- /* Tell MMC/SDIO core it's OK to power down the card
- * (if it isn't already), but not to remove it completely */
- return 0;
-}
-
-static int wl1271_resume(struct device *dev)
-{
- return 0;
-}
-
-static const struct dev_pm_ops wl1271_sdio_pm_ops = {
- .suspend = wl1271_suspend,
- .resume = wl1271_resume,
-};
-
static struct sdio_driver wl1271_sdio_driver = {
.name = "wl1271_sdio",
.id_table = wl1271_devices,
.probe = wl1271_probe,
.remove = __devexit_p(wl1271_remove),
- .drv = {
- .pm = &wl1271_sdio_pm_ops,
- },
};
static int __init wl1271_init(void)
--
1.7.4.1.343.ga91df
^ permalink raw reply related
* [RFC/PATCH 06/13] net: wl12xx: remove unnecessary prints
From: Felipe Balbi @ 2011-05-13 21:26 UTC (permalink / raw)
To: Luciano Coelho; +Cc: linux-wireless, netdev, linux-kernel, Felipe Balbi
In-Reply-To: <1305321990-22041-1-git-send-email-balbi@ti.com>
Those have little value. Remove those to
make the driver less noisy.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/net/wireless/wl12xx/spi.c | 15 +--------------
1 files changed, 1 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/spi.c b/drivers/net/wireless/wl12xx/spi.c
index ffc745b..382b79d 100644
--- a/drivers/net/wireless/wl12xx/spi.c
+++ b/drivers/net/wireless/wl12xx/spi.c
@@ -426,8 +426,6 @@ static int __devinit wl1271_probe(struct spi_device *spi)
if (ret)
goto out_irq;
- wl1271_notice("initialized");
-
return 0;
out_irq:
@@ -464,23 +462,12 @@ static struct spi_driver wl1271_spi_driver = {
static int __init wl1271_init(void)
{
- int ret;
-
- ret = spi_register_driver(&wl1271_spi_driver);
- if (ret < 0) {
- wl1271_error("failed to register spi driver: %d", ret);
- goto out;
- }
-
-out:
- return ret;
+ return spi_register_driver(&wl1271_spi_driver);
}
static void __exit wl1271_exit(void)
{
spi_unregister_driver(&wl1271_spi_driver);
-
- wl1271_notice("unloaded");
}
module_init(wl1271_init);
--
1.7.4.1.343.ga91df
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox