diff options
| author | Akinobu Mita <akinobu.mita@gmail.com> | 2011-03-23 19:42:16 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-23 22:46:22 -0400 |
| commit | 61f2e7b0f474225b4226772830ae4b29a3a21f8d (patch) | |
| tree | 52f880fe6feec8efe5e5e028a3e0637629a500b7 /fs/minix | |
| parent | 3fca5af7860f87eb2cd706c2d7dda4ad03230a07 (diff) | |
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 <akinobu.mita@gmail.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Andreas Schwab <schwab@linux-m68k.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Michal Simek <monstr@monstr.eu>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Cc: Chris Zankel <chris@zankel.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/minix')
| -rw-r--r-- | fs/minix/Kconfig | 8 | ||||
| -rw-r--r-- | fs/minix/minix.h | 74 |
2 files changed, 82 insertions, 0 deletions
diff --git a/fs/minix/Kconfig b/fs/minix/Kconfig index 0fd7ca994264..6624684dd5de 100644 --- a/fs/minix/Kconfig +++ b/fs/minix/Kconfig | |||
| @@ -15,3 +15,11 @@ config MINIX_FS | |||
| 15 | module will be called minix. Note that the file system of your root | 15 | module will be called minix. Note that the file system of your root |
| 16 | partition (the one containing the directory /) cannot be compiled as | 16 | partition (the one containing the directory /) cannot be compiled as |
| 17 | a module. | 17 | a module. |
| 18 | |||
| 19 | config MINIX_FS_NATIVE_ENDIAN | ||
| 20 | def_bool MINIX_FS | ||
| 21 | depends on H8300 || M32R || MICROBLAZE || MIPS || S390 || SUPERH || SPARC || XTENSA || (M68K && !MMU) | ||
| 22 | |||
| 23 | config MINIX_FS_BIG_ENDIAN_16BIT_INDEXED | ||
| 24 | def_bool MINIX_FS | ||
| 25 | depends on M68K && MMU | ||
diff --git a/fs/minix/minix.h b/fs/minix/minix.h index 407b1c84911e..341e2122879a 100644 --- a/fs/minix/minix.h +++ b/fs/minix/minix.h | |||
| @@ -88,4 +88,78 @@ static inline struct minix_inode_info *minix_i(struct inode *inode) | |||
| 88 | return list_entry(inode, struct minix_inode_info, vfs_inode); | 88 | return list_entry(inode, struct minix_inode_info, vfs_inode); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | #if defined(CONFIG_MINIX_FS_NATIVE_ENDIAN) && \ | ||
| 92 | defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED) | ||
| 93 | |||
| 94 | #error Minix file system byte order broken | ||
| 95 | |||
| 96 | #elif defined(CONFIG_MINIX_FS_NATIVE_ENDIAN) | ||
| 97 | |||
| 98 | /* | ||
| 99 | * big-endian 32 or 64 bit indexed bitmaps on big-endian system or | ||
| 100 | * little-endian bitmaps on little-endian system | ||
| 101 | */ | ||
| 102 | |||
| 103 | #define minix_test_and_set_bit(nr, addr) \ | ||
| 104 | __test_and_set_bit((nr), (unsigned long *)(addr)) | ||
| 105 | #define minix_set_bit(nr, addr) \ | ||
| 106 | __set_bit((nr), (unsigned long *)(addr)) | ||
| 107 | #define minix_test_and_clear_bit(nr, addr) \ | ||
| 108 | __test_and_clear_bit((nr), (unsigned long *)(addr)) | ||
| 109 | #define minix_test_bit(nr, addr) \ | ||
| 110 | test_bit((nr), (unsigned long *)(addr)) | ||
| 111 | #define minix_find_first_zero_bit(addr, size) \ | ||
| 112 | find_first_zero_bit((unsigned long *)(addr), (size)) | ||
| 113 | |||
| 114 | #elif defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED) | ||
| 115 | |||
| 116 | /* | ||
| 117 | * big-endian 16bit indexed bitmaps | ||
| 118 | */ | ||
| 119 | |||
| 120 | static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size) | ||
| 121 | { | ||
| 122 | const unsigned short *p = vaddr, *addr = vaddr; | ||
| 123 | unsigned short num; | ||
| 124 | |||
| 125 | if (!size) | ||
| 126 | return 0; | ||
| 127 | |||
| 128 | size = (size >> 4) + ((size & 15) > 0); | ||
| 129 | while (*p++ == 0xffff) { | ||
| 130 | if (--size == 0) | ||
| 131 | return (p - addr) << 4; | ||
| 132 | } | ||
| 133 | |||
| 134 | num = *--p; | ||
| 135 | return ((p - addr) << 4) + ffz(num); | ||
| 136 | } | ||
| 137 | |||
| 138 | #define minix_test_and_set_bit(nr, addr) \ | ||
| 139 | __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) | ||
| 140 | #define minix_set_bit(nr, addr) \ | ||
| 141 | __set_bit((nr) ^ 16, (unsigned long *)(addr)) | ||
| 142 | #define minix_test_and_clear_bit(nr, addr) \ | ||
| 143 | __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) | ||
| 144 | |||
| 145 | static inline int minix_test_bit(int nr, const void *vaddr) | ||
| 146 | { | ||
| 147 | const unsigned short *p = vaddr; | ||
| 148 | return (p[nr >> 4] & (1U << (nr & 15))) != 0; | ||
| 149 | } | ||
| 150 | |||
| 151 | #else | ||
| 152 | |||
| 153 | /* | ||
| 154 | * little-endian bitmaps | ||
| 155 | */ | ||
| 156 | |||
| 157 | #define minix_test_and_set_bit __test_and_set_bit_le | ||
| 158 | #define minix_set_bit __set_bit_le | ||
| 159 | #define minix_test_and_clear_bit __test_and_clear_bit_le | ||
| 160 | #define minix_test_bit test_bit_le | ||
| 161 | #define minix_find_first_zero_bit find_first_zero_bit_le | ||
| 162 | |||
| 163 | #endif | ||
| 164 | |||
| 91 | #endif /* FS_MINIX_H */ | 165 | #endif /* FS_MINIX_H */ |
