diff options
author | Peter Chubb <peterc@gelato.unsw.edu.au> | 2006-03-24 00:39:47 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-24 18:44:57 -0500 |
commit | 4dc6d9cc38cea1004a7f827cf76409ae42231fee (patch) | |
tree | 6c96b23f151565cbc789f7b5004e966437bab056 /net/bridge/br_stp_bpdu.c | |
parent | b2fd16b4ff2508ac16ae994f4bcd941f97754c00 (diff) |
[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: Peter Chubb <peterc@gelato.unsw.edu.au>
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_stp_bpdu.c')
-rw-r--r-- | net/bridge/br_stp_bpdu.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c index 8934a54792be..a7ba0cce0b46 100644 --- a/net/bridge/br_stp_bpdu.c +++ b/net/bridge/br_stp_bpdu.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/llc.h> | 19 | #include <linux/llc.h> |
20 | #include <net/llc.h> | 20 | #include <net/llc.h> |
21 | #include <net/llc_pdu.h> | 21 | #include <net/llc_pdu.h> |
22 | #include <asm/unaligned.h> | ||
22 | 23 | ||
23 | #include "br_private.h" | 24 | #include "br_private.h" |
24 | #include "br_private_stp.h" | 25 | #include "br_private_stp.h" |
@@ -59,12 +60,12 @@ static inline void br_set_ticks(unsigned char *dest, int j) | |||
59 | { | 60 | { |
60 | unsigned long ticks = (STP_HZ * j)/ HZ; | 61 | unsigned long ticks = (STP_HZ * j)/ HZ; |
61 | 62 | ||
62 | *((__be16 *) dest) = htons(ticks); | 63 | put_unaligned(htons(ticks), (__be16 *)dest); |
63 | } | 64 | } |
64 | 65 | ||
65 | static inline int br_get_ticks(const unsigned char *src) | 66 | static inline int br_get_ticks(const unsigned char *src) |
66 | { | 67 | { |
67 | unsigned long ticks = ntohs(*(__be16 *)src); | 68 | unsigned long ticks = ntohs(get_unaligned((__be16 *)src)); |
68 | 69 | ||
69 | return (ticks * HZ + STP_HZ - 1) / STP_HZ; | 70 | return (ticks * HZ + STP_HZ - 1) / STP_HZ; |
70 | } | 71 | } |