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 | |
| 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')
| -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 cdedbe144d4..8d7f568009c 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); \ |
