bitops.h revision 6ae296e7349bdf9393b2531f4acd84dd586546f6
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 1606ae296e7349bdf9393b2531f4acd84dd586546f6Theodore Ts'o#if 0 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" 178f41e7e6961366f15eca8c05edbf5a35f4a9b3b65Theodore Ts'o "1:\tsubl %%esi,%%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) 182f41e7e6961366f15eca8c05edbf5a35f4a9b3b65Theodore Ts'o :"1" ((size + 31) >> 5), "2" (addr), "S" (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} 2126ae296e7349bdf9393b2531f4acd84dd586546f6Theodore 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