mirror of https://github.com/vitalif/e2fsprogs
libext2fs: add 32-bit compat code for ext2fs_find_first_zero_generic_bmap()
The lack of 32-bit support was causing febootstrap to crash since it wasn't passing EXT2_FLAG_64BITS when opening the file system, so we were still using the legacy bitmaps. Also add support for bigalloc bitmap into the ffz functions. Addresses-Red-Hat-Bugzilla: #808421 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>bitmap-optimize
parent
8f92c4a2ff
commit
664c332612
|
@ -1169,6 +1169,9 @@ extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
|
||||||
errcode_t magic,
|
errcode_t magic,
|
||||||
__u32 start, __u32 num,
|
__u32 start, __u32 num,
|
||||||
void *in);
|
void *in);
|
||||||
|
extern errcode_t ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap bitmap,
|
||||||
|
__u32 start, __u32 end,
|
||||||
|
__u32 *out);
|
||||||
|
|
||||||
/* gen_bitmap64.c */
|
/* gen_bitmap64.c */
|
||||||
|
|
||||||
|
|
|
@ -504,6 +504,30 @@ static int ext2fs_test_clear_generic_bitmap_range(ext2fs_generic_bitmap bitmap,
|
||||||
return ext2fs_mem_is_zero(ADDR + start_byte, len_byte);
|
return ext2fs_mem_is_zero(ADDR + start_byte, len_byte);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errcode_t ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap bitmap,
|
||||||
|
__u32 start, __u32 end,
|
||||||
|
__u32 *out)
|
||||||
|
{
|
||||||
|
blk_t b;
|
||||||
|
|
||||||
|
if (start < bitmap->start || end > bitmap->end || start > end) {
|
||||||
|
ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, start);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (start <= end) {
|
||||||
|
b = ext2fs_test_bit(start - bitmap->start, bitmap->bitmap);
|
||||||
|
if (!b) {
|
||||||
|
*out = start;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
|
int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
|
||||||
blk_t block, int num)
|
blk_t block, int num)
|
||||||
{
|
{
|
||||||
|
@ -558,3 +582,4 @@ void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
|
||||||
ext2fs_fast_clear_bit(block + i - bitmap->start,
|
ext2fs_fast_clear_bit(block + i - bitmap->start,
|
||||||
bitmap->bitmap);
|
bitmap->bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -770,12 +770,36 @@ errcode_t ext2fs_find_first_zero_generic_bmap(ext2fs_generic_bitmap bitmap,
|
||||||
{
|
{
|
||||||
int b;
|
int b;
|
||||||
|
|
||||||
if (bitmap->bitmap_ops->find_first_zero)
|
if (!bitmap)
|
||||||
return bitmap->bitmap_ops->find_first_zero(bitmap, start, end, out);
|
|
||||||
|
|
||||||
if (!bitmap || !EXT2FS_IS_64_BITMAP(bitmap) || bitmap->cluster_bits)
|
|
||||||
return EINVAL;
|
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) {
|
if (start < bitmap->start || end > bitmap->end || start > end) {
|
||||||
warn_bitmap(bitmap, EXT2FS_TEST_ERROR, start);
|
warn_bitmap(bitmap, EXT2FS_TEST_ERROR, start);
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
@ -784,7 +808,7 @@ errcode_t ext2fs_find_first_zero_generic_bmap(ext2fs_generic_bitmap bitmap,
|
||||||
while (start <= end) {
|
while (start <= end) {
|
||||||
b = bitmap->bitmap_ops->test_bmap(bitmap, start);
|
b = bitmap->bitmap_ops->test_bmap(bitmap, start);
|
||||||
if (!b) {
|
if (!b) {
|
||||||
*out = start;
|
*out = start << bitmap->cluster_bits;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
start++;
|
start++;
|
||||||
|
|
Loading…
Reference in New Issue