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