4 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Public
18 errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
20 void **pp = (void **)ptr;
24 return EXT2_ET_NO_MEMORY;
31 errcode_t ext2fs_free_mem(void *ptr)
33 void **pp = (void **)ptr;
43 errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
44 unsigned long size, void *ptr)
47 void **pp = (void **)ptr;
49 p = realloc(*pp, size);
51 return EXT2_ET_NO_MEMORY;
57 * Mark a filesystem superblock as dirty
59 void ext2fs_mark_super_dirty(ext2_filsys fs)
61 fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
65 * Mark a filesystem as changed
67 void ext2fs_mark_changed(ext2_filsys fs)
69 fs->flags |= EXT2_FLAG_CHANGED;
73 * Check to see if a filesystem has changed
75 int ext2fs_test_changed(ext2_filsys fs)
77 return (fs->flags & EXT2_FLAG_CHANGED);
81 * Mark a filesystem as valid
83 void ext2fs_mark_valid(ext2_filsys fs)
85 fs->flags |= EXT2_FLAG_VALID;
89 * Mark a filesystem as NOT valid
91 void ext2fs_unmark_valid(ext2_filsys fs)
93 fs->flags &= ~EXT2_FLAG_VALID;
97 * Check to see if a filesystem is valid
99 int ext2fs_test_valid(ext2_filsys fs)
101 return (fs->flags & EXT2_FLAG_VALID);
105 * Mark the inode bitmap as dirty
107 void ext2fs_mark_ib_dirty(ext2_filsys fs)
109 fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
113 * Mark the block bitmap as dirty
115 void ext2fs_mark_bb_dirty(ext2_filsys fs)
117 fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
121 * Check to see if a filesystem's inode bitmap is dirty
123 int ext2fs_test_ib_dirty(ext2_filsys fs)
125 return (fs->flags & EXT2_FLAG_IB_DIRTY);
129 * Check to see if a filesystem's block bitmap is dirty
131 int ext2fs_test_bb_dirty(ext2_filsys fs)
133 return (fs->flags & EXT2_FLAG_BB_DIRTY);
137 * Return the group # of a block
139 int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
141 return (blk - fs->super->s_first_data_block) /
142 fs->super->s_blocks_per_group;
146 * Return the group # of an inode number
148 int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
150 return (ino - 1) / fs->super->s_inodes_per_group;
153 blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
154 struct ext2_inode *inode)
156 return inode->i_blocks -
157 (inode->i_file_acl ? fs->blocksize >> 9 : 0);
168 __u16 ext2fs_swab16(__u16 val)
170 return (val >> 8) | (val << 8);
173 __u32 ext2fs_swab32(__u32 val)
175 return ((val>>24) | ((val>>8)&0xFF00) |
176 ((val<<8)&0xFF0000) | (val<<24));
179 int ext2fs_find_first_bit_set(void * addr, unsigned size)
181 char *cp = (unsigned char *) addr;
187 while ((size > res) && (*cp == 0)) {
198 int ext2fs_find_next_bit_set (void * addr, int size, int offset)
201 int set = 0, bit = offset & 7, res = 0, d0;
204 p = ((unsigned char *) addr) + res;
207 set = ffs(*p & ~((1 << bit) - 1));
209 return (offset & ~7) + set - 1;
213 while ((size > res) && (*p == 0)) {
221 return (res + d0 - 1);
224 int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
227 int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
230 if ((bitno < bitmap->start) || (bitno > bitmap->end)) {
231 ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, bitno);
234 return ext2fs_test_bit(bitno - bitmap->start, bitmap->bitmap);
237 int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
240 return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap)
245 int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
248 return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
252 int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap,
255 return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
259 int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
262 return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
266 int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
269 return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
273 int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
276 return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
280 void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
283 #ifdef EXT2FS_DEBUG_FAST_OPS
284 if ((block < bitmap->start) || (block > bitmap->end)) {
285 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
286 bitmap->description);
290 ext2fs_set_bit(block - bitmap->start, bitmap->bitmap);
293 void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
296 #ifdef EXT2FS_DEBUG_FAST_OPS
297 if ((block < bitmap->start) || (block > bitmap->end)) {
298 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK,
299 block, bitmap->description);
303 ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap);
306 int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
309 #ifdef EXT2FS_DEBUG_FAST_OPS
310 if ((block < bitmap->start) || (block > bitmap->end)) {
311 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
312 block, bitmap->description);
316 return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap);
319 void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
322 #ifdef EXT2FS_DEBUG_FAST_OPS
323 if ((inode < bitmap->start) || (inode > bitmap->end)) {
324 ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK,
325 inode, bitmap->description);
329 ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap);
332 void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
335 #ifdef EXT2FS_DEBUG_FAST_OPS
336 if ((inode < bitmap->start) || (inode > bitmap->end)) {
337 ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK,
338 inode, bitmap->description);
342 ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap);
345 int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
348 #ifdef EXT2FS_DEBUG_FAST_OPS
349 if ((inode < bitmap->start) || (inode > bitmap->end)) {
350 ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
351 inode, bitmap->description);
355 return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap);
358 blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
360 return bitmap->start;
363 ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
365 return bitmap->start;
368 blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
373 ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
378 int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
379 blk_t block, int num)
383 if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
384 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
385 block, bitmap->description);
388 for (i=0; i < num; i++) {
389 if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
395 int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
396 blk_t block, int num)
400 #ifdef EXT2FS_DEBUG_FAST_OPS
401 if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
402 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
403 block, bitmap->description);
407 for (i=0; i < num; i++) {
408 if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
414 void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
415 blk_t block, int num)
419 if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
420 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
421 bitmap->description);
424 for (i=0; i < num; i++)
425 ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
428 void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
429 blk_t block, int num)
433 #ifdef EXT2FS_DEBUG_FAST_OPS
434 if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
435 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
436 bitmap->description);
440 for (i=0; i < num; i++)
441 ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
444 void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
445 blk_t block, int num)
449 if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
450 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
451 bitmap->description);
454 for (i=0; i < num; i++)
455 ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
458 void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
459 blk_t block, int num)
463 #ifdef EXT2FS_DEBUG_FAST_OPS
464 if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
465 ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
466 bitmap->description);
470 for (i=0; i < num; i++)
471 ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);