bitops.h revision 69fbde418b1a197bf793e51b12e23f528b967093
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
1780af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'oextern int ext2fs_set_bit(unsigned int nr,void * addr);
1880af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'oextern int ext2fs_clear_bit(unsigned int nr, void * addr);
1980af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'oextern int ext2fs_test_bit(unsigned int nr, const void * addr);
20f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'oextern void ext2fs_fast_set_bit(unsigned int nr,void * addr);
21f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'oextern void ext2fs_fast_clear_bit(unsigned int nr, void * addr);
2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern __u16 ext2fs_swab16(__u16 val);
2350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern __u32 ext2fs_swab32(__u32 val);
24dec5cd13fff821d1d3f6a922fbd986b3a86abb77Theodore Ts'oextern __u64 ext2fs_swab64(__u64 val);
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
262cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#ifdef WORDS_BIGENDIAN
27a62e3f0378d2a9b861fc4809a810980c1c3bde35Andreas Dilger#define ext2fs_cpu_to_le64(x) ext2fs_swab64((x))
28a62e3f0378d2a9b861fc4809a810980c1c3bde35Andreas Dilger#define ext2fs_le64_to_cpu(x) ext2fs_swab64((x))
292cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_le32(x) ext2fs_swab32((x))
302cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_le32_to_cpu(x) ext2fs_swab32((x))
312cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_le16(x) ext2fs_swab16((x))
322cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_le16_to_cpu(x) ext2fs_swab16((x))
332cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_be32(x) ((__u32)(x))
342cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_be32_to_cpu(x) ((__u32)(x))
352cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_be16(x) ((__u16)(x))
362cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_be16_to_cpu(x) ((__u16)(x))
372cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#else
38a62e3f0378d2a9b861fc4809a810980c1c3bde35Andreas Dilger#define ext2fs_cpu_to_le64(x) ((__u64)(x))
39a62e3f0378d2a9b861fc4809a810980c1c3bde35Andreas Dilger#define ext2fs_le64_to_cpu(x) ((__u64)(x))
402cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_le32(x) ((__u32)(x))
412cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_le32_to_cpu(x) ((__u32)(x))
422cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_le16(x) ((__u16)(x))
432cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_le16_to_cpu(x) ((__u16)(x))
442cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_be32(x) ext2fs_swab32((x))
452cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_be32_to_cpu(x) ext2fs_swab32((x))
462cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_cpu_to_be16(x) ext2fs_swab16((x))
472cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#define ext2fs_be16_to_cpu(x) ext2fs_swab16((x))
482cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o#endif
492cb403b255f1254a29f26d2b356e7764c0f12506Theodore Ts'o
503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * EXT2FS bitmap manipulation routines.
523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* Support for sending warning messages from the inline subroutines */
553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_block_string;
563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_inode_string;
573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_mark_string;
583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_unmark_string;
593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern const char *ext2fs_test_string;
60f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg,
61f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o			       const char *description);
621e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap,
631e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				int code, unsigned long arg);
64f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
6528ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'oextern int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
6628ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'oextern int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
67f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				       blk_t block);
68f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
69f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
7031dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode);
7128ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'oextern int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
7231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				       ext2_ino_t inode);
7331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode);
743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
7550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
7650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					  blk_t block);
7750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
7850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block);
7950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
8050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					 blk_t block);
8150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
8250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
8331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					  ext2_ino_t inode);
8450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
8531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					    ext2_ino_t inode);
8650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
8731dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					 ext2_ino_t inode);
8850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap);
8931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap);
9050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap);
9131dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap);
9221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
9321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
9421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					   blk_t block, int num);
9521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
9621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					     blk_t block, int num);
9721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
9821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					  blk_t block, int num);
9921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
10021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						blk_t block, int num);
10121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
10221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						  blk_t block, int num);
10321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
10421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o					       blk_t block, int num);
105fff876b7c7716d5eef713101e47bff15edb9d9a9Theodore Ts'oextern void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map);
10650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
107b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o/* These routines moved to gen_bitmap.c */
1084ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'oextern int ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap,
1094ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o					 __u32 bitno);
1104ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'oextern int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap,
1114ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o					   blk_t bitno);
112b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'oextern int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
113b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o				      blk_t bitno);
1148df1827b55f11321bfe508c89b94591bdb97c3a6Theodore Ts'oextern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
1158df1827b55f11321bfe508c89b94591bdb97c3a6Theodore Ts'o					  blk_t block, int num);
116271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'oextern __u32 ext2fs_get_generic_bitmap_start(ext2fs_generic_bitmap bitmap);
117271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'oextern __u32 ext2fs_get_generic_bitmap_end(ext2fs_generic_bitmap bitmap);
118b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o
1193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
1203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The inline routines themselves...
1213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
1223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * If NO_INLINE_FUNCS is defined, then we won't try to do inline
12350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * functions at all; they will be included as normal functions in
12450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * inline.c
1253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
12650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef NO_INLINE_FUNCS
1275953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \
128125e084cef02fe865a34181ccfa7f258ccf8ab34Theodore Ts'o			   defined(__i586__) || defined(__mc68000__)))
12950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	/* This prevents bitops.c from trying to include the C */
13050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	/* function version of these functions */
13150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
13250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif
13350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* NO_INLINE_FUNCS */
13450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
1353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#ifdef INCLUDE_INLINE_FUNCS
1373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern
1383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#else
13976f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#ifdef __GNUC__
1403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern __inline__
14176f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#else				/* For Watcom C */
14276f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#define _INLINE_ extern inline
14376f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#endif
1443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
1453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
146f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o/*
147f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o * Fast bit set/clear functions that doesn't need to return the
148f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o * previous bit value.
149f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o */
150f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o
151f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o_INLINE_ void ext2fs_fast_set_bit(unsigned int nr,void * addr)
152f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o{
153f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	unsigned char	*ADDR = (unsigned char *) addr;
154f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o
155f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	ADDR += nr >> 3;
156f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	*ADDR |= (1 << (nr & 0x07));
157f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o}
158f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o
159f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o_INLINE_ void ext2fs_fast_clear_bit(unsigned int nr, void * addr)
160f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o{
161f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	unsigned char	*ADDR = (unsigned char *) addr;
162f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o
163f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	ADDR += nr >> 3;
164f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	*ADDR &= ~(1 << (nr & 0x07));
165f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o}
166f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o
167f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o
168ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \
169ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o     (defined(__i386__) || defined(__i486__) || defined(__i586__)))
170f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
171f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
1729ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o#define _EXT2_HAVE_ASM_SWAB_
173ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#define _EXT2_HAVE_ASM_FINDBIT_
1749ec53cf4f32cc65e91a9c71651f05a6d872a7088Theodore Ts'o
1753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
1763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * These are done by inline assembly for speed reasons.....
1773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
1783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * All bitoperations return 0 if the bit was cleared before the
1793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * operation and != 0 if it was not.  Bit 0 is the LSB of addr; bit 32
1803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * is the LSB of (addr+1).
1813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
1823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
1843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Some hacks to defeat gcc over-optimizations..
1853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
1863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct __dummy_h { unsigned long a[100]; };
18774becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define EXT2FS_ADDR (*(struct __dummy_h *) addr)
18874becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#define EXT2FS_CONST_ADDR (*(const struct __dummy_h *) addr)
1893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
19080af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'o_INLINE_ int ext2fs_set_bit(unsigned int nr, void * addr)
1913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
1923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
1933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
194f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	addr = (void *) (((unsigned char *) addr) + (nr >> 3));
1953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0"
1968ad26b08fac068f0c50d44a5072fb49ab7bedc78Theodore Ts'o		:"=r" (oldbit),"+m" (EXT2FS_ADDR)
197f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o		:"r" (nr & 7));
1983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
1993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
20180af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'o_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr)
2023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
2033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
2043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
205f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o	addr = (void *) (((unsigned char *) addr) + (nr >> 3));
2063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0"
2078ad26b08fac068f0c50d44a5072fb49ab7bedc78Theodore Ts'o		:"=r" (oldbit),"+m" (EXT2FS_ADDR)
208f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o		:"r" (nr & 7));
2093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
2103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
21280af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'o_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr)
2133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
2143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int oldbit;
2153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
216dec5cd13fff821d1d3f6a922fbd986b3a86abb77Theodore Ts'o	addr = (const void *) (((const unsigned char *) addr) + (nr >> 3));
2173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	__asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0"
2183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		:"=r" (oldbit)
219f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o		:"m" (EXT2FS_CONST_ADDR),"r" (nr & 7));
2203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return oldbit;
2213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
2223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2236ae296e7349bdf9393b2531f4acd84dd586546f6Theodore Ts'o#if 0
224ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_first_bit_set(void * addr, unsigned size)
225ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
226ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int d0, d1, d2;
227ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int res;
228ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
229ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (!size)
230ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return 0;
231ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	/* This looks at memory. Mark it volatile to tell gcc not to move it around */
232ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	__asm__ __volatile__(
233ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"cld\n\t"
234ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"xorl %%eax,%%eax\n\t"
235ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"xorl %%edx,%%edx\n\t"
236ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"repe; scasl\n\t"
237ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"je 1f\n\t"
238ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"movl -4(%%edi),%%eax\n\t"
239ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"subl $4,%%edi\n\t"
240ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"bsfl %%eax,%%edx\n"
241f41e7e6961366f15eca8c05edbf5a35f4a9b3b65Theodore Ts'o		"1:\tsubl %%esi,%%edi\n\t"
242ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"shll $3,%%edi\n\t"
243ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		"addl %%edi,%%edx"
244ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		:"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2)
245f41e7e6961366f15eca8c05edbf5a35f4a9b3b65Theodore Ts'o		:"1" ((size + 31) >> 5), "2" (addr), "S" (addr));
246ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return res;
247ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
248ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
249ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_next_bit_set (void * addr, int size, int offset)
250ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
251ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
252ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int set = 0, bit = offset & 31, res;
253ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
254ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (bit) {
255ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		/*
256ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		 * Look for zero in first byte
257ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		 */
258ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		__asm__("bsfl %1,%0\n\t"
259ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			"jne 1f\n\t"
260ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			"movl $32, %0\n"
261ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			"1:"
262ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			: "=r" (set)
263ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			: "r" (*p >> bit));
264ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		if (set < (32 - bit))
265ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			return set + offset;
266ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		set = 32 - bit;
267ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		p++;
268ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
269ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	/*
270ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	 * No bit found yet, search remaining full bytes for a bit
271ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	 */
272ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	res = ext2fs_find_first_bit_set(p, size - 32 * (p - (unsigned long *) addr));
273ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return (offset + set + res);
274ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
2756ae296e7349bdf9393b2531f4acd84dd586546f6Theodore Ts'o#endif
276ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
27769fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o_INLINE_ __u32 ext2fs_swab32(__u32 val)
27869fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o{
27969fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o#ifdef EXT2FS_REQUIRE_486
28069fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o	__asm__("bswap %0" : "=r" (val) : "0" (val));
28169fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o#else
28269fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o	__asm__("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/
28369fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		"rorl $16,%0\n\t"	/* swap words		*/
28469fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		"xchgb %b0,%h0"		/* swap higher bytes	*/
28569fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		:"=q" (val)
28669fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		: "0" (val));
28769fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o#endif
28869fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o	return val;
28969fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o}
29069fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o
29169fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o_INLINE_ __u16 ext2fs_swab16(__u16 val)
29269fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o{
29369fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o	__asm__("xchgb %b0,%h0"		/* swap bytes		*/ \
29469fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		: "=q" (val) \
29569fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		:  "0" (val)); \
29669fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		return val;
29769fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o}
29869fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o
29969fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o_INLINE_ __u64 ext2fs_swab64(__u64 val)
30069fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o{
30169fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o	return (ext2fs_swab32(val >> 32) |
30269fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o		(((__u64)ext2fs_swab32(val & 0xFFFFFFFFUL)) << 32));
30369fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o}
30469fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o
30574becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o#undef EXT2FS_ADDR
3063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
3073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif	/* i386 */
3083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
309f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \
310f9bcce3be04b554004a82d4fe10edaf6077241beTheodore Ts'o     (defined(__mc68000__)))
311f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
312f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define _EXT2_HAVE_ASM_BITOPS_
313f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
31480af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'o_INLINE_ int ext2fs_set_bit(unsigned int nr,void * addr)
315f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
316f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
317f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
318f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0"
3197f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
320f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
321f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
322f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
323f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
32480af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'o_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr)
325f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
326f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
327f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
328f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0"
3297f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
330f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
331f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
332f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
333f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
33480af12e180bdea9ed391a0aee58e31cee7641709Theodore Ts'o_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr)
335f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{
336f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	char retval;
337f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
338f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	__asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0"
3397f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o	     : "=d" (retval) : "d" (nr^7), "a" (addr));
340f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
341f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	return retval;
342f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o}
343f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
344f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#endif /* __mc68000__ */
345f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
34650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
34769fbde418b1a197bf793e51b12e23f528b967093Theodore Ts'o#if !defined(_EXT2_HAVE_ASM_SWAB_)
34850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
34950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ __u16 ext2fs_swab16(__u16 val)
35050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
35150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return (val >> 8) | (val << 8);
35250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
35350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
35450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ __u32 ext2fs_swab32(__u32 val)
35550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
35650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	return ((val>>24) | ((val>>8)&0xFF00) |
35750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		((val<<8)&0xFF0000) | (val<<24));
35850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
35950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
36050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif /* !_EXT2_HAVE_ASM_SWAB */
36150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
362ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#if !defined(_EXT2_HAVE_ASM_FINDBIT_)
36301c196b4f121cb77f50b9af2c54838aa4c6e06a0Eric Sandeen#include <strings.h>
364ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_first_bit_set(void * addr, unsigned size)
365ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
3669b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o	char	*cp = (char *) addr;
367ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int 	res = 0, d0;
368ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
369ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (!size)
370ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return 0;
371ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
372ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	while ((size > res) && (*cp == 0)) {
373ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		cp++;
374ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		res += 8;
375ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
376ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	d0 = ffs(*cp);
377ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (d0 == 0)
378ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return size;
379ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
380ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return res + d0 - 1;
381ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
382ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
383ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o_INLINE_ int ext2fs_find_next_bit_set (void * addr, int size, int offset)
384ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o{
385ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	unsigned char * p;
386ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	int set = 0, bit = offset & 7, res = 0, d0;
387ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
388ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	res = offset >> 3;
389ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	p = ((unsigned char *) addr) + res;
390ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
391ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (bit) {
392ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		set = ffs(*p & ~((1 << bit) - 1));
393ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		if (set)
394ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o			return (offset & ~7) + set - 1;
395ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		p++;
396ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		res += 8;
397ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
398ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	while ((size > res) && (*p == 0)) {
399ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		p++;
400ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		res += 8;
401ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	}
402ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	d0 = ffs(*p);
403ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	if (d0 == 0)
404ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o		return size;
405ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
406ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o	return (res + d0 - 1);
407ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o}
408ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o#endif
409ac493821ea0af9767a4c0f21a322133494bcdc48Theodore Ts'o
41028ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
4111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				       blk_t block)
4121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
413b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o	return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
41428ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o					  block);
4151e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
4161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
41728ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
4181e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o					 blk_t block)
4191e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
42028ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
42128ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o					    block);
4221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}
4231e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
4241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap,
4251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				       blk_t block)
4261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{
4271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
4281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o					  block);
4293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
4303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
43128ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
43231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				       ext2_ino_t inode)
4333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
43428ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
43528ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o					  inode);
4363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
4373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
43828ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o_INLINE_ int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
43931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					 ext2_ino_t inode)
4403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
44128ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o	return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
44228ffafb09c6fd8a9ebe716c06b02143771a9b17fTheodore Ts'o				     inode);
4433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
4443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
445f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o_INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
44631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				       ext2_ino_t inode)
4473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
4481e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
4491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o					  inode);
4503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
4513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
45250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
45350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block)
45450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
4557bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o	ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block);
45650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
45750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
45850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
45950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      blk_t block)
46050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
4617bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o	ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block);
46250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
46350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
46450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
46550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					    blk_t block)
46650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
4677bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o	return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
4687bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o					  block);
46950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
47050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
47150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
47231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					    ext2_ino_t inode)
47350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
4747bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o	ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode);
47550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
47650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
47750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
47831dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					      ext2_ino_t inode)
47950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
4807bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o	ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode);
48150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
48250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
48350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
48431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					   ext2_ino_t inode)
48550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
4867bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o	return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
4877bf257a9a07d6067fba43ba05f25b3de0436d59cTheodore Ts'o					  inode);
48850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
48950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
49050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
49150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
492271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o	return ext2fs_get_generic_bitmap_start((ext2fs_generic_bitmap) bitmap);
49350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
49450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
49531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
49650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
497271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o	return ext2fs_get_generic_bitmap_start((ext2fs_generic_bitmap) bitmap);
49850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
49950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
50050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
50150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
502271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o	return ext2fs_get_generic_bitmap_end((ext2fs_generic_bitmap) bitmap);
50350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
50450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
50531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
50650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{
507271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o	return ext2fs_get_generic_bitmap_end((ext2fs_generic_bitmap) bitmap);
50850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
50950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
51021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
51121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						 blk_t block, int num)
51221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
5138df1827b55f11321bfe508c89b94591bdb97c3a6Theodore Ts'o	return ext2fs_test_block_bitmap_range(bitmap, block, num);
51421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
51521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
51621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
51721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						  blk_t block, int num)
51821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
5198df1827b55f11321bfe508c89b94591bdb97c3a6Theodore Ts'o	ext2fs_mark_block_bitmap_range(bitmap, block, num);
52021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
52121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
52221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o_INLINE_ void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
52321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o						    blk_t block, int num)
52421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
5258df1827b55f11321bfe508c89b94591bdb97c3a6Theodore Ts'o	ext2fs_unmark_block_bitmap_range(bitmap, block, num);
52621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
5273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#undef _INLINE_
5283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
52950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
530