int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap, blk_t bitno) { if ((bitno < bitmap->start) || (bitno > bitmap->end)) { ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, bitno); return 0; } return ext2fs_clear_bit(bitno - bitmap->start, bitmap->bitmap); }
errcode_t ext2fs_resize_generic_bitmap(__u32 new_end, __u32 new_real_end, ext2fs_generic_bitmap bmap) { errcode_t retval; size_t size, new_size; __u32 bitno; if (!bmap) return EXT2_ET_INVALID_ARGUMENT; EXT2_CHECK_MAGIC(bmap, EXT2_ET_MAGIC_GENERIC_BITMAP); /* * If we're expanding the bitmap, make sure all of the new * parts of the bitmap are zero. */ if (new_end > bmap->end) { bitno = bmap->real_end; if (bitno > new_end) bitno = new_end; for (; bitno > bmap->end; bitno--) ext2fs_clear_bit(bitno - bmap->start, bmap->bitmap); } if (new_real_end == bmap->real_end) { bmap->end = new_end; return 0; } size = ((bmap->real_end - bmap->start) / 8) + 1; new_size = ((new_real_end - bmap->start) / 8) + 1; if (size != new_size) { retval = ext2fs_resize_mem(size, new_size, &bmap->bitmap); if (retval) return retval; } if (new_size > size) memset(bmap->bitmap + size, 0, new_size - size); bmap->end = new_end; bmap->real_end = new_real_end; return 0; }
errcode_t ext2fs_resize_generic_bitmap(errcode_t magic, __u32 new_end, __u32 new_real_end, ext2fs_generic_bitmap bmap) { errcode_t retval; size_t size, new_size; __u32 bitno; if (!bmap || (bmap->magic != magic)) return magic; /* * If we're expanding the bitmap, make sure all of the new * parts of the bitmap are zero. */ if (new_end > bmap->end) { bitno = bmap->real_end; if (bitno > new_end) bitno = new_end; for (; bitno > bmap->end; bitno--) ext2fs_clear_bit(bitno - bmap->start, bmap->bitmap); } if (new_real_end == bmap->real_end) { bmap->end = new_end; return 0; } size = ((bmap->real_end - bmap->start) / 8) + 1; new_size = ((new_real_end - bmap->start) / 8) + 1; if (size != new_size) { retval = ext2fs_resize_mem(size, new_size, &bmap->bitmap); if (retval) return retval; } if (new_size > size) memset(bmap->bitmap + size, 0, new_size - size); bmap->end = new_end; bmap->real_end = new_real_end; return 0; }
int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap, blk_t bitno) { if (!EXT2FS_IS_32_BITMAP(bitmap)) { if (EXT2FS_IS_64_BITMAP(bitmap)) { ext2fs_warn_bitmap32(bitmap, __func__); return ext2fs_unmark_generic_bmap(bitmap, bitno); } #ifndef OMIT_COM_ERR com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP, "mark_bitmap(%lu)", (unsigned long) bitno); #endif return 0; } if ((bitno < bitmap->start) || (bitno > bitmap->end)) { ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, bitno); return 0; } return ext2fs_clear_bit(bitno - bitmap->start, bitmap->bitmap); }
main(int argc, char **argv) { int i, j, size; unsigned char testarray[12]; unsigned char *bigarray; size = sizeof(bitarray)*8; #if 0 i = ext2fs_find_first_bit_set(bitarray, size); while (i < size) { printf("Bit set: %d\n", i); i = ext2fs_find_next_bit_set(bitarray, size, i+1); } #endif /* Test test_bit */ for (i=0,j=0; i < size; i++) { if (ext2fs_test_bit(i, bitarray)) { if (bits_list[j] == i) { j++; } else { printf("Bit %d set, not expected\n", i); exit(1); } } else { if (bits_list[j] == i) { printf("Expected bit %d to be clear.\n", i); exit(1); } } } printf("ext2fs_test_bit appears to be correct\n"); /* Test ext2fs_set_bit */ memset(testarray, 0, sizeof(testarray)); for (i=0; bits_list[i] > 0; i++) { ext2fs_set_bit(bits_list[i], testarray); } if (memcmp(testarray, bitarray, sizeof(testarray)) == 0) { printf("ext2fs_set_bit test succeeded.\n"); } else { printf("ext2fs_set_bit test failed.\n"); for (i=0; i < sizeof(testarray); i++) { printf("%02x ", testarray[i]); } printf("\n"); exit(1); } for (i=0; bits_list[i] > 0; i++) { ext2fs_clear_bit(bits_list[i], testarray); } for (i=0; i < sizeof(testarray); i++) { if (testarray[i]) { printf("ext2fs_clear_bit failed, " "testarray[%d] is %d\n", i, testarray[i]); exit(1); } } printf("ext2fs_clear_bit test succeed.\n"); /* Do bigarray test */ bigarray = malloc(1 << 29); if (!bigarray) { fprintf(stderr, "Failed to allocate scratch memory!\n"); exit(1); } bigarray[BIG_TEST_BIT >> 3] = 0; ext2fs_set_bit(BIG_TEST_BIT, bigarray); printf("big bit number (%u) test: %d, expected %d\n", BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3], (1 << (BIG_TEST_BIT & 7))); if (bigarray[BIG_TEST_BIT >> 3] != (1 << (BIG_TEST_BIT & 7))) exit(1); ext2fs_clear_bit(BIG_TEST_BIT, bigarray); printf("big bit number (%u) test: %d, expected 0\n", BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3], 0); if (bigarray[BIG_TEST_BIT >> 3] != 0) exit(1); printf("ext2fs_set_bit big_test successful\n"); /* Now test ext2fs_fast_set_bit */ memset(testarray, 0, sizeof(testarray)); for (i=0; bits_list[i] > 0; i++) { ext2fs_fast_set_bit(bits_list[i], testarray); } if (memcmp(testarray, bitarray, sizeof(testarray)) == 0) { printf("ext2fs_fast_set_bit test succeeded.\n"); } else { printf("ext2fs_fast_set_bit test failed.\n"); for (i=0; i < sizeof(testarray); i++) { printf("%02x ", testarray[i]); } printf("\n"); exit(1); } for (i=0; bits_list[i] > 0; i++) { ext2fs_clear_bit(bits_list[i], testarray); } for (i=0; i < sizeof(testarray); i++) { if (testarray[i]) { printf("ext2fs_clear_bit failed, " "testarray[%d] is %d\n", i, testarray[i]); exit(1); } } printf("ext2fs_clear_bit test succeed.\n"); bigarray[BIG_TEST_BIT >> 3] = 0; ext2fs_fast_set_bit(BIG_TEST_BIT, bigarray); printf("big bit number (%u) test: %d, expected %d\n", BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3], (1 << (BIG_TEST_BIT & 7))); if (bigarray[BIG_TEST_BIT >> 3] != (1 << (BIG_TEST_BIT & 7))) exit(1); ext2fs_fast_clear_bit(BIG_TEST_BIT, bigarray); printf("big bit number (%u) test: %d, expected 0\n", BIG_TEST_BIT, bigarray[BIG_TEST_BIT >> 3], 0); if (bigarray[BIG_TEST_BIT >> 3] != 0) exit(1); printf("ext2fs_fast_set_bit big_test successful\n"); exit(0); }