Commit 4dc6d9cc authored by Peter Chubb's avatar Peter Chubb Committed by David S. Miller

[BRIDGE]: Unaligned accesses in the ethernet bridge

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: default avatarPeter Chubb <peterc@gelato.unsw.edu.au>
Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b2fd16b4
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/llc.h> #include <linux/llc.h>
#include <net/llc.h> #include <net/llc.h>
#include <net/llc_pdu.h> #include <net/llc_pdu.h>
#include <asm/unaligned.h>
#include "br_private.h" #include "br_private.h"
#include "br_private_stp.h" #include "br_private_stp.h"
...@@ -59,12 +60,12 @@ static inline void br_set_ticks(unsigned char *dest, int j) ...@@ -59,12 +60,12 @@ static inline void br_set_ticks(unsigned char *dest, int j)
{ {
unsigned long ticks = (STP_HZ * j)/ HZ; 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) 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; return (ticks * HZ + STP_HZ - 1) / STP_HZ;
} }
......
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