From: Akinobu Mita <akinobu.mita@gmail.com>
To: Linus Torvalds <torvalds@linux-foundation.org>,
Akinobu Mita <akinobu.mita@gmail.com>,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
akpm@linux-foundation.org, Arnd
Subject: Re: [PATCH v4 00/24] Introduce little endian bitops
Date: Tue, 18 Jan 2011 18:49:29 +0900 [thread overview]
Message-ID: <AANLkTiki4wk9dkd2J93FKJTOdcWUrXSLNv0KPR1gMEYk@mail.gmail.com> (raw)
In-Reply-To: <20110117093418.GA25694@flint.arm.linux.org.uk>
[-- Attachment #1: Type: text/plain, Size: 1053 bytes --]
2011/1/17 Russell King <rmk@arm.linux.org.uk>:
> The ARM bitops (set_bit/clear_bit/change_bit) have always taken an
> unsigned long argument and we have casts in our preprocessor macros
> for them. Only a couple of the find_bit functions have taken a
> void pointer.
>
> I really don't want to have to change the function prototypes on ARM,
> and I really don't want to hide this fact from non-fs users that ARM
> bitops require such pointers, with the exception of what's required
> for ext2/minix. If we do hide it, at some point we'll have someone
> believing that ARM's wrong to be requiring stricter alignment.
I have updated in my local branch and attached the diff between v4 and
updated one. It only changes the function prototypes for le bitops.
The function prototypes for the other bitops are not changed.
Assuming that ext2_*_bit() bitops is renamed to *_bit_le() bitops
by this patch series, it doesn't make the things worse.
(i.e. both bitops hide the fact that require long aligned pointers)
What do you think?
[-- Attachment #2: v4-fix.patch --]
[-- Type: text/x-patch, Size: 23958 bytes --]
diff -Nurp linux-v4/arch/arm/include/asm/bitops.h linux-v4-fix/arch/arm/include/asm/bitops.h
--- linux-v4/arch/arm/include/asm/bitops.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/arm/include/asm/bitops.h 2011-01-18 15:40:15.000000000 +0900
@@ -304,34 +304,32 @@ static inline int fls(int x)
#include <asm-generic/bitops/lock.h>
#define __set_bit_le(nr, p) \
- __set_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define __clear_bit_le(nr, p) \
- __clear_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define __test_and_set_bit_le(nr, p) \
- __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define test_and_set_bit_le(nr, p) \
- test_and_set_bit(WORD_BITOFF_TO_LE(nr), (p))
+ test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define __test_and_clear_bit_le(nr, p) \
- __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define test_and_clear_bit_le(nr, p) \
- test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (p))
+ test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define test_bit_le(nr, p) \
- test_bit(WORD_BITOFF_TO_LE(nr), (p))
+ test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define find_first_zero_bit_le(p, sz) \
_find_first_zero_bit_le(p, sz)
#define find_next_zero_bit_le(p, sz, off) \
_find_next_zero_bit_le(p, sz, off)
#define find_next_bit_le(p, sz, off) \
- _find_next_bit_le(p, sz, off)
+ _find_next_bit_le((unsigned long *)(p), sz, off)
/*
* Ext2 is defined to use little-endian byte ordering.
- * These do not need to be atomic.
*/
-#define ext2_set_bit_atomic(lock,nr,p) \
- test_and_set_bit_le(nr, (unsigned long *)(p))
-#define ext2_clear_bit_atomic(lock,nr,p) \
- test_and_clear_bit_le(nr, (unsigned long *)(p))
-
+#define ext2_set_bit_atomic(lock, nr, p) \
+ test_and_set_bit_le(nr, p)
+#define ext2_clear_bit_atomic(lock, nr, p) \
+ test_and_clear_bit_le(nr, p)
#endif /* __KERNEL__ */
diff -Nurp linux-v4/arch/m68k/include/asm/bitops_mm.h linux-v4-fix/arch/m68k/include/asm/bitops_mm.h
--- linux-v4/arch/m68k/include/asm/bitops_mm.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/m68k/include/asm/bitops_mm.h 2011-01-18 15:40:15.000000000 +0900
@@ -328,17 +328,17 @@ static inline int __fls(int x)
/* Bitmap functions for little endian. */
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ 24, (addr))
+ __set_bit((nr) ^ 24, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ 24, (addr))
+ __clear_bit((nr) ^ 24, (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr) ^ 24, (addr))
+ __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr) ^ 24, (addr))
+ test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr) ^ 24, (addr))
+ __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr) ^ 24, (addr))
+ test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
static inline int test_bit_le(int nr, const void *vaddr)
{
@@ -368,15 +368,17 @@ static inline int find_first_zero_bit_le
return (p - addr) * 32 + res;
}
-static inline unsigned long find_next_zero_bit_le(const unsigned long *addr,
+static inline unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset)
{
- const unsigned long *p = addr + (offset >> 5);
+ const unsigned long *p = addr;
int bit = offset & 31UL, res;
if (offset >= size)
return size;
+ p += offset >> 5;
+
if (bit) {
/* Look for zero in first longword */
for (res = bit; res < 32; res++)
@@ -410,15 +412,17 @@ static inline int find_first_bit_le(cons
return (p - addr) * 32 + res;
}
-static inline unsigned long find_next_bit_le(const unsigned long *addr,
+static inline unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset)
{
- const unsigned long *p = addr + (offset >> 5);
+ const unsigned long *p = addr;
int bit = offset & 31UL, res;
if (offset >= size)
return size;
+ p += offset >> 5;
+
if (bit) {
/* Look for one in first longword */
for (res = bit; res < 32; res++)
@@ -434,9 +438,9 @@ static inline unsigned long find_next_bi
/* Bitmap functions for the ext2 filesystem. */
#define ext2_set_bit_atomic(lock, nr, addr) \
- test_and_set_bit_le(nr, (unsigned long *)(addr))
+ test_and_set_bit_le(nr, addr)
#define ext2_clear_bit_atomic(lock, nr, addr) \
- test_and_clear_bit_le(nr, (unsigned long *)(addr))
+ test_and_clear_bit_le(nr, addr)
#endif /* __KERNEL__ */
diff -Nurp linux-v4/arch/m68k/include/asm/bitops_no.h linux-v4-fix/arch/m68k/include/asm/bitops_no.h
--- linux-v4/arch/m68k/include/asm/bitops_no.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/m68k/include/asm/bitops_no.h 2011-01-18 15:40:15.000000000 +0900
@@ -199,10 +199,10 @@ static __inline__ int __test_bit(int nr,
#define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7)
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
static inline int __test_and_set_bit_le(int nr, volatile void *addr)
{
diff -Nurp linux-v4/arch/powerpc/include/asm/bitops.h linux-v4-fix/arch/powerpc/include/asm/bitops.h
--- linux-v4/arch/powerpc/include/asm/bitops.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/powerpc/include/asm/bitops.h 2011-01-18 15:40:15.000000000 +0900
@@ -273,33 +273,33 @@ static __inline__ int fls64(__u64 x)
/* Little-endian versions */
static __inline__ int test_bit_le(unsigned long nr,
- __const__ unsigned long *addr)
+ __const__ void *addr)
{
__const__ unsigned char *tmp = (__const__ unsigned char *) addr;
return (tmp[nr >> 3] >> (nr & 7)) & 1;
}
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define find_first_zero_bit_le(addr, size) \
find_next_zero_bit_le((addr), (size), 0)
-unsigned long find_next_zero_bit_le(const unsigned long *addr,
+unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset);
-unsigned long find_next_bit_le(const unsigned long *addr,
+unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset);
/* Bitmap functions for the ext2 filesystem */
diff -Nurp linux-v4/arch/s390/include/asm/bitops.h linux-v4-fix/arch/s390/include/asm/bitops.h
--- linux-v4/arch/s390/include/asm/bitops.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/s390/include/asm/bitops.h 2011-01-18 15:40:15.000000000 +0900
@@ -743,19 +743,19 @@ static inline int sched_find_first_bit(u
*/
#define __set_bit_le(nr, addr) \
- __set_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define test_bit_le(nr, addr) \
- test_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ test_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
static inline int find_first_zero_bit_le(void *vaddr, unsigned int size)
{
@@ -837,10 +837,10 @@ static inline int find_next_bit_le(void
return offset + find_first_bit_le(p, size);
}
-#define ext2_set_bit_atomic(lock, nr, addr) \
- test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define ext2_clear_bit_atomic(lock, nr, addr) \
- test_and_clear_bit_le((nr), (unsigned long *)(addr))
+#define ext2_set_bit_atomic(lock, nr, addr) \
+ test_and_set_bit_le(nr, addr)
+#define ext2_clear_bit_atomic(lock, nr, addr) \
+ test_and_clear_bit_le(nr, addr)
#endif /* __KERNEL__ */
diff -Nurp linux-v4/fs/ext2/ext2.h linux-v4-fix/fs/ext2/ext2.h
--- linux-v4/fs/ext2/ext2.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ext2/ext2.h 2011-01-18 15:40:15.000000000 +0900
@@ -175,13 +175,8 @@ ext2_group_first_block_no(struct super_b
le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block);
}
-#define ext2_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define ext2_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
-#define ext2_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define ext2_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
-#define ext2_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define ext2_set_bit __test_and_set_bit_le
+#define ext2_clear_bit __test_and_clear_bit_le
+#define ext2_test_bit test_bit_le
+#define ext2_find_first_zero_bit find_first_zero_bit_le
+#define ext2_find_next_zero_bit find_next_zero_bit_le
diff -Nurp linux-v4/fs/ext4/ext4.h linux-v4-fix/fs/ext4/ext4.h
--- linux-v4/fs/ext4/ext4.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ext4/ext4.h 2011-01-18 15:40:15.000000000 +0900
@@ -922,20 +922,14 @@ struct ext4_inode_info {
#define test_opt(sb, opt) (EXT4_SB(sb)->s_mount_opt & \
EXT4_MOUNT_##opt)
-#define ext4_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
+#define ext4_set_bit __test_and_set_bit_le
#define ext4_set_bit_atomic ext2_set_bit_atomic
-#define ext4_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
+#define ext4_clear_bit __test_and_clear_bit_le
#define ext4_clear_bit_atomic ext2_clear_bit_atomic
-#define ext4_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define ext4_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
-#define ext4_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
-#define ext4_find_next_bit(addr, size, off) \
- find_next_bit_le((unsigned long *)(addr), (size), (off))
+#define ext4_test_bit test_bit_le
+#define ext4_find_first_zero_bit find_first_zero_bit_le
+#define ext4_find_next_zero_bit find_next_zero_bit_le
+#define ext4_find_next_bit find_next_bit_le
/*
* Maximal mount counts between two filesystem checks
diff -Nurp linux-v4/fs/minix/minix.h linux-v4-fix/fs/minix/minix.h
--- linux-v4/fs/minix/minix.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/minix/minix.h 2011-01-18 15:40:15.000000000 +0900
@@ -154,16 +154,11 @@ static inline int minix_test_bit(int nr,
* little-endian bitmaps
*/
-#define minix_test_and_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define minix_set_bit(nr, addr) \
- __set_bit_le((nr), (unsigned long *)(addr))
-#define minix_test_and_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
-#define minix_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define minix_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
+#define minix_test_and_set_bit __test_and_set_bit_le
+#define minix_set_bit __set_bit_le
+#define minix_test_and_clear_bit __test_and_clear_bit_le
+#define minix_test_bit test_bit_le
+#define minix_find_first_zero_bit find_first_zero_bit_le
#endif
diff -Nurp linux-v4/fs/nilfs2/alloc.h linux-v4-fix/fs/nilfs2/alloc.h
--- linux-v4/fs/nilfs2/alloc.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/nilfs2/alloc.h 2011-01-18 15:40:15.000000000 +0900
@@ -74,8 +74,7 @@ int nilfs_palloc_freev(struct inode *, _
#define nilfs_set_bit_atomic ext2_set_bit_atomic
#define nilfs_clear_bit_atomic ext2_clear_bit_atomic
-#define nilfs_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define nilfs_find_next_zero_bit find_next_zero_bit_le
/*
* persistent object allocator cache
diff -Nurp linux-v4/fs/ocfs2/ocfs2.h linux-v4-fix/fs/ocfs2/ocfs2.h
--- linux-v4/fs/ocfs2/ocfs2.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ocfs2/ocfs2.h 2011-01-18 15:40:15.000000000 +0900
@@ -836,11 +836,8 @@ static inline void _ocfs2_clear_bit(unsi
}
#define ocfs2_clear_bit(bit, addr) _ocfs2_clear_bit((bit), (unsigned long *)(addr))
-#define ocfs2_test_bit(nr, addr) \
- test_bit_le(nr, (unsigned long *)(addr))
-#define ocfs2_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), size, off)
-#define ocfs2_find_next_bit(addr, size, off) \
- find_next_bit_le((unsigned long *)(addr), size, off)
+#define ocfs2_test_bit test_bit_le
+#define ocfs2_find_next_zero_bit find_next_zero_bit_le
+#define ocfs2_find_next_bit find_next_bit_le
#endif /* OCFS2_H */
diff -Nurp linux-v4/fs/udf/balloc.c linux-v4-fix/fs/udf/balloc.c
--- linux-v4/fs/udf/balloc.c 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/udf/balloc.c 2011-01-18 15:40:15.000000000 +0900
@@ -27,14 +27,10 @@
#include "udf_i.h"
#include "udf_sb.h"
-#define udf_clear_bit(nr, addr) \
- __test_and_clear_bit_le(nr, (unsigned long *)(addr))
-#define udf_set_bit(nr, addr) \
- __test_and_set_bit_le(nr, (unsigned long *)(addr))
-#define udf_test_bit(nr, addr) \
- test_bit_le(nr, (unsigned long *)(addr))
-#define udf_find_next_one_bit(addr, size, offset) \
- find_next_bit_le((unsigned long *)(addr), size, offset)
+#define udf_clear_bit __test_and_clear_bit_le
+#define udf_set_bit __test_and_set_bit_le
+#define udf_test_bit test_bit_le
+#define udf_find_next_one_bit find_next_bit_le
static int read_block_bitmap(struct super_block *sb,
struct udf_bitmap *bitmap, unsigned int block,
diff -Nurp linux-v4/fs/ufs/util.h linux-v4-fix/fs/ufs/util.h
--- linux-v4/fs/ufs/util.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ufs/util.h 2011-01-18 15:40:15.000000000 +0900
@@ -408,7 +408,7 @@ static inline unsigned _ubh_find_next_ze
for (;;) {
count = min_t(unsigned int, size + offset, uspi->s_bpf);
size -= count - offset;
- pos = find_next_zero_bit_le((unsigned long *)ubh->bh[base]->b_data, count, offset);
+ pos = find_next_zero_bit_le(ubh->bh[base]->b_data, count, offset);
if (pos < count || !size)
break;
base++;
diff -Nurp linux-v4/include/asm-generic/bitops/ext2-atomic.h linux-v4-fix/include/asm-generic/bitops/ext2-atomic.h
--- linux-v4/include/asm-generic/bitops/ext2-atomic.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/asm-generic/bitops/ext2-atomic.h 2011-01-18 15:40:15.000000000 +0900
@@ -5,7 +5,7 @@
({ \
int ret; \
spin_lock(lock); \
- ret = __test_and_set_bit_le((nr), (unsigned long *)(addr)); \
+ ret = __test_and_set_bit_le(nr, addr); \
spin_unlock(lock); \
ret; \
})
@@ -14,7 +14,7 @@
({ \
int ret; \
spin_lock(lock); \
- ret = __test_and_clear_bit_le((nr), (unsigned long *)(addr)); \
+ ret = __test_and_clear_bit_le(nr, addr); \
spin_unlock(lock); \
ret; \
})
diff -Nurp linux-v4/include/asm-generic/bitops/le.h linux-v4-fix/include/asm-generic/bitops/le.h
--- linux-v4/include/asm-generic/bitops/le.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/asm-generic/bitops/le.h 2011-01-18 15:40:15.000000000 +0900
@@ -9,19 +9,19 @@
#define BITOP_LE_SWIZZLE 0
#define find_next_zero_bit_le(addr, size, offset) \
- find_next_zero_bit(addr, size, offset)
+ find_next_zero_bit((unsigned long *)(addr), size, offset)
#define find_next_bit_le(addr, size, offset) \
- find_next_bit(addr, size, offset)
+ find_next_bit((unsigned long *)(addr), size, offset)
#define find_first_zero_bit_le(addr, size) \
- find_first_zero_bit(addr, size)
+ find_first_zero_bit((unsigned long *)(addr), size)
#elif defined(__BIG_ENDIAN)
#define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7)
-extern unsigned long find_next_zero_bit_le(const unsigned long *addr,
+extern unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset);
-extern unsigned long find_next_bit_le(const unsigned long *addr,
+extern unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset);
#define find_first_zero_bit_le(addr, size) \
@@ -32,20 +32,20 @@ extern unsigned long find_next_bit_le(co
#endif
#define test_bit_le(nr, addr) \
- test_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#endif /* _ASM_GENERIC_BITOPS_LE_H_ */
diff -Nurp linux-v4/include/linux/ext3_fs.h linux-v4-fix/include/linux/ext3_fs.h
--- linux-v4/include/linux/ext3_fs.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/linux/ext3_fs.h 2011-01-18 15:40:15.000000000 +0900
@@ -418,18 +418,13 @@ struct ext3_inode {
#define EXT2_MOUNT_DATA_FLAGS EXT3_MOUNT_DATA_FLAGS
#endif
-#define ext3_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
+#define ext3_set_bit __test_and_set_bit_le
#define ext3_set_bit_atomic ext2_set_bit_atomic
-#define ext3_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
+#define ext3_clear_bit __test_and_clear_bit_le
#define ext3_clear_bit_atomic ext2_clear_bit_atomic
-#define ext3_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define ext3_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
-#define ext3_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define ext3_test_bit test_bit_le
+#define ext3_find_first_zero_bit find_first_zero_bit_le
+#define ext3_find_next_zero_bit find_next_zero_bit_le
/*
* Maximal mount counts between two filesystem checks
diff -Nurp linux-v4/include/linux/reiserfs_fs.h linux-v4-fix/include/linux/reiserfs_fs.h
--- linux-v4/include/linux/reiserfs_fs.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/linux/reiserfs_fs.h 2011-01-18 15:40:15.000000000 +0900
@@ -1133,12 +1133,9 @@ struct reiserfs_de_head {
#else
-# define set_bit_unaligned(nr, addr) \
- __test_and_set_bit_le(nr, (unsigned long *)(addr))
-# define clear_bit_unaligned(nr, addr) \
- __test_and_clear_bit_le(nr, (unsigned long *)(addr))
-# define test_bit_unaligned(nr, addr) \
- test_bit_le(nr, (unsigned long *)(addr))
+# define set_bit_unaligned(nr, addr) __test_and_set_bit_le(nr, addr)
+# define clear_bit_unaligned(nr, addr) __test_and_clear_bit_le(nr, addr)
+# define test_bit_unaligned(nr, addr) test_bit_le(nr, addr)
#endif
@@ -2335,14 +2332,10 @@ __u32 keyed_hash(const signed char *msg,
__u32 yura_hash(const signed char *msg, int len);
__u32 r5_hash(const signed char *msg, int len);
-#define reiserfs_test_and_set_le_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define reiserfs_test_and_clear_le_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
-#define reiserfs_test_le_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define reiserfs_find_next_zero_le_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define reiserfs_test_and_set_le_bit __test_and_set_bit_le
+#define reiserfs_test_and_clear_le_bit __test_and_clear_bit_le
+#define reiserfs_test_le_bit test_bit_le
+#define reiserfs_find_next_zero_le_bit find_next_zero_bit_le
/* sometimes reiserfs_truncate may require to allocate few new blocks
to perform indirect2direct conversion. People probably used to
diff -Nurp linux-v4/lib/find_next_bit.c linux-v4-fix/lib/find_next_bit.c
--- linux-v4/lib/find_next_bit.c 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/lib/find_next_bit.c 2011-01-18 15:40:15.000000000 +0900
@@ -186,15 +186,16 @@ static inline unsigned long ext2_swab(co
#endif
}
-unsigned long find_next_zero_bit_le(const unsigned long *addr, unsigned
+unsigned long find_next_zero_bit_le(const void *addr, unsigned
long size, unsigned long offset)
{
- const unsigned long *p = addr + BITOP_WORD(offset);
+ const unsigned long *p = addr;
unsigned long result = offset & ~(BITS_PER_LONG - 1);
unsigned long tmp;
if (offset >= size)
return size;
+ p += BITOP_WORD(offset);
size -= result;
offset &= (BITS_PER_LONG - 1UL);
if (offset) {
@@ -229,15 +230,16 @@ found_middle_swap:
}
EXPORT_SYMBOL(find_next_zero_bit_le);
-unsigned long find_next_bit_le(const unsigned long *addr, unsigned
+unsigned long find_next_bit_le(const void *addr, unsigned
long size, unsigned long offset)
{
- const unsigned long *p = addr + BITOP_WORD(offset);
+ const unsigned long *p = addr;
unsigned long result = offset & ~(BITS_PER_LONG - 1);
unsigned long tmp;
if (offset >= size)
return size;
+ p += BITOP_WORD(offset);
size -= result;
offset &= (BITS_PER_LONG - 1UL);
if (offset) {
diff -Nurp linux-v4/net/rds/cong.c linux-v4-fix/net/rds/cong.c
--- linux-v4/net/rds/cong.c 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/net/rds/cong.c 2011-01-18 15:40:15.000000000 +0900
@@ -33,6 +33,7 @@
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/rbtree.h>
+#include <linux/bitops.h>
#include "rds.h"
WARNING: multiple messages have this Message-ID (diff)
From: Akinobu Mita <akinobu.mita@gmail.com>
To: Linus Torvalds <torvalds@linux-foundation.org>,
Akinobu Mita <akinobu.mita@gmail.com>,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
akpm@linux-foundation.org, Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH v4 00/24] Introduce little endian bitops
Date: Tue, 18 Jan 2011 18:49:29 +0900 [thread overview]
Message-ID: <AANLkTiki4wk9dkd2J93FKJTOdcWUrXSLNv0KPR1gMEYk@mail.gmail.com> (raw)
Message-ID: <20110118094929.Xh0qY6UbAmVynyUSsIBwe6Hct2YY8bh6f9irqtijImY@z> (raw)
In-Reply-To: <20110117093418.GA25694@flint.arm.linux.org.uk>
[-- Attachment #1: Type: text/plain, Size: 1053 bytes --]
2011/1/17 Russell King <rmk@arm.linux.org.uk>:
> The ARM bitops (set_bit/clear_bit/change_bit) have always taken an
> unsigned long argument and we have casts in our preprocessor macros
> for them. Only a couple of the find_bit functions have taken a
> void pointer.
>
> I really don't want to have to change the function prototypes on ARM,
> and I really don't want to hide this fact from non-fs users that ARM
> bitops require such pointers, with the exception of what's required
> for ext2/minix. If we do hide it, at some point we'll have someone
> believing that ARM's wrong to be requiring stricter alignment.
I have updated in my local branch and attached the diff between v4 and
updated one. It only changes the function prototypes for le bitops.
The function prototypes for the other bitops are not changed.
Assuming that ext2_*_bit() bitops is renamed to *_bit_le() bitops
by this patch series, it doesn't make the things worse.
(i.e. both bitops hide the fact that require long aligned pointers)
What do you think?
[-- Attachment #2: v4-fix.patch --]
[-- Type: text/x-patch, Size: 23958 bytes --]
diff -Nurp linux-v4/arch/arm/include/asm/bitops.h linux-v4-fix/arch/arm/include/asm/bitops.h
--- linux-v4/arch/arm/include/asm/bitops.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/arm/include/asm/bitops.h 2011-01-18 15:40:15.000000000 +0900
@@ -304,34 +304,32 @@ static inline int fls(int x)
#include <asm-generic/bitops/lock.h>
#define __set_bit_le(nr, p) \
- __set_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define __clear_bit_le(nr, p) \
- __clear_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define __test_and_set_bit_le(nr, p) \
- __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define test_and_set_bit_le(nr, p) \
- test_and_set_bit(WORD_BITOFF_TO_LE(nr), (p))
+ test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define __test_and_clear_bit_le(nr, p) \
- __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (p))
+ __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define test_and_clear_bit_le(nr, p) \
- test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (p))
+ test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define test_bit_le(nr, p) \
- test_bit(WORD_BITOFF_TO_LE(nr), (p))
+ test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
#define find_first_zero_bit_le(p, sz) \
_find_first_zero_bit_le(p, sz)
#define find_next_zero_bit_le(p, sz, off) \
_find_next_zero_bit_le(p, sz, off)
#define find_next_bit_le(p, sz, off) \
- _find_next_bit_le(p, sz, off)
+ _find_next_bit_le((unsigned long *)(p), sz, off)
/*
* Ext2 is defined to use little-endian byte ordering.
- * These do not need to be atomic.
*/
-#define ext2_set_bit_atomic(lock,nr,p) \
- test_and_set_bit_le(nr, (unsigned long *)(p))
-#define ext2_clear_bit_atomic(lock,nr,p) \
- test_and_clear_bit_le(nr, (unsigned long *)(p))
-
+#define ext2_set_bit_atomic(lock, nr, p) \
+ test_and_set_bit_le(nr, p)
+#define ext2_clear_bit_atomic(lock, nr, p) \
+ test_and_clear_bit_le(nr, p)
#endif /* __KERNEL__ */
diff -Nurp linux-v4/arch/m68k/include/asm/bitops_mm.h linux-v4-fix/arch/m68k/include/asm/bitops_mm.h
--- linux-v4/arch/m68k/include/asm/bitops_mm.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/m68k/include/asm/bitops_mm.h 2011-01-18 15:40:15.000000000 +0900
@@ -328,17 +328,17 @@ static inline int __fls(int x)
/* Bitmap functions for little endian. */
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ 24, (addr))
+ __set_bit((nr) ^ 24, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ 24, (addr))
+ __clear_bit((nr) ^ 24, (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr) ^ 24, (addr))
+ __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr) ^ 24, (addr))
+ test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr) ^ 24, (addr))
+ __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr) ^ 24, (addr))
+ test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
static inline int test_bit_le(int nr, const void *vaddr)
{
@@ -368,15 +368,17 @@ static inline int find_first_zero_bit_le
return (p - addr) * 32 + res;
}
-static inline unsigned long find_next_zero_bit_le(const unsigned long *addr,
+static inline unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset)
{
- const unsigned long *p = addr + (offset >> 5);
+ const unsigned long *p = addr;
int bit = offset & 31UL, res;
if (offset >= size)
return size;
+ p += offset >> 5;
+
if (bit) {
/* Look for zero in first longword */
for (res = bit; res < 32; res++)
@@ -410,15 +412,17 @@ static inline int find_first_bit_le(cons
return (p - addr) * 32 + res;
}
-static inline unsigned long find_next_bit_le(const unsigned long *addr,
+static inline unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset)
{
- const unsigned long *p = addr + (offset >> 5);
+ const unsigned long *p = addr;
int bit = offset & 31UL, res;
if (offset >= size)
return size;
+ p += offset >> 5;
+
if (bit) {
/* Look for one in first longword */
for (res = bit; res < 32; res++)
@@ -434,9 +438,9 @@ static inline unsigned long find_next_bi
/* Bitmap functions for the ext2 filesystem. */
#define ext2_set_bit_atomic(lock, nr, addr) \
- test_and_set_bit_le(nr, (unsigned long *)(addr))
+ test_and_set_bit_le(nr, addr)
#define ext2_clear_bit_atomic(lock, nr, addr) \
- test_and_clear_bit_le(nr, (unsigned long *)(addr))
+ test_and_clear_bit_le(nr, addr)
#endif /* __KERNEL__ */
diff -Nurp linux-v4/arch/m68k/include/asm/bitops_no.h linux-v4-fix/arch/m68k/include/asm/bitops_no.h
--- linux-v4/arch/m68k/include/asm/bitops_no.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/m68k/include/asm/bitops_no.h 2011-01-18 15:40:15.000000000 +0900
@@ -199,10 +199,10 @@ static __inline__ int __test_bit(int nr,
#define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7)
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
static inline int __test_and_set_bit_le(int nr, volatile void *addr)
{
diff -Nurp linux-v4/arch/powerpc/include/asm/bitops.h linux-v4-fix/arch/powerpc/include/asm/bitops.h
--- linux-v4/arch/powerpc/include/asm/bitops.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/powerpc/include/asm/bitops.h 2011-01-18 15:40:15.000000000 +0900
@@ -273,33 +273,33 @@ static __inline__ int fls64(__u64 x)
/* Little-endian versions */
static __inline__ int test_bit_le(unsigned long nr,
- __const__ unsigned long *addr)
+ __const__ void *addr)
{
__const__ unsigned char *tmp = (__const__ unsigned char *) addr;
return (tmp[nr >> 3] >> (nr & 7)) & 1;
}
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define find_first_zero_bit_le(addr, size) \
find_next_zero_bit_le((addr), (size), 0)
-unsigned long find_next_zero_bit_le(const unsigned long *addr,
+unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset);
-unsigned long find_next_bit_le(const unsigned long *addr,
+unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset);
/* Bitmap functions for the ext2 filesystem */
diff -Nurp linux-v4/arch/s390/include/asm/bitops.h linux-v4-fix/arch/s390/include/asm/bitops.h
--- linux-v4/arch/s390/include/asm/bitops.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/arch/s390/include/asm/bitops.h 2011-01-18 15:40:15.000000000 +0900
@@ -743,19 +743,19 @@ static inline int sched_find_first_bit(u
*/
#define __set_bit_le(nr, addr) \
- __set_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
#define test_bit_le(nr, addr) \
- test_bit((nr)^(__BITOPS_WORDSIZE - 8), (addr))
+ test_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)(addr))
static inline int find_first_zero_bit_le(void *vaddr, unsigned int size)
{
@@ -837,10 +837,10 @@ static inline int find_next_bit_le(void
return offset + find_first_bit_le(p, size);
}
-#define ext2_set_bit_atomic(lock, nr, addr) \
- test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define ext2_clear_bit_atomic(lock, nr, addr) \
- test_and_clear_bit_le((nr), (unsigned long *)(addr))
+#define ext2_set_bit_atomic(lock, nr, addr) \
+ test_and_set_bit_le(nr, addr)
+#define ext2_clear_bit_atomic(lock, nr, addr) \
+ test_and_clear_bit_le(nr, addr)
#endif /* __KERNEL__ */
diff -Nurp linux-v4/fs/ext2/ext2.h linux-v4-fix/fs/ext2/ext2.h
--- linux-v4/fs/ext2/ext2.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ext2/ext2.h 2011-01-18 15:40:15.000000000 +0900
@@ -175,13 +175,8 @@ ext2_group_first_block_no(struct super_b
le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block);
}
-#define ext2_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define ext2_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
-#define ext2_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define ext2_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
-#define ext2_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define ext2_set_bit __test_and_set_bit_le
+#define ext2_clear_bit __test_and_clear_bit_le
+#define ext2_test_bit test_bit_le
+#define ext2_find_first_zero_bit find_first_zero_bit_le
+#define ext2_find_next_zero_bit find_next_zero_bit_le
diff -Nurp linux-v4/fs/ext4/ext4.h linux-v4-fix/fs/ext4/ext4.h
--- linux-v4/fs/ext4/ext4.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ext4/ext4.h 2011-01-18 15:40:15.000000000 +0900
@@ -922,20 +922,14 @@ struct ext4_inode_info {
#define test_opt(sb, opt) (EXT4_SB(sb)->s_mount_opt & \
EXT4_MOUNT_##opt)
-#define ext4_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
+#define ext4_set_bit __test_and_set_bit_le
#define ext4_set_bit_atomic ext2_set_bit_atomic
-#define ext4_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
+#define ext4_clear_bit __test_and_clear_bit_le
#define ext4_clear_bit_atomic ext2_clear_bit_atomic
-#define ext4_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define ext4_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
-#define ext4_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
-#define ext4_find_next_bit(addr, size, off) \
- find_next_bit_le((unsigned long *)(addr), (size), (off))
+#define ext4_test_bit test_bit_le
+#define ext4_find_first_zero_bit find_first_zero_bit_le
+#define ext4_find_next_zero_bit find_next_zero_bit_le
+#define ext4_find_next_bit find_next_bit_le
/*
* Maximal mount counts between two filesystem checks
diff -Nurp linux-v4/fs/minix/minix.h linux-v4-fix/fs/minix/minix.h
--- linux-v4/fs/minix/minix.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/minix/minix.h 2011-01-18 15:40:15.000000000 +0900
@@ -154,16 +154,11 @@ static inline int minix_test_bit(int nr,
* little-endian bitmaps
*/
-#define minix_test_and_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define minix_set_bit(nr, addr) \
- __set_bit_le((nr), (unsigned long *)(addr))
-#define minix_test_and_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
-#define minix_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define minix_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
+#define minix_test_and_set_bit __test_and_set_bit_le
+#define minix_set_bit __set_bit_le
+#define minix_test_and_clear_bit __test_and_clear_bit_le
+#define minix_test_bit test_bit_le
+#define minix_find_first_zero_bit find_first_zero_bit_le
#endif
diff -Nurp linux-v4/fs/nilfs2/alloc.h linux-v4-fix/fs/nilfs2/alloc.h
--- linux-v4/fs/nilfs2/alloc.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/nilfs2/alloc.h 2011-01-18 15:40:15.000000000 +0900
@@ -74,8 +74,7 @@ int nilfs_palloc_freev(struct inode *, _
#define nilfs_set_bit_atomic ext2_set_bit_atomic
#define nilfs_clear_bit_atomic ext2_clear_bit_atomic
-#define nilfs_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define nilfs_find_next_zero_bit find_next_zero_bit_le
/*
* persistent object allocator cache
diff -Nurp linux-v4/fs/ocfs2/ocfs2.h linux-v4-fix/fs/ocfs2/ocfs2.h
--- linux-v4/fs/ocfs2/ocfs2.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ocfs2/ocfs2.h 2011-01-18 15:40:15.000000000 +0900
@@ -836,11 +836,8 @@ static inline void _ocfs2_clear_bit(unsi
}
#define ocfs2_clear_bit(bit, addr) _ocfs2_clear_bit((bit), (unsigned long *)(addr))
-#define ocfs2_test_bit(nr, addr) \
- test_bit_le(nr, (unsigned long *)(addr))
-#define ocfs2_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), size, off)
-#define ocfs2_find_next_bit(addr, size, off) \
- find_next_bit_le((unsigned long *)(addr), size, off)
+#define ocfs2_test_bit test_bit_le
+#define ocfs2_find_next_zero_bit find_next_zero_bit_le
+#define ocfs2_find_next_bit find_next_bit_le
#endif /* OCFS2_H */
diff -Nurp linux-v4/fs/udf/balloc.c linux-v4-fix/fs/udf/balloc.c
--- linux-v4/fs/udf/balloc.c 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/udf/balloc.c 2011-01-18 15:40:15.000000000 +0900
@@ -27,14 +27,10 @@
#include "udf_i.h"
#include "udf_sb.h"
-#define udf_clear_bit(nr, addr) \
- __test_and_clear_bit_le(nr, (unsigned long *)(addr))
-#define udf_set_bit(nr, addr) \
- __test_and_set_bit_le(nr, (unsigned long *)(addr))
-#define udf_test_bit(nr, addr) \
- test_bit_le(nr, (unsigned long *)(addr))
-#define udf_find_next_one_bit(addr, size, offset) \
- find_next_bit_le((unsigned long *)(addr), size, offset)
+#define udf_clear_bit __test_and_clear_bit_le
+#define udf_set_bit __test_and_set_bit_le
+#define udf_test_bit test_bit_le
+#define udf_find_next_one_bit find_next_bit_le
static int read_block_bitmap(struct super_block *sb,
struct udf_bitmap *bitmap, unsigned int block,
diff -Nurp linux-v4/fs/ufs/util.h linux-v4-fix/fs/ufs/util.h
--- linux-v4/fs/ufs/util.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/fs/ufs/util.h 2011-01-18 15:40:15.000000000 +0900
@@ -408,7 +408,7 @@ static inline unsigned _ubh_find_next_ze
for (;;) {
count = min_t(unsigned int, size + offset, uspi->s_bpf);
size -= count - offset;
- pos = find_next_zero_bit_le((unsigned long *)ubh->bh[base]->b_data, count, offset);
+ pos = find_next_zero_bit_le(ubh->bh[base]->b_data, count, offset);
if (pos < count || !size)
break;
base++;
diff -Nurp linux-v4/include/asm-generic/bitops/ext2-atomic.h linux-v4-fix/include/asm-generic/bitops/ext2-atomic.h
--- linux-v4/include/asm-generic/bitops/ext2-atomic.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/asm-generic/bitops/ext2-atomic.h 2011-01-18 15:40:15.000000000 +0900
@@ -5,7 +5,7 @@
({ \
int ret; \
spin_lock(lock); \
- ret = __test_and_set_bit_le((nr), (unsigned long *)(addr)); \
+ ret = __test_and_set_bit_le(nr, addr); \
spin_unlock(lock); \
ret; \
})
@@ -14,7 +14,7 @@
({ \
int ret; \
spin_lock(lock); \
- ret = __test_and_clear_bit_le((nr), (unsigned long *)(addr)); \
+ ret = __test_and_clear_bit_le(nr, addr); \
spin_unlock(lock); \
ret; \
})
diff -Nurp linux-v4/include/asm-generic/bitops/le.h linux-v4-fix/include/asm-generic/bitops/le.h
--- linux-v4/include/asm-generic/bitops/le.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/asm-generic/bitops/le.h 2011-01-18 15:40:15.000000000 +0900
@@ -9,19 +9,19 @@
#define BITOP_LE_SWIZZLE 0
#define find_next_zero_bit_le(addr, size, offset) \
- find_next_zero_bit(addr, size, offset)
+ find_next_zero_bit((unsigned long *)(addr), size, offset)
#define find_next_bit_le(addr, size, offset) \
- find_next_bit(addr, size, offset)
+ find_next_bit((unsigned long *)(addr), size, offset)
#define find_first_zero_bit_le(addr, size) \
- find_first_zero_bit(addr, size)
+ find_first_zero_bit((unsigned long *)(addr), size)
#elif defined(__BIG_ENDIAN)
#define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7)
-extern unsigned long find_next_zero_bit_le(const unsigned long *addr,
+extern unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset);
-extern unsigned long find_next_bit_le(const unsigned long *addr,
+extern unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset);
#define find_first_zero_bit_le(addr, size) \
@@ -32,20 +32,20 @@ extern unsigned long find_next_bit_le(co
#endif
#define test_bit_le(nr, addr) \
- test_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __set_bit_le(nr, addr) \
- __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __clear_bit_le(nr, addr) \
- __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_set_bit_le(nr, addr) \
- test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define test_and_clear_bit_le(nr, addr) \
- test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_set_bit_le(nr, addr) \
- __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#define __test_and_clear_bit_le(nr, addr) \
- __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr))
+ __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (unsigned long *)(addr))
#endif /* _ASM_GENERIC_BITOPS_LE_H_ */
diff -Nurp linux-v4/include/linux/ext3_fs.h linux-v4-fix/include/linux/ext3_fs.h
--- linux-v4/include/linux/ext3_fs.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/linux/ext3_fs.h 2011-01-18 15:40:15.000000000 +0900
@@ -418,18 +418,13 @@ struct ext3_inode {
#define EXT2_MOUNT_DATA_FLAGS EXT3_MOUNT_DATA_FLAGS
#endif
-#define ext3_set_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
+#define ext3_set_bit __test_and_set_bit_le
#define ext3_set_bit_atomic ext2_set_bit_atomic
-#define ext3_clear_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
+#define ext3_clear_bit __test_and_clear_bit_le
#define ext3_clear_bit_atomic ext2_clear_bit_atomic
-#define ext3_test_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define ext3_find_first_zero_bit(addr, size) \
- find_first_zero_bit_le((unsigned long *)(addr), (size))
-#define ext3_find_next_zero_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define ext3_test_bit test_bit_le
+#define ext3_find_first_zero_bit find_first_zero_bit_le
+#define ext3_find_next_zero_bit find_next_zero_bit_le
/*
* Maximal mount counts between two filesystem checks
diff -Nurp linux-v4/include/linux/reiserfs_fs.h linux-v4-fix/include/linux/reiserfs_fs.h
--- linux-v4/include/linux/reiserfs_fs.h 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/include/linux/reiserfs_fs.h 2011-01-18 15:40:15.000000000 +0900
@@ -1133,12 +1133,9 @@ struct reiserfs_de_head {
#else
-# define set_bit_unaligned(nr, addr) \
- __test_and_set_bit_le(nr, (unsigned long *)(addr))
-# define clear_bit_unaligned(nr, addr) \
- __test_and_clear_bit_le(nr, (unsigned long *)(addr))
-# define test_bit_unaligned(nr, addr) \
- test_bit_le(nr, (unsigned long *)(addr))
+# define set_bit_unaligned(nr, addr) __test_and_set_bit_le(nr, addr)
+# define clear_bit_unaligned(nr, addr) __test_and_clear_bit_le(nr, addr)
+# define test_bit_unaligned(nr, addr) test_bit_le(nr, addr)
#endif
@@ -2335,14 +2332,10 @@ __u32 keyed_hash(const signed char *msg,
__u32 yura_hash(const signed char *msg, int len);
__u32 r5_hash(const signed char *msg, int len);
-#define reiserfs_test_and_set_le_bit(nr, addr) \
- __test_and_set_bit_le((nr), (unsigned long *)(addr))
-#define reiserfs_test_and_clear_le_bit(nr, addr) \
- __test_and_clear_bit_le((nr), (unsigned long *)(addr))
-#define reiserfs_test_le_bit(nr, addr) \
- test_bit_le((nr), (unsigned long *)(addr))
-#define reiserfs_find_next_zero_le_bit(addr, size, off) \
- find_next_zero_bit_le((unsigned long *)(addr), (size), (off))
+#define reiserfs_test_and_set_le_bit __test_and_set_bit_le
+#define reiserfs_test_and_clear_le_bit __test_and_clear_bit_le
+#define reiserfs_test_le_bit test_bit_le
+#define reiserfs_find_next_zero_le_bit find_next_zero_bit_le
/* sometimes reiserfs_truncate may require to allocate few new blocks
to perform indirect2direct conversion. People probably used to
diff -Nurp linux-v4/lib/find_next_bit.c linux-v4-fix/lib/find_next_bit.c
--- linux-v4/lib/find_next_bit.c 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/lib/find_next_bit.c 2011-01-18 15:40:15.000000000 +0900
@@ -186,15 +186,16 @@ static inline unsigned long ext2_swab(co
#endif
}
-unsigned long find_next_zero_bit_le(const unsigned long *addr, unsigned
+unsigned long find_next_zero_bit_le(const void *addr, unsigned
long size, unsigned long offset)
{
- const unsigned long *p = addr + BITOP_WORD(offset);
+ const unsigned long *p = addr;
unsigned long result = offset & ~(BITS_PER_LONG - 1);
unsigned long tmp;
if (offset >= size)
return size;
+ p += BITOP_WORD(offset);
size -= result;
offset &= (BITS_PER_LONG - 1UL);
if (offset) {
@@ -229,15 +230,16 @@ found_middle_swap:
}
EXPORT_SYMBOL(find_next_zero_bit_le);
-unsigned long find_next_bit_le(const unsigned long *addr, unsigned
+unsigned long find_next_bit_le(const void *addr, unsigned
long size, unsigned long offset)
{
- const unsigned long *p = addr + BITOP_WORD(offset);
+ const unsigned long *p = addr;
unsigned long result = offset & ~(BITS_PER_LONG - 1);
unsigned long tmp;
if (offset >= size)
return size;
+ p += BITOP_WORD(offset);
size -= result;
offset &= (BITS_PER_LONG - 1UL);
if (offset) {
diff -Nurp linux-v4/net/rds/cong.c linux-v4-fix/net/rds/cong.c
--- linux-v4/net/rds/cong.c 2011-01-17 19:53:07.000000000 +0900
+++ linux-v4-fix/net/rds/cong.c 2011-01-18 15:40:15.000000000 +0900
@@ -33,6 +33,7 @@
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/rbtree.h>
+#include <linux/bitops.h>
#include "rds.h"
next prev parent reply other threads:[~2011-01-18 9:49 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-16 13:08 [PATCH v4 00/24] Introduce little endian bitops Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 01/24] bitops: merge little and big endian definisions in asm-generic/bitops/le.h Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 02/24] asm-generic: rename generic little-endian bitops functions Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 03/24] powerpc: introduce little-endian bitops Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 04/24] s390: " Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 05/24] arm: " Akinobu Mita
2011-01-16 17:51 ` Russell King
2011-01-16 17:51 ` Russell King
2011-01-17 2:36 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 06/24] m68k: " Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 07/24] bitops: introduce CONFIG_GENERIC_FIND_BIT_LE Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 08/24] m68knommu: introduce little-endian bitops Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 09/24] bitops: introduce little-endian bitops for most architectures Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 21:18 ` H. Peter Anvin
2011-01-17 10:01 ` Hans-Christian Egtvedt
2011-01-17 10:01 ` Hans-Christian Egtvedt
2011-01-16 13:08 ` [PATCH v4 10/24] rds: stop including asm-generic/bitops/le.h Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 11/24] kvm: " Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 12/24] asm-generic: use little-endian bitops Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 13/24] ext3: " Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 14/24] ext4: " Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 15/24] ocfs2: " Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 16/24] nilfs2: " Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 17/24] reiserfs: " Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 18/24] udf: " Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 19/24] ufs: " Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 20/24] md: use little-endian bit operations Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 21/24] dm: " Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 22/24] bitops: remove ext2 non-atomic bitops from asm/bitops.h Akinobu Mita
2011-01-16 13:08 ` Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 23/24] m68k: remove inline asm from minix_find_first_zero_bit Akinobu Mita
2011-01-16 13:08 ` [PATCH v4 24/24] bitops: remove minix bitops from asm/bitops.h Akinobu Mita
2011-01-16 18:57 ` [PATCH v4 00/24] Introduce little endian bitops Linus Torvalds
2011-01-16 18:57 ` Linus Torvalds
2011-01-17 2:37 ` Akinobu Mita
2011-01-17 2:50 ` Linus Torvalds
2011-01-17 9:34 ` Russell King
2011-01-17 9:34 ` Russell King
2011-01-18 9:49 ` Akinobu Mita [this message]
2011-01-18 9:49 ` Akinobu Mita
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AANLkTiki4wk9dkd2J93FKJTOdcWUrXSLNv0KPR1gMEYk@mail.gmail.com \
--to=akinobu.mita@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).