[BRIDGE]: Unaligned accesses in the ethernet bridge
authorPeter Chubb <peterc@gelato.unsw.edu.au>
Fri, 24 Mar 2006 05:39:47 +0000 (21:39 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Fri, 24 Mar 2006 23:44:57 +0000 (15:44 -0800)
I see lots of
kernel unaligned access to 0xa0000001009dbb6f, ip=0xa000000100811591
kernel unaligned access to 0xa0000001009dbb6b, ip=0xa0000001008115c1
kernel unaligned access to 0xa0000001009dbb6d, ip=0xa0000001008115f1
messages in my logs on IA64 when using the ethernet bridge with 2.6.16.

Appended is a patch to fix them.

Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au>
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_stp_bpdu.c

index 8934a54792be48d91b7edbc0d37ff654711b1640..a7ba0cce0b4658738e170a5ee2d11ed64414c407 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/llc.h>
 #include <net/llc.h>
 #include <net/llc_pdu.h>
+#include <asm/unaligned.h>
 
 #include "br_private.h"
 #include "br_private_stp.h"
@@ -59,12 +60,12 @@ static inline void br_set_ticks(unsigned char *dest, int j)
 {
        unsigned long ticks = (STP_HZ * j)/ HZ;
 
-       *((__be16 *) dest) = htons(ticks);
+       put_unaligned(htons(ticks), (__be16 *)dest);
 }
 
 static inline int br_get_ticks(const unsigned char *src)
 {
-       unsigned long ticks = ntohs(*(__be16 *)src);
+       unsigned long ticks = ntohs(get_unaligned((__be16 *)src));
 
        return (ticks * HZ + STP_HZ - 1) / STP_HZ;
 }