summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>2007-04-21 19:52:04 -0700
committerDavid S. Miller <davem@sunset.davemloft.net>2007-04-25 22:29:37 -0700
commit97fc8d0bc58cd09e62dc06ea5a64b58841738934 (patch)
treed8e5c32caefe07161dbcb00bebba4c72089364e3 /net
parent952a10be3272c4b5b7839b09cb0483dc72137101 (diff)
downloadlinux-97fc8d0bc58cd09e62dc06ea5a64b58841738934.tar.gz
linux-97fc8d0bc58cd09e62dc06ea5a64b58841738934.tar.bz2
linux-97fc8d0bc58cd09e62dc06ea5a64b58841738934.zip
[IPV6] SNMP: Use put_unaligned() instead of memcpy().
Hint from David Miller <davem@davemloft.net>. Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/proc.c26
1 files changed, 10 insertions, 16 deletions
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
index aba94316b773..7a00bedb6b93 100644
--- a/net/ipv6/proc.c
+++ b/net/ipv6/proc.c
@@ -23,6 +23,7 @@
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stddef.h>
+#include <asm/unaligned.h>
#include <net/sock.h>
#include <net/tcp.h>
#include <net/transp_v6.h>
@@ -210,30 +211,23 @@ static const struct file_operations snmp6_seq_fops = {
};
#endif /* CONFIG_PROC_FS */
-/*
- * Stats may not be aligned for u64, so use memcpy to avoid
- * unaligned accesses.
- */
-static inline void __set_u64(void *p, u64 v)
-{
- memcpy(p, &v, sizeof(u64));
-}
-
static inline void
-__snmp6_fill_stats(void *stats, void **mib, int items, int bytes)
+__snmp6_fill_stats(u64 *stats, void **mib, int items, int bytes)
{
int i;
- u8 *p = stats;
int pad = bytes - sizeof(u64) * items;
BUG_ON(pad < 0);
- __set_u64(p, items);
- for (i = 1, p += sizeof(u64); i < items; i++, p += sizeof(u64))
- __set_u64(p, fold_field(mib, i));
- memset(p, 0, pad);
+
+ /* Use put_unaligned() because stats may not be aligned for u64. */
+ put_unaligned(items, &stats[0]);
+ for (i = 1; i < items; i++)
+ put_unaligned(fold_field(mib, i), &stats[i]);
+
+ memset(&stats[items], 0, pad);
}
void
-snmp6_fill_stats(void *stats, struct inet6_dev *idev, int attrtype, int bytes)
+snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, int bytes)
{
switch(attrtype) {
case IFLA_INET6_STATS: