aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.h
diff options
context:
space:
mode:
authorDavid Miller <davem@davemloft.net>2008-02-15 10:40:52 -0500
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:00 -0400
commitdf68b8a7ad4a18c9e63f1c12015a59c3b7031adb (patch)
treef2e6569b5f4843a01f23068fdfd3b450c8258459 /fs/btrfs/ctree.h
parent39b5637f6f195852259004bb27b58e2dcf9fb378 (diff)
Btrfs: unaligned access fixes
Btrfs set/get macros lose type information needed to avoid unaligned accesses on sparc64. ere is a patch for the kernel bits which fixes most of the unaligned accesses on sparc64. btrfs_name_hash is modified to return the hash value instead of getting a return location via a (potentially unaligned) pointer. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.h')
-rw-r--r--fs/btrfs/ctree.h17
1 files changed, 6 insertions, 11 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 52144b04f1af..086cb0525cd1 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -495,22 +495,17 @@ void btrfs_set_##name(struct extent_buffer *eb, type *s, u##bits val);
495#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \ 495#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
496static inline u##bits btrfs_##name(struct extent_buffer *eb) \ 496static inline u##bits btrfs_##name(struct extent_buffer *eb) \
497{ \ 497{ \
498 char *kaddr = kmap_atomic(eb->first_page, KM_USER0); \ 498 type *p = kmap_atomic(eb->first_page, KM_USER0); \
499 unsigned long offset = offsetof(type, member); \ 499 u##bits res = le##bits##_to_cpu(p->member); \
500 u##bits res; \ 500 kunmap_atomic(p, KM_USER0); \
501 __le##bits *tmp = (__le##bits *)(kaddr + offset); \
502 res = le##bits##_to_cpu(*tmp); \
503 kunmap_atomic(kaddr, KM_USER0); \
504 return res; \ 501 return res; \
505} \ 502} \
506static inline void btrfs_set_##name(struct extent_buffer *eb, \ 503static inline void btrfs_set_##name(struct extent_buffer *eb, \
507 u##bits val) \ 504 u##bits val) \
508{ \ 505{ \
509 char *kaddr = kmap_atomic(eb->first_page, KM_USER0); \ 506 type *p = kmap_atomic(eb->first_page, KM_USER0); \
510 unsigned long offset = offsetof(type, member); \ 507 p->member = cpu_to_le##bits(val); \
511 __le##bits *tmp = (__le##bits *)(kaddr + offset); \ 508 kunmap_atomic(p, KM_USER0); \
512 *tmp = cpu_to_le##bits(val); \
513 kunmap_atomic(kaddr, KM_USER0); \
514} 509}
515 510
516#define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \ 511#define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits) \