bitops.h revision 7f88b04341d88c5df0360d930832c38040303b61
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 *
550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * Copyright (C) 1993, 1994, 1995 Theodore Ts'o.  This file may be
63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * redistributed under the terms of the GNU Public License.
73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Taken from <asm/bitops.h>, Copyright 1992, Linus Torvalds.
93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1274becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'oextern int ext2fs_set_bit(int nr,void * addr);
1374becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'oextern int ext2fs_clear_bit(int nr, void * addr);
1474becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'oextern int ext2fs_test_bit(int nr, const void * addr);
1550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern __u16 ext2fs_swab16(__u16 val);
1650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern __u32 ext2fs_swab32(__u32 val);
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * EXT2FS bitmap manipulation routines.
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* Support for sending warning messages from the inline subroutines */
233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_block_string;
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_inode_string;
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_mark_string;
263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_unmark_string;
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_test_string;
28f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg,
29f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o			       const char *description);
30f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
31f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
32f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
33f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       blk_t block);
34f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
35f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
36f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode);
37f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
38f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       ino_t inode);
39f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode);
403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
4150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
4250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					  blk_t block);
4350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
4450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block);
4550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
4650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					 blk_t block);
4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
4850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
4950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					  ino_t inode);
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    ino_t inode);
5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					 ino_t inode);
5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap);
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap);
5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap);
5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap);
5850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The inline routines themselves...
613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * If NO_INLINE_FUNCS is defined, then we won't try to do inline
6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * functions at all; they will be included as normal functions in
6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * inline.c
653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
6650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef NO_INLINE_FUNCS
6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if (defined(__i386__) || defined(__i486__) || defined(__i586__) || \
6850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o     defined(__mc68000__) || defined(__sparc__))
6950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	/* This prevents bitops.c from trying to include the C */
7050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	/* function version of these functions */
7150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
7250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
7350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* NO_INLINE_FUNCS */
7450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#ifdef INCLUDE_INLINE_FUNCS
773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern
783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#else
793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern __inline__
803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#if (defined(__i386__) || defined(__i486__) || defined(__i586__))
83f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
84f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
85f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * These are done by inline assembly for speed reasons.....
883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * All bitoperations return 0 if the bit was cleared before the
903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * operation and != 0 if it was not.  Bit 0 is the LSB of addr; bit 32
913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * is the LSB of (addr+1).
923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Some hacks to defeat gcc over-optimizations..
963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct __dummy_h { unsigned long a[100]; };
9874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define EXT2FS_ADDR (*(struct __dummy_h *) addr)
9974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define EXT2FS_CONST_ADDR (*(const struct __dummy_h *) addr)
1003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10174becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_set_bit(int nr, void * addr)
1023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0"
10674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o		:"=r" (oldbit),"=m" (EXT2FS_ADDR)
1073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"r" (nr));
1083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
11174becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
1123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0"
11674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o		:"=r" (oldbit),"=m" (EXT2FS_ADDR)
1173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"r" (nr));
1183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
12174becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
1223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0"
1263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"=r" (oldbit)
12774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o		:"m" (EXT2FS_CONST_ADDR),"r" (nr));
1283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
1303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
13174becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#undef EXT2FS_ADDR
1323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif	/* i386 */
1343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
135f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#ifdef __mc68000__
136f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
137f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
138f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
13974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_set_bit(int nr,void * addr)
140f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
141f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
142f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
143f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0"
1447f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
145f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
146f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
147f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
148f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
14974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
150f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
151f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
152f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
153f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0"
1547f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
155f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
156f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
157f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
158f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
15974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
160f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
161f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
162f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
163f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0"
1647f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
165f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
166f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
167f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
168f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
169f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#endif /* __mc68000__ */
170f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
17150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef __sparc__
17250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
17350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
17450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
17574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_set_bit(int nr, void *addr)
17650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
17750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	int		mask, retval;
17850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	unsigned long	*ADDR = (unsigned long *) addr;
17950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
18050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ADDR += nr >> 5;
18150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	mask = 1 << (nr & 31);
18250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	retval = ((mask & *ADDR) != 0);
18350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	*ADDR |= mask;
18450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return retval;
18550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
18650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
18774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_clear_bit(int nr, void *addr)
18850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
18950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	int		mask, retval;
19050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	unsigned long	*ADDR = (unsigned long *) addr;
19150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
19250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ADDR += nr >> 5;
19350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	mask = 1 << (nr & 31);
19450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	retval = ((mask & *ADDR) != 0);
19550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	*ADDR &= ~mask;
19650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return retval;
19750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
19850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
19974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o_INLINE_ int ext2fs_test_bit(int nr, const void *addr)
20050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
20150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	int			mask;
20250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	const unsigned long	*ADDR = (const unsigned long *) addr;
20350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
20450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ADDR += nr >> 5;
20550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	mask = 1 << (nr & 31);
20650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return ((mask & *ADDR) != 0);
20750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
20850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
20950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* __sparc__ */
21050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
21150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifndef _EXT2_HAVE_ASM_SWAB
21250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
21350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ __u16 ext2fs_swab16(__u16 val)
21450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
21550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return (val >> 8) | (val << 8);
21650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
21750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
21850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ __u32 ext2fs_swab32(__u32 val)
21950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
22050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return ((val>>24) | ((val>>8)&0xFF00) |
22150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		((val<<8)&0xFF0000) | (val<<24));
22250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
22350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
22450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* !_EXT2_HAVE_ASM_SWAB */
22550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
226f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
227f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       blk_t block)
2283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
229f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
230f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
231f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				   bitmap->description);
2323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return;
2333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
23474becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_set_bit(block - bitmap->start, bitmap->bitmap);
2353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
237f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
238f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o					 blk_t block)
2393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
240f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
241f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK,
242f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				   block, bitmap->description);
2433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return;
2443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
24574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap);
2463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
248f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap,
249f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       blk_t block)
2503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
251f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
252f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
253f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				   block, bitmap->description);
2543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 0;
2553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
25674becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap);
2573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
259f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ void ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
260f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       ino_t inode)
2613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
262f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
263f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK,
264f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				   inode, bitmap->description);
2653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return;
2663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
26774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap);
2683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
270f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ void ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
271f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o					 ino_t inode)
2723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
273f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
274f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK,
275f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				   inode, bitmap->description);
2763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return;
2773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
27874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap);
2793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
281f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
282f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       ino_t inode)
2833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
284f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
285f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
286f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				   inode, bitmap->description);
2873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		return 0;
2883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	}
28974becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap);
2903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
29250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
29350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block)
29450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
29550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
29650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
29750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
29850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   bitmap->description);
29950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
30050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
30150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
30274becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_set_bit(block - bitmap->start, bitmap->bitmap);
30350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
30450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
30550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
30650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      blk_t block)
30750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
30850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
30950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
31050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK,
31150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   block, bitmap->description);
31250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
31350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
31450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
31574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap);
31650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
31750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
31850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
31950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block)
32050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
32150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
32250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((block < bitmap->start) || (block > bitmap->end)) {
32350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
32450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   block, bitmap->description);
32550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return 0;
32650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
32750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
32874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap);
32950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
33050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
33150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
33250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    ino_t inode)
33350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
33450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
33550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
33650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK,
33750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   inode, bitmap->description);
33850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
33950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
34050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
34174becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap);
34250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
34350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
34450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
34550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      ino_t inode)
34650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
34750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
34850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
34950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK,
35050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   inode, bitmap->description);
35150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return;
35250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
35350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
35474becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap);
35550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
35650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
35750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
35850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					   ino_t inode)
35950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
36050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef EXT2FS_DEBUG_FAST_OPS
36150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ((inode < bitmap->start) || (inode > bitmap->end)) {
36250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
36350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				   inode, bitmap->description);
36450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		return 0;
36550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
36650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
36774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o	return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap);
36850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
36950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
37050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
37150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
37250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->start;
37350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
37450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
37550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
37650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
37750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->start;
37850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
37950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
38050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
38150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
38250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->end;
38350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
38450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
38550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
38650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
38750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return bitmap->end;
38850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
38950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
3903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#undef _INLINE_
3913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
39250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
393