aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2011-03-23 19:41:50 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-23 22:46:12 -0400
commita56560b3b233238e85205d4e8d7bded904ac2306 (patch)
tree3965be2ab5fcf6c70fc09604861c14ef554915e8
parentc4945b9ed472e8796e352f10df9dbc2841ba7b61 (diff)
asm-generic: change little-endian bitops to take any pointer types
This makes the little-endian bitops take any pointer types by changing the prototypes and adding casts in the preprocessor macros. That would seem to at least make all the filesystem code happier, and they can continue to do just something like #define ext2_set_bit __test_and_set_bit_le (or whatever the exact sequence ends up being). Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Richard Henderson <rth@twiddle.net> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Mikael Starvik <starvik@axis.com> Cc: David Howells <dhowells@redhat.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: "Luck, Tony" <tony.luck@intel.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Kyle McMartin <kyle@mcmartin.ca> Cc: Matthew Wilcox <willy@debian.org> Cc: Grant Grundler <grundler@parisc-linux.org> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp> Cc: Hirokazu Takata <takata@linux-m32r.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Chris Zankel <chris@zankel.net> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/powerpc/include/asm/bitops.h4
-rw-r--r--include/asm-generic/bitops/le.h77
-rw-r--r--lib/find_next_bit.c10
3 files changed, 61 insertions, 30 deletions
diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h
index 97aacbdd752a..db567ed9212d 100644
--- a/arch/powerpc/include/asm/bitops.h
+++ b/arch/powerpc/include/asm/bitops.h
@@ -305,10 +305,10 @@ static __inline__ int test_le_bit(unsigned long nr,
305 305
306#define find_first_zero_bit_le(addr, size) \ 306#define find_first_zero_bit_le(addr, size) \
307 find_next_zero_bit_le((addr), (size), 0) 307 find_next_zero_bit_le((addr), (size), 0)
308unsigned long find_next_zero_bit_le(const unsigned long *addr, 308unsigned long find_next_zero_bit_le(const void *addr,
309 unsigned long size, unsigned long offset); 309 unsigned long size, unsigned long offset);
310 310
311unsigned long find_next_bit_le(const unsigned long *addr, 311unsigned long find_next_bit_le(const void *addr,
312 unsigned long size, unsigned long offset); 312 unsigned long size, unsigned long offset);
313/* Bitmap functions for the ext2 filesystem */ 313/* Bitmap functions for the ext2 filesystem */
314 314
diff --git a/include/asm-generic/bitops/le.h b/include/asm-generic/bitops/le.h
index 394ac3ebcbde..946a21b1b5dc 100644
--- a/include/asm-generic/bitops/le.h
+++ b/include/asm-generic/bitops/le.h
@@ -8,20 +8,31 @@
8 8
9#define BITOP_LE_SWIZZLE 0 9#define BITOP_LE_SWIZZLE 0
10 10
11#define find_next_zero_bit_le(addr, size, offset) \ 11static inline unsigned long find_next_zero_bit_le(const void *addr,
12 find_next_zero_bit(addr, size, offset) 12 unsigned long size, unsigned long offset)
13#define find_next_bit_le(addr, size, offset) \ 13{
14 find_next_bit(addr, size, offset) 14 return find_next_zero_bit(addr, size, offset);
15#define find_first_zero_bit_le(addr, size) \ 15}
16 find_first_zero_bit(addr, size) 16
17static inline unsigned long find_next_bit_le(const void *addr,
18 unsigned long size, unsigned long offset)
19{
20 return find_next_bit(addr, size, offset);
21}
22
23static inline unsigned long find_first_zero_bit_le(const void *addr,
24 unsigned long size)
25{
26 return find_first_zero_bit(addr, size);
27}
17 28
18#elif defined(__BIG_ENDIAN) 29#elif defined(__BIG_ENDIAN)
19 30
20#define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7) 31#define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7)
21 32
22extern unsigned long find_next_zero_bit_le(const unsigned long *addr, 33extern unsigned long find_next_zero_bit_le(const void *addr,
23 unsigned long size, unsigned long offset); 34 unsigned long size, unsigned long offset);
24extern unsigned long find_next_bit_le(const unsigned long *addr, 35extern unsigned long find_next_bit_le(const void *addr,
25 unsigned long size, unsigned long offset); 36 unsigned long size, unsigned long offset);
26 37
27#define find_first_zero_bit_le(addr, size) \ 38#define find_first_zero_bit_le(addr, size) \
@@ -31,21 +42,39 @@ extern unsigned long find_next_bit_le(const unsigned long *addr,
31#error "Please fix <asm/byteorder.h>" 42#error "Please fix <asm/byteorder.h>"
32#endif 43#endif
33 44
34#define test_bit_le(nr, addr) \ 45static inline int test_bit_le(int nr, const void *addr)
35 test_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 46{
36#define __set_bit_le(nr, addr) \ 47 return test_bit(nr ^ BITOP_LE_SWIZZLE, addr);
37 __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 48}
38#define __clear_bit_le(nr, addr) \ 49
39 __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 50static inline void __set_bit_le(int nr, void *addr)
40 51{
41#define test_and_set_bit_le(nr, addr) \ 52 __set_bit(nr ^ BITOP_LE_SWIZZLE, addr);
42 test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 53}
43#define test_and_clear_bit_le(nr, addr) \ 54
44 test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 55static inline void __clear_bit_le(int nr, void *addr)
45 56{
46#define __test_and_set_bit_le(nr, addr) \ 57 __clear_bit(nr ^ BITOP_LE_SWIZZLE, addr);
47 __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 58}
48#define __test_and_clear_bit_le(nr, addr) \ 59
49 __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) 60static inline int test_and_set_bit_le(int nr, void *addr)
61{
62 return test_and_set_bit(nr ^ BITOP_LE_SWIZZLE, addr);
63}
64
65static inline int test_and_clear_bit_le(int nr, void *addr)
66{
67 return test_and_clear_bit(nr ^ BITOP_LE_SWIZZLE, addr);
68}
69
70static inline int __test_and_set_bit_le(int nr, void *addr)
71{
72 return __test_and_set_bit(nr ^ BITOP_LE_SWIZZLE, addr);
73}
74
75static inline int __test_and_clear_bit_le(int nr, void *addr)
76{
77 return __test_and_clear_bit(nr ^ BITOP_LE_SWIZZLE, addr);
78}
50 79
51#endif /* _ASM_GENERIC_BITOPS_LE_H_ */ 80#endif /* _ASM_GENERIC_BITOPS_LE_H_ */
diff --git a/lib/find_next_bit.c b/lib/find_next_bit.c
index c093ba988003..7667c3d907d3 100644
--- a/lib/find_next_bit.c
+++ b/lib/find_next_bit.c
@@ -185,15 +185,16 @@ static inline unsigned long ext2_swab(const unsigned long y)
185#endif 185#endif
186} 186}
187 187
188unsigned long find_next_zero_bit_le(const unsigned long *addr, unsigned 188unsigned long find_next_zero_bit_le(const void *addr, unsigned
189 long size, unsigned long offset) 189 long size, unsigned long offset)
190{ 190{
191 const unsigned long *p = addr + BITOP_WORD(offset); 191 const unsigned long *p = addr;
192 unsigned long result = offset & ~(BITS_PER_LONG - 1); 192 unsigned long result = offset & ~(BITS_PER_LONG - 1);
193 unsigned long tmp; 193 unsigned long tmp;
194 194
195 if (offset >= size) 195 if (offset >= size)
196 return size; 196 return size;
197 p += BITOP_WORD(offset);
197 size -= result; 198 size -= result;
198 offset &= (BITS_PER_LONG - 1UL); 199 offset &= (BITS_PER_LONG - 1UL);
199 if (offset) { 200 if (offset) {
@@ -228,15 +229,16 @@ found_middle_swap:
228} 229}
229EXPORT_SYMBOL(find_next_zero_bit_le); 230EXPORT_SYMBOL(find_next_zero_bit_le);
230 231
231unsigned long find_next_bit_le(const unsigned long *addr, unsigned 232unsigned long find_next_bit_le(const void *addr, unsigned
232 long size, unsigned long offset) 233 long size, unsigned long offset)
233{ 234{
234 const unsigned long *p = addr + BITOP_WORD(offset); 235 const unsigned long *p = addr;
235 unsigned long result = offset & ~(BITS_PER_LONG - 1); 236 unsigned long result = offset & ~(BITS_PER_LONG - 1);
236 unsigned long tmp; 237 unsigned long tmp;
237 238
238 if (offset >= size) 239 if (offset >= size)
239 return size; 240 return size;
241 p += BITOP_WORD(offset);
240 size -= result; 242 size -= result;
241 offset &= (BITS_PER_LONG - 1UL); 243 offset &= (BITS_PER_LONG - 1UL);
242 if (offset) { 244 if (offset) {