__u64 start, __u64 end, __u64 *out)
{
int b;
+ __u64 cstart, cend, cout;
+ errcode_t retval;
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)) {
if (!EXT2FS_IS_64_BITMAP(bitmap))
return EINVAL;
- start >>= bitmap->cluster_bits;
- end >>= bitmap->cluster_bits;
+ cstart = start >> bitmap->cluster_bits;
+ cend = end >> bitmap->cluster_bits;
- if (start < bitmap->start || end > bitmap->end || start > end) {
+ if (cstart < bitmap->start || cend > 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++;
+ if (bitmap->bitmap_ops->find_first_zero) {
+ retval = bitmap->bitmap_ops->find_first_zero(bitmap, cstart,
+ cend, &cout);
+ if (retval)
+ return retval;
+ found:
+ cout <<= bitmap->cluster_bits;
+ *out = (cout >= start) ? cout : start;
+ return 0;
}
+ for (cout = cstart; cout <= cend; cout++)
+ if (!bitmap->bitmap_ops->test_bmap(bitmap, cout))
+ goto found;
+
return ENOENT;
}
__u64 start, __u64 end, __u64 *out)
{
int b;
+ __u64 cstart, cend, cout;
+ errcode_t retval;
if (!bitmap)
return EINVAL;
- if (EXT2FS_IS_64_BITMAP(bitmap) && bitmap->bitmap_ops->find_first_set)
- return bitmap->bitmap_ops->find_first_set(bitmap, start,
- end, out);
-
if (EXT2FS_IS_32_BITMAP(bitmap)) {
blk_t blk = 0;
- errcode_t retval;
if (((start) & ~0xffffffffULL) ||
((end) & ~0xffffffffULL)) {
if (!EXT2FS_IS_64_BITMAP(bitmap))
return EINVAL;
- start >>= bitmap->cluster_bits;
- end >>= bitmap->cluster_bits;
+ cstart = start >> bitmap->cluster_bits;
+ cend = end >> bitmap->cluster_bits;
- if (start < bitmap->start || end > bitmap->end || start > end) {
+ if (cstart < bitmap->start || cend > 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++;
+ if (bitmap->bitmap_ops->find_first_set) {
+ retval = bitmap->bitmap_ops->find_first_set(bitmap, cstart,
+ cend, &cout);
+ if (retval)
+ return retval;
+ found:
+ cout <<= bitmap->cluster_bits;
+ *out = (cout >= start) ? cout : start;
+ return 0;
}
+ for (cout = cstart; cout <= cend; cout++)
+ if (bitmap->bitmap_ops->test_bmap(bitmap, cout))
+ goto found;
+
return ENOENT;
}