[PATCH] bitops: use non atomic operations for minix_*_bit() and ext2_*_bit()
authorAkinobu Mita <mita@miraclelinux.com>
Sun, 26 Mar 2006 09:39:05 +0000 (01:39 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 26 Mar 2006 16:57:10 +0000 (08:57 -0800)
Bitmap functions for the minix filesystem and the ext2 filesystem except
ext2_set_bit_atomic() and ext2_clear_bit_atomic() do not require the atomic
guarantees.

But these are defined by using atomic bit operations on several architectures.
 (cris, frv, h8300, ia64, m32r, m68k, m68knommu, mips, s390, sh, sh64, sparc,
sparc64, v850, and xtensa)

This patch switches to non atomic bit operation.

Signed-off-by: Akinobu Mita <mita@miraclelinux.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
15 files changed:
include/asm-cris/bitops.h
include/asm-frv/bitops.h
include/asm-h8300/bitops.h
include/asm-ia64/bitops.h
include/asm-m32r/bitops.h
include/asm-m68k/bitops.h
include/asm-m68knommu/bitops.h
include/asm-mips/bitops.h
include/asm-s390/bitops.h
include/asm-sh/bitops.h
include/asm-sh64/bitops.h
include/asm-sparc/bitops.h
include/asm-sparc64/bitops.h
include/asm-v850/bitops.h
include/asm-xtensa/bitops.h

index f8a6747693148350c3cce205b29bf82f6fa0a5f6..b1fca1fd8a5fd752e8f8b30e44b9e6ea93b7375e 100644 (file)
@@ -352,17 +352,17 @@ found_middle:
 #define find_first_bit(addr, size) \
         find_next_bit((addr), (size), 0)
 
-#define ext2_set_bit                 test_and_set_bit
+#define ext2_set_bit                 __test_and_set_bit
 #define ext2_set_bit_atomic(l,n,a)   test_and_set_bit(n,a)
-#define ext2_clear_bit               test_and_clear_bit
+#define ext2_clear_bit               __test_and_clear_bit
 #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
 #define ext2_test_bit                test_bit
 #define ext2_find_first_zero_bit     find_first_zero_bit
 #define ext2_find_next_zero_bit      find_next_zero_bit
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
index f686b519878ed34ed5f557d1e40014f869116e53..9c5db5c34c1b341f535d0bd3482888fb1a1801dd 100644 (file)
@@ -259,11 +259,11 @@ static inline int sched_find_first_bit(const unsigned long *b)
 #define hweight16(x) generic_hweight16(x)
 #define hweight8(x) generic_hweight8(x)
 
-#define ext2_set_bit(nr, addr)         test_and_set_bit  ((nr) ^ 0x18, (addr))
-#define ext2_clear_bit(nr, addr)       test_and_clear_bit((nr) ^ 0x18, (addr))
+#define ext2_set_bit(nr, addr)         __test_and_set_bit  ((nr) ^ 0x18, (addr))
+#define ext2_clear_bit(nr, addr)       __test_and_clear_bit((nr) ^ 0x18, (addr))
 
-#define ext2_set_bit_atomic(lock,nr,addr)      ext2_set_bit((nr), addr)
-#define ext2_clear_bit_atomic(lock,nr,addr)    ext2_clear_bit((nr), addr)
+#define ext2_set_bit_atomic(lock,nr,addr)      test_and_set_bit  ((nr) ^ 0x18, (addr))
+#define ext2_clear_bit_atomic(lock,nr,addr)    test_and_clear_bit((nr) ^ 0x18, (addr))
 
 static inline int ext2_test_bit(int nr, const volatile void * addr)
 {
@@ -331,9 +331,9 @@ found_middle:
 }
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit(nr,addr)                ext2_set_bit(nr,addr)
-#define minix_set_bit(nr,addr)                 ext2_set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr)      ext2_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr)                __test_and_set_bit  ((nr) ^ 0x18, (addr))
+#define minix_set_bit(nr,addr)                 __set_bit((nr) ^ 0x18, (addr))
+#define minix_test_and_clear_bit(nr,addr)      __test_and_clear_bit((nr) ^ 0x18, (addr))
 #define minix_test_bit(nr,addr)                        ext2_test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size)   ext2_find_first_zero_bit(addr,size)
 
index ff7c2b7215946a37fc8fc11eb9c2f29750d1f963..af95f914e51cfdf132aecf36930544f92fddffff 100644 (file)
@@ -397,9 +397,9 @@ found_middle:
 }
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
index 36d0fb95ea89dc5113919f03cc0dde9896a6efeb..eccb01c79c1aad6e1d679c58dee0fea3a60bda90 100644 (file)
@@ -394,18 +394,18 @@ extern int __find_next_bit(const void *addr, unsigned long size,
 
 #define __clear_bit(nr, addr)          clear_bit(nr, addr)
 
-#define ext2_set_bit                   test_and_set_bit
+#define ext2_set_bit                   __test_and_set_bit
 #define ext2_set_bit_atomic(l,n,a)     test_and_set_bit(n,a)
-#define ext2_clear_bit                 test_and_clear_bit
+#define ext2_clear_bit                 __test_and_clear_bit
 #define ext2_clear_bit_atomic(l,n,a)   test_and_clear_bit(n,a)
 #define ext2_test_bit                  test_bit
 #define ext2_find_first_zero_bit       find_first_zero_bit
 #define ext2_find_next_zero_bit                find_next_zero_bit
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit(nr,addr)                test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr)                 set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr)      test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr)                __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr)                 __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr)      __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr)                        test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size)   find_first_zero_bit(addr,size)
 
index abea2fdd868971bd1ae499a56e2aa4f58441fbed..f8e993e0bbc05fa2bff22dc0a8579c09f17b7531 100644 (file)
@@ -575,7 +575,7 @@ found_middle:
  */
 
 #ifdef __LITTLE_ENDIAN__
-#define ext2_set_bit                   test_and_set_bit
+#define ext2_set_bit                   __test_and_set_bit
 #define ext2_clear_bit                 __test_and_clear_bit
 #define ext2_test_bit                  test_bit
 #define ext2_find_first_zero_bit       find_first_zero_bit
index 13f4c00484632b0a396c4b3ecf14e5b40251ca84..b7955b39d963bed449b98ddb93d6547e8148a2d6 100644 (file)
@@ -365,9 +365,9 @@ static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size)
        return ((p - addr) << 4) + (res ^ 31);
 }
 
-#define minix_test_and_set_bit(nr, addr)       test_and_set_bit((nr) ^ 16, (unsigned long *)(addr))
-#define minix_set_bit(nr,addr)                 set_bit((nr) ^ 16, (unsigned long *)(addr))
-#define minix_test_and_clear_bit(nr, addr)     test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr))
+#define minix_test_and_set_bit(nr, addr)       __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr))
+#define minix_set_bit(nr,addr)                 __set_bit((nr) ^ 16, (unsigned long *)(addr))
+#define minix_test_and_clear_bit(nr, addr)     __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr))
 
 static inline int minix_test_bit(int nr, const void *vaddr)
 {
@@ -377,9 +377,9 @@ static inline int minix_test_bit(int nr, const void *vaddr)
 
 /* Bitmap functions for the ext2 filesystem. */
 
-#define ext2_set_bit(nr, addr)                 test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
+#define ext2_set_bit(nr, addr)                 __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
 #define ext2_set_bit_atomic(lock, nr, addr)    test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
-#define ext2_clear_bit(nr, addr)               test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
+#define ext2_clear_bit(nr, addr)               __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
 #define ext2_clear_bit_atomic(lock, nr, addr)  test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
 
 static inline int ext2_test_bit(int nr, const void *vaddr)
index 25d8a3cfef90a385e88a5ee4c5b05910301ffaac..00c4a2548e608f51141c0435068866e31f6d2e5c 100644 (file)
@@ -476,9 +476,9 @@ found_middle:
 }
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
index 8e802059fe67d5a5016795d3d7ea1d00e127bf1f..0e83abc829d480fd1ae0750d4fca7223c814e47f 100644 (file)
@@ -962,9 +962,9 @@ found_middle:
  * FIXME: These assume that Minix uses the native byte/bitorder.
  * This limits the Minix filesystem's value for data exchange very much.
  */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
index 3628899f48bb34c45a17a45120e4b3acf47f846a..6b6a01dfc8dc2082ff638f0917503b2a9325560a 100644 (file)
@@ -871,11 +871,11 @@ static inline int sched_find_first_bit(unsigned long *b)
  */
 
 #define ext2_set_bit(nr, addr)       \
-       test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
+       __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
 #define ext2_set_bit_atomic(lock, nr, addr)       \
        test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
 #define ext2_clear_bit(nr, addr)     \
-       test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
+       __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
 #define ext2_clear_bit_atomic(lock, nr, addr)     \
        test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
 #define ext2_test_bit(nr, addr)      \
@@ -1014,11 +1014,11 @@ ext2_find_next_zero_bit(void *vaddr, unsigned long size, unsigned long offset)
 /* Bitmap functions for the minix filesystem.  */
 /* FIXME !!! */
 #define minix_test_and_set_bit(nr,addr) \
-       test_and_set_bit(nr,(unsigned long *)addr)
+       __test_and_set_bit(nr,(unsigned long *)addr)
 #define minix_set_bit(nr,addr) \
-       set_bit(nr,(unsigned long *)addr)
+       __set_bit(nr,(unsigned long *)addr)
 #define minix_test_and_clear_bit(nr,addr) \
-       test_and_clear_bit(nr,(unsigned long *)addr)
+       __test_and_clear_bit(nr,(unsigned long *)addr)
 #define minix_test_bit(nr,addr) \
        test_bit(nr,(unsigned long *)addr)
 #define minix_find_first_zero_bit(addr,size) \
index 1c526086004543db2afff93f9bed227a1366aecc..f8d504e7d9d6b64c14cee622e062d6058b35b334 100644 (file)
@@ -339,8 +339,8 @@ static inline int sched_find_first_bit(const unsigned long *b)
 }
 
 #ifdef __LITTLE_ENDIAN__
-#define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr))
-#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr))
+#define ext2_set_bit(nr, addr) __test_and_set_bit((nr), (addr))
+#define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr))
 #define ext2_test_bit(nr, addr) test_bit((nr), (addr))
 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size))
 #define ext2_find_next_zero_bit(addr, size, offset) \
@@ -349,30 +349,24 @@ static inline int sched_find_first_bit(const unsigned long *b)
 static __inline__ int ext2_set_bit(int nr, volatile void * addr)
 {
        int             mask, retval;
-       unsigned long   flags;
        volatile unsigned char  *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
-       local_irq_save(flags);
        retval = (mask & *ADDR) != 0;
        *ADDR |= mask;
-       local_irq_restore(flags);
        return retval;
 }
 
 static __inline__ int ext2_clear_bit(int nr, volatile void * addr)
 {
        int             mask, retval;
-       unsigned long   flags;
        volatile unsigned char  *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
-       local_irq_save(flags);
        retval = (mask & *ADDR) != 0;
        *ADDR &= ~mask;
-       local_irq_restore(flags);
        return retval;
 }
 
@@ -459,9 +453,9 @@ found_middle:
        })
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
index ce9c3ad45fe027ba8756ba6ab037981313ed347c..5622b1a50cb1848a8a4df7abc656b6ef4f9a8670 100644 (file)
@@ -382,8 +382,8 @@ static inline int sched_find_first_bit(unsigned long *b)
 #define hweight8(x) generic_hweight8(x)
 
 #ifdef __LITTLE_ENDIAN__
-#define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr))
-#define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr))
+#define ext2_set_bit(nr, addr) __test_and_set_bit((nr), (addr))
+#define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr), (addr))
 #define ext2_test_bit(nr, addr) test_bit((nr), (addr))
 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size))
 #define ext2_find_next_zero_bit(addr, size, offset) \
@@ -392,30 +392,24 @@ static inline int sched_find_first_bit(unsigned long *b)
 static __inline__ int ext2_set_bit(int nr, volatile void * addr)
 {
        int             mask, retval;
-       unsigned long   flags;
        volatile unsigned char  *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
-       local_irq_save(flags);
        retval = (mask & *ADDR) != 0;
        *ADDR |= mask;
-       local_irq_restore(flags);
        return retval;
 }
 
 static __inline__ int ext2_clear_bit(int nr, volatile void * addr)
 {
        int             mask, retval;
-       unsigned long   flags;
        volatile unsigned char  *ADDR = (unsigned char *) addr;
 
        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
-       local_irq_save(flags);
        retval = (mask & *ADDR) != 0;
        *ADDR &= ~mask;
-       local_irq_restore(flags);
        return retval;
 }
 
@@ -502,9 +496,9 @@ found_middle:
        })
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
 
index 41722b5e45ef02da75ec02d35eed5c90ac7f8a91..f25109d62032bbed3de6651d1bd710ec23f2dcff 100644 (file)
@@ -523,11 +523,11 @@ found_middle:
 
 /* Bitmap functions for the minix filesystem.  */
 #define minix_test_and_set_bit(nr,addr)        \
-       test_and_set_bit((nr),(unsigned long *)(addr))
+       __test_and_set_bit((nr),(unsigned long *)(addr))
 #define minix_set_bit(nr,addr)         \
-       set_bit((nr),(unsigned long *)(addr))
+       __set_bit((nr),(unsigned long *)(addr))
 #define minix_test_and_clear_bit(nr,addr) \
-       test_and_clear_bit((nr),(unsigned long *)(addr))
+       __test_and_clear_bit((nr),(unsigned long *)(addr))
 #define minix_test_bit(nr,addr)                \
        test_bit((nr),(unsigned long *)(addr))
 #define minix_find_first_zero_bit(addr,size) \
index 6efc0162fb09b8e2fa6beb9de1eb5ebfc4ffdf15..2361f8736498f7c2623a727c02c8c50c2904b1c9 100644 (file)
@@ -280,11 +280,11 @@ extern unsigned long find_next_zero_le_bit(unsigned long *, unsigned long, unsig
 
 /* Bitmap functions for the minix filesystem.  */
 #define minix_test_and_set_bit(nr,addr)        \
-       test_and_set_bit((nr),(unsigned long *)(addr))
+       __test_and_set_bit((nr),(unsigned long *)(addr))
 #define minix_set_bit(nr,addr) \
-       set_bit((nr),(unsigned long *)(addr))
+       __set_bit((nr),(unsigned long *)(addr))
 #define minix_test_and_clear_bit(nr,addr) \
-       test_and_clear_bit((nr),(unsigned long *)(addr))
+       __test_and_clear_bit((nr),(unsigned long *)(addr))
 #define minix_test_bit(nr,addr)        \
        test_bit((nr),(unsigned long *)(addr))
 #define minix_find_first_zero_bit(addr,size) \
index 609b9e87222a41c3594014e4f585d6a88333af79..44d596e792e76b9dbcf4290d9624aa0029408cf4 100644 (file)
@@ -336,18 +336,18 @@ static inline int sched_find_first_bit(unsigned long *b)
 #define hweight16(x)                   generic_hweight16 (x)
 #define hweight8(x)                    generic_hweight8 (x)
 
-#define ext2_set_bit                   test_and_set_bit
+#define ext2_set_bit                   __test_and_set_bit
 #define ext2_set_bit_atomic(l,n,a)      test_and_set_bit(n,a)
-#define ext2_clear_bit                 test_and_clear_bit
+#define ext2_clear_bit                 __test_and_clear_bit
 #define ext2_clear_bit_atomic(l,n,a)    test_and_clear_bit(n,a)
 #define ext2_test_bit                  test_bit
 #define ext2_find_first_zero_bit       find_first_zero_bit
 #define ext2_find_next_zero_bit                find_next_zero_bit
 
 /* Bitmap functions for the minix filesystem.  */
-#define minix_test_and_set_bit         test_and_set_bit
-#define minix_set_bit                  set_bit
-#define minix_test_and_clear_bit       test_and_clear_bit
+#define minix_test_and_set_bit         __test_and_set_bit
+#define minix_set_bit                  __set_bit
+#define minix_test_and_clear_bit       __test_and_clear_bit
 #define minix_test_bit                         test_bit
 #define minix_find_first_zero_bit      find_first_zero_bit
 
index 0a2065f1a372dc8619bfa3cbc6924b7b0c8fb2b2..50b83726a497474abf2cce3b985543653924ce1d 100644 (file)
@@ -436,9 +436,9 @@ static inline int sched_find_first_bit(const unsigned long *b)
 
 /* Bitmap functions for the minix filesystem.  */
 
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr)
+#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) __set_bit(nr,addr)
+#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr)
 #define minix_test_bit(nr,addr) test_bit(nr,addr)
 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)