diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-12-02 11:18:37 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-12-02 11:18:37 -0500 |
commit | c99e905c945c462085c6d64646dc5af0c0a16815 (patch) | |
tree | 3aed8630c0778c4a8b26a5d8eb2fba42fbb5e26c /fs/btrfs/struct-funcs.c | |
parent | 2a7108ad89e1ea9a30afbbece8b581a0532afd12 (diff) |
Btrfs: Fix sparse endian warnings in struct-funcs.c
The btrfs macros to access individual struct members on disk were
sending the same variable to functions that expected different types
of endianness. This fix explicitly creates a variable of the correct
type instead of abusing a single variable for mixed purposes.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/struct-funcs.c')
-rw-r--r-- | fs/btrfs/struct-funcs.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/btrfs/struct-funcs.c b/fs/btrfs/struct-funcs.c index cdedbe144d45..8d7f568009c9 100644 --- a/fs/btrfs/struct-funcs.c +++ b/fs/btrfs/struct-funcs.c | |||
@@ -36,9 +36,14 @@ | |||
36 | * The extent buffer api is used to do all the kmapping and page | 36 | * The extent buffer api is used to do all the kmapping and page |
37 | * spanning work required to get extent buffers in highmem and have | 37 | * spanning work required to get extent buffers in highmem and have |
38 | * a metadata blocksize different from the page size. | 38 | * a metadata blocksize different from the page size. |
39 | * | ||
40 | * The macro starts with a simple function prototype declaration so that | ||
41 | * sparse won't complain about it being static. | ||
39 | */ | 42 | */ |
40 | 43 | ||
41 | #define BTRFS_SETGET_FUNCS(name, type, member, bits) \ | 44 | #define BTRFS_SETGET_FUNCS(name, type, member, bits) \ |
45 | u##bits btrfs_##name(struct extent_buffer *eb, type *s); \ | ||
46 | void btrfs_set_##name(struct extent_buffer *eb, type *s, u##bits val); \ | ||
42 | u##bits btrfs_##name(struct extent_buffer *eb, \ | 47 | u##bits btrfs_##name(struct extent_buffer *eb, \ |
43 | type *s) \ | 48 | type *s) \ |
44 | { \ | 49 | { \ |
@@ -59,14 +64,15 @@ u##bits btrfs_##name(struct extent_buffer *eb, \ | |||
59 | int unmap_on_exit = (eb->map_token == NULL); \ | 64 | int unmap_on_exit = (eb->map_token == NULL); \ |
60 | unsigned long map_start; \ | 65 | unsigned long map_start; \ |
61 | unsigned long map_len; \ | 66 | unsigned long map_len; \ |
62 | __le##bits res; \ | 67 | u##bits res; \ |
63 | err = map_extent_buffer(eb, offset, \ | 68 | err = map_extent_buffer(eb, offset, \ |
64 | sizeof(((type *)0)->member), \ | 69 | sizeof(((type *)0)->member), \ |
65 | &map_token, &kaddr, \ | 70 | &map_token, &kaddr, \ |
66 | &map_start, &map_len, KM_USER1); \ | 71 | &map_start, &map_len, KM_USER1); \ |
67 | if (err) { \ | 72 | if (err) { \ |
68 | read_eb_member(eb, s, type, member, &res); \ | 73 | __le##bits leres; \ |
69 | return le##bits##_to_cpu(res); \ | 74 | read_eb_member(eb, s, type, member, &leres); \ |
75 | return le##bits##_to_cpu(leres); \ | ||
70 | } \ | 76 | } \ |
71 | p = (type *)(kaddr + part_offset - map_start); \ | 77 | p = (type *)(kaddr + part_offset - map_start); \ |
72 | res = le##bits##_to_cpu(p->member); \ | 78 | res = le##bits##_to_cpu(p->member); \ |
@@ -101,8 +107,9 @@ void btrfs_set_##name(struct extent_buffer *eb, \ | |||
101 | &map_token, &kaddr, \ | 107 | &map_token, &kaddr, \ |
102 | &map_start, &map_len, KM_USER1); \ | 108 | &map_start, &map_len, KM_USER1); \ |
103 | if (err) { \ | 109 | if (err) { \ |
104 | val = cpu_to_le##bits(val); \ | 110 | __le##bits val2; \ |
105 | write_eb_member(eb, s, type, member, &val); \ | 111 | val2 = cpu_to_le##bits(val); \ |
112 | write_eb_member(eb, s, type, member, &val2); \ | ||
106 | return; \ | 113 | return; \ |
107 | } \ | 114 | } \ |
108 | p = (type *)(kaddr + part_offset - map_start); \ | 115 | p = (type *)(kaddr + part_offset - map_start); \ |