bitops.h revision ac493821ea0af9767a4c0f21a322133494bcdc48
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * bitops.h --- Bitmap frobbing code.  The byte swapping routines are
350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * 	also included here.
43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o *
721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %Begin-Header%
821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * This file may be redistributed under the terms of the GNU Public
921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * License.
1021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %End-Header%
113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
1221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * i386 bitops operations taken from <asm/bitops.h>, Copyright 1992,
1321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Linus Torvalds.
143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'oextern int ext2fs_set_bit(int nr,void * addr);
1874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'oextern int ext2fs_clear_bit(int nr, void * addr);
1974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'oextern int ext2fs_test_bit(int nr, const void * addr);
2050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern __u16 ext2fs_swab16(__u16 val);
2150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern __u32 ext2fs_swab32(__u32 val);
223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * EXT2FS bitmap manipulation routines.
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* Support for sending warning messages from the inline subroutines */
283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_block_string;
293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_inode_string;
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_mark_string;
313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_unmark_string;
323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_test_string;
33f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg,
34f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o			       const char *description);
351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap,
361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				int code, unsigned long arg);
37f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
3828ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'oextern int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
3928ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'oextern int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
40f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       blk_t block);
41f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
42f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
4331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode);
4428ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'oextern int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
4531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				       ext2_ino_t inode);
4631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode);
473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
4850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
4950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					  blk_t block);
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block);
5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					 blk_t block);
5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
5631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					  ext2_ino_t inode);
5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
5831dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					    ext2_ino_t inode);
5950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
6031dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					 ext2_ino_t inode);
6150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap);
6231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap);
6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap);
6431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap);
6521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
6621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
6721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					   blk_t block, int num);
6821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
6921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					     blk_t block, int num);
7021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
7121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					  blk_t block, int num);
7221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
7321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						blk_t block, int num);
7421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
7521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						  blk_t block, int num);
7621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
7721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					       blk_t block, int num);
78fff876b7c7716d5eef713101e47bff15edb9d9a9Theodore Ts'oextern void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map);
7950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The inline routines themselves...
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * If NO_INLINE_FUNCS is defined, then we won't try to do inline
8450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * functions at all; they will be included as normal functions in
8550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * inline.c
863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
8750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef NO_INLINE_FUNCS
885953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \
895953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o			   defined(__i586__) || defined(__mc68000__) || \
905953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o			   defined(__sparc__)))
9150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	/* This prevents bitops.c from trying to include the C */
9250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	/* function version of these functions */
9350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
9450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
9550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* NO_INLINE_FUNCS */
9650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#ifdef INCLUDE_INLINE_FUNCS
993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern
1003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#else
10176f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#ifdef __GNUC__
1023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern __inline__
10376f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#else				/* For Watcom C */
10476f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#define _INLINE_ extern inline
10576f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#endif
1063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
1073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
108ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \
109ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o     (defined(__i386__) || defined(__i486__) || defined(__i586__)))
110f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
111f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
1129ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o#define _EXT2_HAVE_ASM_SWAB_
113ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#define _EXT2_HAVE_ASM_FINDBIT_
1149ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o
1153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
1163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * These are done by inline assembly for speed reasons.....
1173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
1183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * All bitoperations return 0 if the bit was cleared before the
1193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * operation and != 0 if it was not.  Bit 0 is the LSB of addr; bit 32
1203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * is the LSB of (addr+1).
1213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
1223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
1243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Some hacks to defeat gcc over-optimizations..
1253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
1263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct __dummy_h { unsigned long a[100]; };
12774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define EXT2FS_ADDR (*(struct __dummy_h *) addr)
12874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define EXT2FS_CONST_ADDR (*(const struct __dummy_h *) addr)
1293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
13074becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_set_bit(int nr, void * addr)
1313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0"
13574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o		:"=r" (oldbit),"=m" (EXT2FS_ADDR)
1363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"r" (nr));
1373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
14074becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
1413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0"
14574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o		:"=r" (oldbit),"=m" (EXT2FS_ADDR)
1463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"r" (nr));
1473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
15074becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
1513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0"
1553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"=r" (oldbit)
15674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o		:"m" (EXT2FS_CONST_ADDR),"r" (nr));
1573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
160ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#ifndef C_VERSIONS
161ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_first_bit_set(void * addr, unsigned size)
162ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
163ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int d0, d1, d2;
164ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int res;
165ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
166ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (!size)
167ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return 0;
168ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	/* This looks at memory. Mark it volatile to tell gcc not to move it around */
169ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	__asm__ __volatile__(
170ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"cld\n\t"
171ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"xorl %%eax,%%eax\n\t"
172ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"xorl %%edx,%%edx\n\t"
173ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"repe; scasl\n\t"
174ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"je 1f\n\t"
175ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"movl -4(%%edi),%%eax\n\t"
176ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"subl $4,%%edi\n\t"
177ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"bsfl %%eax,%%edx\n"
178ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"1:\tsubl %%ebx,%%edi\n\t"
179ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"shll $3,%%edi\n\t"
180ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"addl %%edi,%%edx"
181ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		:"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2)
182ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		:"1" ((size + 31) >> 5), "2" (addr), "b" (addr));
183ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return res;
184ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
185ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
186ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_next_bit_set (void * addr, int size, int offset)
187ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
188ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
189ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int set = 0, bit = offset & 31, res;
190ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
191ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (bit) {
192ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		/*
193ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		 * Look for zero in first byte
194ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		 */
195ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		__asm__("bsfl %1,%0\n\t"
196ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			"jne 1f\n\t"
197ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			"movl $32, %0\n"
198ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			"1:"
199ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			: "=r" (set)
200ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			: "r" (*p >> bit));
201ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		if (set < (32 - bit))
202ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			return set + offset;
203ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		set = 32 - bit;
204ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		p++;
205ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
206ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	/*
207ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	 * No bit found yet, search remaining full bytes for a bit
208ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	 */
209ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	res = ext2fs_find_first_bit_set(p, size - 32 * (p - (unsigned long *) addr));
210ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return (offset + set + res);
211ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
212ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#endif
213ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
2145df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o#ifdef EXT2FS_ENABLE_SWAPFS
2159ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o_INLINE_ __u32 ext2fs_swab32(__u32 val)
2169ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o{
2179ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o#ifdef EXT2FS_REQUIRE_486
2189ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o	__asm__("bswap %0" : "=r" (val) : "0" (val));
2199ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o#else
2209ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o	__asm__("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/
2219ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		"rorl $16,%0\n\t"	/* swap words		*/
2229ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		"xchgb %b0,%h0"		/* swap higher bytes	*/
2239ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		:"=q" (val)
2249ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		: "0" (val));
2259ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o#endif
2269ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o	return val;
2279ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o}
2289ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o
2299ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o_INLINE_ __u16 ext2fs_swab16(__u16 val)
2309ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o{
2319ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o	__asm__("xchgb %b0,%h0"		/* swap bytes		*/ \
2329ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		: "=q" (val) \
2339ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		:  "0" (val)); \
2349ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o		return val;
2359ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o}
2365df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o#endif
2379ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o
23874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#undef EXT2FS_ADDR
2393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif	/* i386 */
2413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
242f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#ifdef __mc68000__
243f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
244f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
245f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
24674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_set_bit(int nr,void * addr)
247f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
248f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
249f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
250f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0"
2517f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
252f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
253f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
254f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
255f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
25674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
257f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
258f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
259f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
260f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0"
2617f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
262f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
263f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
264f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
265f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
26674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
267f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
268f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
269f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
270f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0"
2717f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
272f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
273f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
274f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
275f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
276f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#endif /* __mc68000__ */
277f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
27850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef __sparc__
27950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
28050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
28150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
2821e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#ifndef EXT2_OLD_BITOPS
2831e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
2841e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
2851e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * Do the bitops so that we are compatible with the standard i386
2861e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * convention.
2871e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
2881e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
2891e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o_INLINE_ int ext2fs_set_bit(int nr,void * addr)
2901e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
2911e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#if 1
2921e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	int		mask;
2931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	unsigned char	*ADDR = (unsigned char *) addr;
2941e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
2951e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	ADDR += nr >> 3;
2961e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	mask = 1 << (nr & 0x07);
2971e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	__asm__ __volatile__("ldub	[%0], %%g6\n\t"
2981e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			     "or	%%g6, %2, %%g5\n\t"
2991e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			     "stb	%%g5, [%0]\n\t"
3001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			     "and	%%g6, %2, %0\n"
3011e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	: "=&r" (ADDR)
3021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	: "0" (ADDR), "r" (mask)
3031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	: "g5", "g6");
3041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return (int) ADDR;
3051e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#else
3061e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	int		mask, retval;
3071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	unsigned char	*ADDR = (unsigned char *) addr;
3081e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3091e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	ADDR += nr >> 3;
3101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	mask = 1 << (nr & 0x07);
3111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	retval = (mask & *ADDR) != 0;
3121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	*ADDR |= mask;
3131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return retval;
3141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#endif
3151e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
3161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
3181e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
3191e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#if 1
3201e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	int		mask;
3211e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	unsigned char	*ADDR = (unsigned char *) addr;
3221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3231e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	ADDR += nr >> 3;
3241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	mask = 1 << (nr & 0x07);
3251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	__asm__ __volatile__("ldub	[%0], %%g6\n\t"
3261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			     "andn	%%g6, %2, %%g5\n\t"
3271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			     "stb	%%g5, [%0]\n\t"
3281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			     "and	%%g6, %2, %0\n"
3291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	: "=&r" (ADDR)
3301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	: "0" (ADDR), "r" (mask)
3311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	: "g5", "g6");
3321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return (int) ADDR;
3331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#else
3351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	int		mask, retval;
3361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	unsigned char	*ADDR = (unsigned char *) addr;
3371e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3381e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	ADDR += nr >> 3;
3391e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	mask = 1 << (nr & 0x07);
3401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	retval = (mask & *ADDR) != 0;
3411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	*ADDR &= ~mask;
3421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return retval;
3431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#endif
3441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
3451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
3471e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
3481e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	int			mask;
3491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	const unsigned char	*ADDR = (const unsigned char *) addr;
3501e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3511e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	ADDR += nr >> 3;
3521e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	mask = 1 << (nr & 0x07);
3531e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ((mask & *ADDR) != 0);
3541e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
3551e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3561e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#else
3571e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3581e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* Do things the old, unplesant way. */
3591e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
36074becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_set_bit(int nr, void *addr)
36150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
36250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	int		mask, retval;
36350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	unsigned long	*ADDR = (unsigned long *) addr;
36450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
36550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ADDR += nr >> 5;
36650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	mask = 1 << (nr & 31);
36750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	retval = ((mask & *ADDR) != 0);
36850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	*ADDR |= mask;
36950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return retval;
37050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
37150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
37274becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void *addr)
37350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
37450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	int		mask, retval;
37550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	unsigned long	*ADDR = (unsigned long *) addr;
37650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
37750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ADDR += nr >> 5;
37850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	mask = 1 << (nr & 31);
37950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	retval = ((mask & *ADDR) != 0);
38050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	*ADDR &= ~mask;
38150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return retval;
38250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
38350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
38474becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void *addr)
38550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
38650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	int			mask;
38750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	const unsigned long	*ADDR = (const unsigned long *) addr;
38850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
38950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ADDR += nr >> 5;
39050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	mask = 1 << (nr & 31);
39150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return ((mask & *ADDR) != 0);
39250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
3931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#endif
39450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
39550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* __sparc__ */
39650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
39716645f802a809195757f04daa421356f90dc5857Theodore Ts'o#if !defined(_EXT2_HAVE_ASM_SWAB_) && defined(EXT2FS_ENABLE_SWAPFS)
39850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
39950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ __u16 ext2fs_swab16(__u16 val)
40050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
40150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return (val >> 8) | (val << 8);
40250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
40350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
40450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ __u32 ext2fs_swab32(__u32 val)
40550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
40650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return ((val>>24) | ((val>>8)&0xFF00) |
40750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		((val<<8)&0xFF0000) | (val<<24));
40850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
40950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
41050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* !_EXT2_HAVE_ASM_SWAB */
41150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
412ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#if !defined(_EXT2_HAVE_ASM_FINDBIT_)
413ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_first_bit_set(void * addr, unsigned size)
414ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
415ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	char	*cp = (unsigned char *) addr;
416ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int 	res = 0, d0;
417ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
418ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (!size)
419ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return 0;
420ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
421ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	while ((size > res) && (*cp == 0)) {
422ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		cp++;
423ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		res += 8;
424ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
425ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	d0 = ffs(*cp);
426ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (d0 == 0)
427ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return size;
428ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
429ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return res + d0 - 1;
430ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
431ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
432ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_next_bit_set (void * addr, int size, int offset)
433ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
434ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	unsigned char * p;
435ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int set = 0, bit = offset & 7, res = 0, d0;
436ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
437ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	res = offset >> 3;
438ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	p = ((unsigned char *) addr) + res;
439ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
440ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (bit) {
441ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		set = ffs(*p & ~((1 << bit) - 1));
442ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		if (set)
443ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			return (offset & ~7) + set - 1;
444ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		p++;
445ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		res += 8;
446ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
447ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	while ((size > res) && (*p == 0)) {
448ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		p++;
449ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		res += 8;
450ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
451ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	d0 = ffs(*p);
452ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (d0 == 0)
453ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return size;
454ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
455ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return (res + d0 - 1);
456ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
457ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#endif
458ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
4593034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o/* These two routines moved to gen_bitmap.c */
4603034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'oextern int ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap,
46121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					 __u32 bitno);
4623034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'oextern int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap,
46321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					   blk_t bitno);
46421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
46521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					blk_t bitno);
46621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
4671e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o_INLINE_ int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
46821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					blk_t bitno)
4693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
4701e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	if ((bitno < bitmap->start) || (bitno > bitmap->end)) {
471521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o		ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, bitno);
4723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 0;
4733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
4741e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ext2fs_test_bit(bitno - bitmap->start, bitmap->bitmap);
4751e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
4761e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
47728ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
4781e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				       blk_t block)
4791e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
48028ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap)
48128ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o				       bitmap,
48228ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o					  block);
4831e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
4841e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
48528ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
4861e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o					 blk_t block)
4871e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
48828ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
48928ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o					    block);
4901e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
4911e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
4921e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap,
4931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				       blk_t block)
4941e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
4951e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
4961e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o					  block);
4973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
4983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
49928ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
50031dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				       ext2_ino_t inode)
5013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
50228ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
50328ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o					  inode);
5043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
5053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
50628ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
50731dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					 ext2_ino_t inode)
5083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
50928ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
51028ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o				     inode);
5113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
5123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
513f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
51431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				       ext2_ino_t inode)
5153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
5161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
5171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o					  inode);
5183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
5193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
52050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
52150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block)
52250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
52350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
52450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
52550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
52650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   bitmap->description);
52750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
52850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
52950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
53074becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_set_bit(block - bitmap->start, bitmap->bitmap);
53150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
53250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
53350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
53450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      blk_t block)
53550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
53650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
53750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
53850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK,
53950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   block, bitmap->description);
54050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
54150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
54250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
54374becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap);
54450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
54550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
54650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
54750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block)
54850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
54950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
55050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
55150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
55250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   block, bitmap->description);
55350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return 0;
55450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
55550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
55674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap);
55750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
55850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
55950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
56031dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					    ext2_ino_t inode)
56150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
56250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
56350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
56450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK,
56550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   inode, bitmap->description);
56650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
56750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
56850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
56974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap);
57050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
57150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
57250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
57331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					      ext2_ino_t inode)
57450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
57550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
57650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
57750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK,
57850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   inode, bitmap->description);
57950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
58050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
58150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
58274becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap);
58350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
58450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
58550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
58631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					   ext2_ino_t inode)
58750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
58850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
58950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
59050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
59150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   inode, bitmap->description);
59250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return 0;
59350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
59450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
59574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap);
59650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
59750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
59850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
59950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
60050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->start;
60150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
60250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
60331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
60450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
60550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->start;
60650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
60750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
60850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
60950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
61050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->end;
61150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
61250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
61331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
61450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
61550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->end;
61650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
61750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
61821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
61921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					    blk_t block, int num)
62021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
62121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	int	i;
62221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
62321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
62421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
62521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o				   block, bitmap->description);
62621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return 0;
62721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
62821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	for (i=0; i < num; i++) {
62921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
63021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o			return 0;
63121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
63221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	return 1;
63321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
63421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
63521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
63621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						 blk_t block, int num)
63721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
63821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	int	i;
63921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
64021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
64121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
64221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
64321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o				   block, bitmap->description);
64421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return 0;
64521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
64621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#endif
64721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	for (i=0; i < num; i++) {
64821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
64921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o			return 0;
65021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
65121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	return 1;
65221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
65321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
65421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
65521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					     blk_t block, int num)
65621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
65721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	int	i;
65821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
65921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
66021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
66121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o				   bitmap->description);
66221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return;
66321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
66421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	for (i=0; i < num; i++)
66521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
66621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
66721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
66821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
66921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						  blk_t block, int num)
67021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
67121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	int	i;
67221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
67321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
67421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
67521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
67621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o				   bitmap->description);
67721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return;
67821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
67921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#endif
68021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	for (i=0; i < num; i++)
68121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
68221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
68321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
68421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
68521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					       blk_t block, int num)
68621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
68721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	int	i;
68821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
68921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
69021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
69121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o				   bitmap->description);
69221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return;
69321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
69421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	for (i=0; i < num; i++)
69521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
69621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
69721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
69821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
69921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						    blk_t block, int num)
70021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
70121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	int	i;
70221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
70321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
70421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
70521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
70621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o				   bitmap->description);
70721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return;
70821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
70921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#endif
71021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	for (i=0; i < num; i++)
71121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
71221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
7133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#undef _INLINE_
7143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
71550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
716