bitops: remove minix bitops from asm/bitops.h

minix bit operations are only used by minix filesystem and useless by
other modules.  Because byte order of inode and block bitmaps is different
on each architecture like below:

m68k:
	big-endian 16bit indexed bitmaps

h8300, microblaze, s390, sparc, m68knommu:
	big-endian 32 or 64bit indexed bitmaps

m32r, mips, sh, xtensa:
	big-endian 32 or 64bit indexed bitmaps for big-endian mode
	little-endian bitmaps for little-endian mode

Others:
	little-endian bitmaps

In order to move minix bit operations from asm/bitops.h to architecture
independent code in minix filesystem, this provides two config options.

CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED is only selected by m68k.
CONFIG_MINIX_FS_NATIVE_ENDIAN is selected by the architectures which use
native byte order bitmaps (h8300, microblaze, s390, sparc, m68knommu,
m32r, mips, sh, xtensa).  The architectures which always use little-endian
bitmaps do not select these options.

Finally, we can remove minix bit operations from asm/bitops.h for all
architectures.

Signed-off-by: Akinobu Mita <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
Acked-by: Greg Ungerer <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Roman Zippel <[email protected]>
Cc: Andreas Schwab <[email protected]>
Cc: Martin Schwidefsky <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Yoshinori Sato <[email protected]>
Cc: Michal Simek <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Hirokazu Takata <[email protected]>
Acked-by: Ralf Baechle <[email protected]>
Acked-by: Paul Mundt <[email protected]>
Cc: Chris Zankel <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
Akinobu Mita 2011-03-23 16:42:16 -07:00 • committed by Linus Torvalds
commit 61f2e7b0f4
27 changed files with 82 additions and 110 deletions

View file

@ -15,3 +15,11 @@ config MINIX_FS
module will be called minix. Note that the file system of your root
partition (the one containing the directory /) cannot be compiled as
a module.
config MINIX_FS_NATIVE_ENDIAN
def_bool MINIX_FS
depends on H8300 || M32R || MICROBLAZE || MIPS || S390 || SUPERH || SPARC || XTENSA || (M68K && !MMU)
config MINIX_FS_BIG_ENDIAN_16BIT_INDEXED
def_bool MINIX_FS
depends on M68K && MMU

View file

@ -88,4 +88,78 @@ static inline struct minix_inode_info *minix_i(struct inode *inode)
return list_entry(inode, struct minix_inode_info, vfs_inode);
}
#if defined(CONFIG_MINIX_FS_NATIVE_ENDIAN) && \
defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED)
#error Minix file system byte order broken
#elif defined(CONFIG_MINIX_FS_NATIVE_ENDIAN)
/*
* big-endian 32 or 64 bit indexed bitmaps on big-endian system or
* little-endian bitmaps on little-endian system
*/
#define minix_test_and_set_bit(nr, addr) \
__test_and_set_bit((nr), (unsigned long *)(addr))
#define minix_set_bit(nr, addr) \
__set_bit((nr), (unsigned long *)(addr))
#define minix_test_and_clear_bit(nr, 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) \
find_first_zero_bit((unsigned long *)(addr), (size))
#elif defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED)
/*
* big-endian 16bit indexed bitmaps
*/
static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size)
{
const unsigned short *p = vaddr, *addr = vaddr;
unsigned short num;
if (!size)
return 0;
size = (size >> 4) + ((size & 15) > 0);
while (*p++ == 0xffff) {
if (--size == 0)
return (p - addr) << 4;
}
num = *--p;
return ((p - addr) << 4) + ffz(num);
}
#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)
{
const unsigned short *p = vaddr;
return (p[nr >> 4] & (1U << (nr & 15))) != 0;
}
#else
/*
* little-endian bitmaps
*/
#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
#endif /* FS_MINIX_H */