int ext2fs_test_generic_bmap(ext2fs_generic_bitmap bitmap, __u64 arg) { if (!bitmap) return 0; if (EXT2FS_IS_32_BITMAP(bitmap)) { if (arg & ~0xffffffffULL) { ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, 0xffffffff); return 0; } return ext2fs_test_generic_bitmap(bitmap, arg); } if (!EXT2FS_IS_64_BITMAP(bitmap)) return 0; arg >>= bitmap->cluster_bits; if ((arg < bitmap->start) || (arg > bitmap->end)) { warn_bitmap(bitmap, EXT2FS_TEST_ERROR, arg); return 0; } return bitmap->bitmap_ops->test_bmap(bitmap, arg); }
int ext2fs_unmark_generic_bmap(ext2fs_generic_bitmap bitmap, __u64 arg) { if (!bitmap) return 0; if (EXT2FS_IS_32_BITMAP(bitmap)) { if (arg & ~0xffffffffULL) { ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, 0xffffffff); return 0; } return ext2fs_unmark_generic_bitmap(bitmap, arg); } if (!EXT2FS_IS_64_BITMAP(bitmap)) return 0; arg >>= bitmap->cluster_bits; INC_STAT(bitmap, unmark_count); if ((arg < bitmap->start) || (arg > bitmap->end)) { warn_bitmap(bitmap, EXT2FS_UNMARK_ERROR, arg); return 0; } return bitmap->bitmap_ops->unmark_bmap(bitmap, arg); }
errcode_t ext2fs_find_first_zero_generic_bmap(ext2fs_generic_bitmap bitmap, __u64 start, __u64 end, __u64 *out) { int b; if (!bitmap) return EINVAL; if (EXT2FS_IS_64_BITMAP(bitmap) && bitmap->bitmap_ops->find_first_zero) return bitmap->bitmap_ops->find_first_zero(bitmap, start, end, out); if (EXT2FS_IS_32_BITMAP(bitmap)) { blk_t blk = 0; errcode_t retval; if (((start) & ~0xffffffffULL) || ((end) & ~0xffffffffULL)) { ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, start); return EINVAL; } retval = ext2fs_find_first_zero_generic_bitmap(bitmap, start, end, &blk); if (retval == 0) *out = blk; return retval; } if (!EXT2FS_IS_64_BITMAP(bitmap)) return EINVAL; start >>= bitmap->cluster_bits; end >>= bitmap->cluster_bits; if (start < bitmap->start || end > bitmap->end || start > end) { warn_bitmap(bitmap, EXT2FS_TEST_ERROR, start); return EINVAL; } while (start <= end) { b = bitmap->bitmap_ops->test_bmap(bitmap, start); if (!b) { *out = start << bitmap->cluster_bits; return 0; } start++; } return ENOENT; }
int ext2fs_test_generic_bmap(ext2fs_generic_bitmap bitmap, __u64 arg) { if (!bitmap) return 0; if (EXT2FS_IS_32_BITMAP(bitmap)) { if (arg & ~0xffffffffULL) { ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, 0xffffffff); return 0; } return ext2fs_test_generic_bitmap(bitmap, arg); } if (!EXT2FS_IS_64_BITMAP(bitmap)) return 0; arg >>= bitmap->cluster_bits; #ifdef BMAP_STATS_OPS bitmap->stats.test_count++; if (arg == bitmap->stats.last_tested + 1) bitmap->stats.test_seq++; if (arg < bitmap->stats.last_tested) bitmap->stats.test_back++; bitmap->stats.last_tested = arg; #endif if ((arg < bitmap->start) || (arg > bitmap->end)) { warn_bitmap(bitmap, EXT2FS_TEST_ERROR, arg); return 0; } return bitmap->bitmap_ops->test_bmap(bitmap, arg); }