shorter names for old/new inode count variables
parent
15e3f31df8
commit
9dfbea8e54
|
@ -63,8 +63,9 @@ typedef struct
|
||||||
ext2_filsys fs;
|
ext2_filsys fs;
|
||||||
int fs_fd;
|
int fs_fd;
|
||||||
char *device_name, *io_options;
|
char *device_name, *io_options;
|
||||||
__u32 old_inodes_per_group;
|
__u32 ig_old, ig_new; // old and new inodes-per-group count
|
||||||
__u32 new_inode_count, new_inodes_per_group, new_inode_blocks_per_group;
|
__u32 ibg_old, ibg_new; // old and new inode_blocks-per-group count
|
||||||
|
__u32 new_inode_count;
|
||||||
// (old->new) inode number map
|
// (old->new) inode number map
|
||||||
ext2_ino_t *inode_map;
|
ext2_ino_t *inode_map;
|
||||||
__u32 inode_map_size, inode_map_alloc;
|
__u32 inode_map_size, inode_map_alloc;
|
||||||
|
@ -233,7 +234,7 @@ int shrink_move_inodes(realloc_data *rd)
|
||||||
}
|
}
|
||||||
for (group = 0; group < rd->fs->group_desc_count; group++)
|
for (group = 0; group < rd->fs->group_desc_count; group++)
|
||||||
{
|
{
|
||||||
for (i = rd->new_inodes_per_group; i < EXT2_INODES_PER_GROUP(rd->fs->super); i++)
|
for (i = rd->ig_new; i < EXT2_INODES_PER_GROUP(rd->fs->super); i++)
|
||||||
{
|
{
|
||||||
ino = 1 + group*EXT2_INODES_PER_GROUP(rd->fs->super) + i;
|
ino = 1 + group*EXT2_INODES_PER_GROUP(rd->fs->super) + i;
|
||||||
if (ext2fs_test_inode_bitmap2(rd->fs->inode_map, ino))
|
if (ext2fs_test_inode_bitmap2(rd->fs->inode_map, ino))
|
||||||
|
@ -244,7 +245,7 @@ int shrink_move_inodes(realloc_data *rd)
|
||||||
{
|
{
|
||||||
retval = ext2fs_find_first_zero_inode_bitmap2(rd->fs->inode_map,
|
retval = ext2fs_find_first_zero_inode_bitmap2(rd->fs->inode_map,
|
||||||
1 + new_group*EXT2_INODES_PER_GROUP(rd->fs->super),
|
1 + new_group*EXT2_INODES_PER_GROUP(rd->fs->super),
|
||||||
new_group*EXT2_INODES_PER_GROUP(rd->fs->super)+rd->new_inodes_per_group, &new_ino);
|
new_group*EXT2_INODES_PER_GROUP(rd->fs->super)+rd->ig_new, &new_ino);
|
||||||
if (!retval)
|
if (!retval)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -297,11 +298,11 @@ int extend_move_blocks(realloc_data *rd)
|
||||||
blk64_t it_start, blk_diff, b_per_g;
|
blk64_t it_start, blk_diff, b_per_g;
|
||||||
dgrp_t n_flex, n_grp, flex_count;
|
dgrp_t n_flex, n_grp, flex_count;
|
||||||
int retval, flexbg_size;
|
int retval, flexbg_size;
|
||||||
if (rd->new_inode_blocks_per_group == rd->fs->inode_blocks_per_group)
|
if (rd->ibg_new == rd->ibg_old)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
blk_diff = rd->new_inode_blocks_per_group-rd->fs->inode_blocks_per_group;
|
blk_diff = rd->ibg_new-rd->ibg_old;
|
||||||
b_per_g = EXT2_BLOCKS_PER_GROUP(rd->fs->super);
|
b_per_g = EXT2_BLOCKS_PER_GROUP(rd->fs->super);
|
||||||
retval = ext2fs_allocate_block_bitmap(rd->fs, "reserved block map", &reserve_map);
|
retval = ext2fs_allocate_block_bitmap(rd->fs, "reserved block map", &reserve_map);
|
||||||
if (retval)
|
if (retval)
|
||||||
|
@ -332,13 +333,13 @@ int extend_move_blocks(realloc_data *rd)
|
||||||
}
|
}
|
||||||
it_start = ext2fs_inode_table_loc(rd->fs, n_flex*flexbg_size);
|
it_start = ext2fs_inode_table_loc(rd->fs, n_flex*flexbg_size);
|
||||||
// Check group boundaries
|
// Check group boundaries
|
||||||
if ((it_start + rd->new_inode_blocks_per_group*n_grp - 1) / b_per_g
|
if ((it_start + rd->ibg_new*n_grp - 1) / b_per_g
|
||||||
!= (it_start + rd->fs->inode_blocks_per_group*n_grp - 1) / b_per_g)
|
!= (it_start + rd->ibg_old*n_grp - 1) / b_per_g)
|
||||||
{
|
{
|
||||||
retval = ENOSPC;
|
retval = ENOSPC;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
it_start += rd->fs->inode_blocks_per_group*n_grp;
|
it_start += rd->ibg_old*n_grp;
|
||||||
ext2fs_mark_block_bitmap_range2(reserve_map, it_start, blk_diff*n_grp);
|
ext2fs_mark_block_bitmap_range2(reserve_map, it_start, blk_diff*n_grp);
|
||||||
}
|
}
|
||||||
retval = ext2fs_move_blocks(rd->fs, reserve_map, rd->fs->block_map, 0);
|
retval = ext2fs_move_blocks(rd->fs, reserve_map, rd->fs->block_map, 0);
|
||||||
|
@ -359,7 +360,7 @@ static int change_inode_numbers_callback(ext2_ino_t dir, int entry,
|
||||||
{
|
{
|
||||||
new_ino = dirent->inode;
|
new_ino = dirent->inode;
|
||||||
}
|
}
|
||||||
new_ino = 1 + (new_ino-1)/EXT2_INODES_PER_GROUP(rd->fs->super)*rd->new_inodes_per_group +
|
new_ino = 1 + (new_ino-1)/EXT2_INODES_PER_GROUP(rd->fs->super)*rd->ig_new +
|
||||||
(new_ino-1)%EXT2_INODES_PER_GROUP(rd->fs->super);
|
(new_ino-1)%EXT2_INODES_PER_GROUP(rd->fs->super);
|
||||||
if (new_ino != dirent->inode)
|
if (new_ino != dirent->inode)
|
||||||
{
|
{
|
||||||
|
@ -393,7 +394,6 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
blk64_t it_start, blk;
|
blk64_t it_start, blk;
|
||||||
dgrp_t grp, flex_grp, flex_count;
|
dgrp_t grp, flex_grp, flex_count;
|
||||||
__u32 unus;
|
__u32 unus;
|
||||||
int i_per_g_diff = rd->new_inodes_per_group - EXT2_INODES_PER_GROUP(rd->fs->super);
|
|
||||||
int flexbg_size, n_grp, i, retval = 0;
|
int flexbg_size, n_grp, i, retval = 0;
|
||||||
void *buf = NULL;
|
void *buf = NULL;
|
||||||
ext2fs_flush(rd->fs);
|
ext2fs_flush(rd->fs);
|
||||||
|
@ -401,7 +401,7 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
{
|
{
|
||||||
ext2fs_read_block_bitmap(rd->fs);
|
ext2fs_read_block_bitmap(rd->fs);
|
||||||
}
|
}
|
||||||
if (rd->new_inode_blocks_per_group != rd->fs->inode_blocks_per_group)
|
if (rd->ibg_new != rd->ibg_old)
|
||||||
{
|
{
|
||||||
if (EXT2_HAS_INCOMPAT_FEATURE(rd->fs->super, EXT4_FEATURE_INCOMPAT_FLEX_BG)
|
if (EXT2_HAS_INCOMPAT_FEATURE(rd->fs->super, EXT4_FEATURE_INCOMPAT_FLEX_BG)
|
||||||
&& rd->fs->super->s_log_groups_per_flex)
|
&& rd->fs->super->s_log_groups_per_flex)
|
||||||
|
@ -413,14 +413,14 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
flexbg_size = 1;
|
flexbg_size = 1;
|
||||||
}
|
}
|
||||||
flex_count = (rd->fs->group_desc_count + flexbg_size - 1) / flexbg_size;
|
flex_count = (rd->fs->group_desc_count + flexbg_size - 1) / flexbg_size;
|
||||||
retval = ext2fs_get_mem(EXT2_BLOCK_SIZE(rd->fs->super) * rd->new_inode_blocks_per_group * flexbg_size, &buf);
|
retval = ext2fs_get_mem(EXT2_BLOCK_SIZE(rd->fs->super) * rd->ibg_new * flexbg_size, &buf);
|
||||||
if (retval)
|
if (retval)
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
for (flex_grp = 0; flex_grp < flex_count; flex_grp++)
|
for (flex_grp = 0; flex_grp < flex_count; flex_grp++)
|
||||||
{
|
{
|
||||||
memset(buf, 0, EXT2_BLOCK_SIZE(rd->fs->super) * rd->new_inode_blocks_per_group * flexbg_size);
|
memset(buf, 0, EXT2_BLOCK_SIZE(rd->fs->super) * rd->ibg_new * flexbg_size);
|
||||||
n_grp = flexbg_size;
|
n_grp = flexbg_size;
|
||||||
if (flex_grp*flexbg_size+n_grp > rd->fs->group_desc_count)
|
if (flex_grp*flexbg_size+n_grp > rd->fs->group_desc_count)
|
||||||
{
|
{
|
||||||
|
@ -433,8 +433,8 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
{
|
{
|
||||||
blk = ext2fs_inode_table_loc(rd->fs, grp);
|
blk = ext2fs_inode_table_loc(rd->fs, grp);
|
||||||
retval = io_channel_read_blk64(rd->fs->io, blk,
|
retval = io_channel_read_blk64(rd->fs->io, blk,
|
||||||
min(rd->fs->inode_blocks_per_group, rd->new_inode_blocks_per_group),
|
min(rd->ibg_old, rd->ibg_new),
|
||||||
buf + i*rd->new_inode_blocks_per_group*EXT2_BLOCK_SIZE(rd->fs->super));
|
buf + i*rd->ibg_new*EXT2_BLOCK_SIZE(rd->fs->super));
|
||||||
if (retval)
|
if (retval)
|
||||||
{
|
{
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -443,7 +443,7 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
}
|
}
|
||||||
// Write inode table(s) to the new place
|
// Write inode table(s) to the new place
|
||||||
it_start = ext2fs_inode_table_loc(rd->fs, flex_grp*flexbg_size);
|
it_start = ext2fs_inode_table_loc(rd->fs, flex_grp*flexbg_size);
|
||||||
blk = rd->new_inode_blocks_per_group * n_grp;
|
blk = rd->ibg_new * n_grp;
|
||||||
retval = io_channel_write_blk64(rd->fs->io, it_start, blk, buf);
|
retval = io_channel_write_blk64(rd->fs->io, it_start, blk, buf);
|
||||||
if (retval)
|
if (retval)
|
||||||
{
|
{
|
||||||
|
@ -452,40 +452,36 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
// Mark/unmark extra inode table blocks
|
// Mark/unmark extra inode table blocks
|
||||||
if (rd->new_inode_blocks_per_group < rd->fs->inode_blocks_per_group)
|
if (rd->ibg_new < rd->ibg_old)
|
||||||
{
|
{
|
||||||
ext2fs_unmark_block_bitmap_range2(rd->fs->block_map, it_start+blk,
|
ext2fs_unmark_block_bitmap_range2(rd->fs->block_map, it_start+blk,
|
||||||
(rd->fs->inode_blocks_per_group-rd->new_inode_blocks_per_group)*n_grp);
|
(rd->ibg_old-rd->ibg_new)*n_grp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ext2fs_mark_block_bitmap_range2(rd->fs->block_map, it_start+rd->fs->inode_blocks_per_group*n_grp,
|
ext2fs_mark_block_bitmap_range2(rd->fs->block_map, it_start+rd->ibg_old*n_grp,
|
||||||
(rd->new_inode_blocks_per_group-rd->fs->inode_blocks_per_group)*n_grp);
|
(rd->ibg_new-rd->ibg_old)*n_grp);
|
||||||
}
|
}
|
||||||
ext2fs_bg_free_blocks_count_set(rd->fs, flex_grp*flexbg_size,
|
ext2fs_bg_free_blocks_count_set(rd->fs, flex_grp*flexbg_size,
|
||||||
ext2fs_bg_free_blocks_count(rd->fs, flex_grp*flexbg_size) -
|
ext2fs_bg_free_blocks_count(rd->fs, flex_grp*flexbg_size) -
|
||||||
(rd->new_inode_blocks_per_group - rd->fs->inode_blocks_per_group)*flexbg_size);
|
(rd->ibg_new - rd->ibg_old)*flexbg_size);
|
||||||
// Change inode table locations and free inode counts
|
// Change inode table locations and free inode counts
|
||||||
for (grp = flex_grp*flexbg_size, i = 0; i < n_grp; grp++, i++)
|
for (grp = flex_grp*flexbg_size, i = 0; i < n_grp; grp++, i++)
|
||||||
{
|
{
|
||||||
blk = it_start + rd->new_inode_blocks_per_group*i;
|
blk = it_start + rd->ibg_new*i;
|
||||||
ext2fs_inode_table_loc_set(rd->fs, grp, blk);
|
ext2fs_inode_table_loc_set(rd->fs, grp, blk);
|
||||||
ext2fs_bg_free_inodes_count_set(rd->fs, grp,
|
ext2fs_bg_free_inodes_count_set(rd->fs, grp,
|
||||||
ext2fs_bg_free_inodes_count(rd->fs, grp) + i_per_g_diff);
|
ext2fs_bg_free_inodes_count(rd->fs, grp) + rd->ig_new - rd->ig_old);
|
||||||
if (EXT2_HAS_RO_COMPAT_FEATURE(rd->fs->super, EXT4_FEATURE_RO_COMPAT_GDT_CSUM))
|
if (EXT2_HAS_RO_COMPAT_FEATURE(rd->fs->super, EXT4_FEATURE_RO_COMPAT_GDT_CSUM))
|
||||||
{
|
{
|
||||||
unus = ext2fs_bg_itable_unused(rd->fs, grp);
|
unus = ext2fs_bg_itable_unused(rd->fs, grp);
|
||||||
if (i_per_g_diff > 0)
|
if (rd->ig_new > rd->ig_old || unus >= rd->ig_old - rd->ig_new)
|
||||||
{
|
{
|
||||||
unus += i_per_g_diff;
|
unus += rd->ig_new - rd->ig_old;
|
||||||
}
|
|
||||||
else if (unus < (unsigned)-i_per_g_diff)
|
|
||||||
{
|
|
||||||
unus = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unus = unus + i_per_g_diff;
|
unus = 0;
|
||||||
}
|
}
|
||||||
ext2fs_bg_itable_unused_set(rd->fs, grp, unus);
|
ext2fs_bg_itable_unused_set(rd->fs, grp, unus);
|
||||||
ext2fs_bg_flags_clear(rd->fs, grp, EXT2_BG_BLOCK_UNINIT);
|
ext2fs_bg_flags_clear(rd->fs, grp, EXT2_BG_BLOCK_UNINIT);
|
||||||
|
@ -504,21 +500,21 @@ int change_super_and_bgd(realloc_data *rd)
|
||||||
rd->fs->write_bitmaps = NULL;
|
rd->fs->write_bitmaps = NULL;
|
||||||
// Explicitly set 'overwrite backup superblocks' flag
|
// Explicitly set 'overwrite backup superblocks' flag
|
||||||
rd->fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
rd->fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
||||||
ext2fs_free_blocks_count_add(rd->fs->super, rd->fs->group_desc_count * (rd->fs->inode_blocks_per_group - rd->new_inode_blocks_per_group));
|
ext2fs_free_blocks_count_add(rd->fs->super, rd->fs->group_desc_count * (rd->ibg_old - rd->ibg_new));
|
||||||
rd->fs->super->s_free_inodes_count += rd->fs->group_desc_count * (rd->new_inodes_per_group - EXT2_INODES_PER_GROUP(rd->fs->super));
|
rd->fs->super->s_free_inodes_count += rd->fs->group_desc_count * (rd->ig_new - EXT2_INODES_PER_GROUP(rd->fs->super));
|
||||||
rd->fs->super->s_inodes_per_group = rd->new_inodes_per_group;
|
rd->fs->super->s_inodes_per_group = rd->ig_new;
|
||||||
rd->fs->super->s_inodes_count = rd->fs->group_desc_count * rd->new_inodes_per_group;
|
rd->fs->super->s_inodes_count = rd->fs->group_desc_count * rd->ig_new;
|
||||||
ext2fs_mark_super_dirty(rd->fs);
|
ext2fs_mark_super_dirty(rd->fs);
|
||||||
if (rd->new_inodes_per_group > rd->old_inodes_per_group)
|
if (rd->ig_new > rd->ig_old)
|
||||||
{
|
{
|
||||||
// Mark newly allocated inodes as free in the bitmap
|
// Mark newly allocated inodes as free in the bitmap
|
||||||
__u32 ino;
|
__u32 ino;
|
||||||
ext2fs_read_inode_bitmap(rd->fs);
|
ext2fs_read_inode_bitmap(rd->fs);
|
||||||
for (grp = 0; grp < rd->fs->group_desc_count; grp++)
|
for (grp = 0; grp < rd->fs->group_desc_count; grp++)
|
||||||
{
|
{
|
||||||
for (ino = rd->old_inodes_per_group; ino < rd->new_inodes_per_group; ino++)
|
for (ino = rd->ig_old; ino < rd->ig_new; ino++)
|
||||||
{
|
{
|
||||||
ext2fs_unmark_inode_bitmap2(rd->fs->inode_map, 1 + ino + grp*rd->new_inodes_per_group);
|
ext2fs_unmark_inode_bitmap2(rd->fs->inode_map, 1 + ino + grp*rd->ig_new);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ext2fs_mark_ib_dirty(rd->fs);
|
ext2fs_mark_ib_dirty(rd->fs);
|
||||||
|
@ -537,19 +533,19 @@ out:
|
||||||
int do_realloc(realloc_data *rd)
|
int do_realloc(realloc_data *rd)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
rd->old_inodes_per_group = EXT2_INODES_PER_GROUP(rd->fs->super);
|
rd->ig_old = EXT2_INODES_PER_GROUP(rd->fs->super);
|
||||||
rd->new_inodes_per_group = rd->new_inode_count / rd->fs->group_desc_count;
|
rd->ig_new = rd->new_inode_count / rd->fs->group_desc_count;
|
||||||
rd->new_inodes_per_group &= ~7;
|
rd->ig_new &= ~7;
|
||||||
if (rd->new_inodes_per_group < 16)
|
if (rd->ig_new < 16)
|
||||||
{
|
{
|
||||||
printf("Too small number of inodes requested (%u), min inodes per group = 16\n", rd->new_inodes_per_group);
|
printf("Too small number of inodes requested (%u), min inodes per group = 16\n", rd->ig_new);
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
rd->new_inode_blocks_per_group =
|
rd->ibg_old = rd->fs->inode_blocks_per_group;
|
||||||
(rd->new_inodes_per_group * EXT2_INODE_SIZE(rd->fs->super) +
|
rd->ibg_new = (rd->ig_new * EXT2_INODE_SIZE(rd->fs->super) +
|
||||||
EXT2_BLOCK_SIZE(rd->fs->super) - 1) / EXT2_BLOCK_SIZE(rd->fs->super);
|
EXT2_BLOCK_SIZE(rd->fs->super) - 1) / EXT2_BLOCK_SIZE(rd->fs->super);
|
||||||
rd->new_inode_count = rd->new_inodes_per_group * rd->fs->group_desc_count;
|
rd->new_inode_count = rd->ig_new * rd->fs->group_desc_count;
|
||||||
if (rd->new_inodes_per_group < EXT2_INODES_PER_GROUP(rd->fs->super))
|
if (rd->ig_new < EXT2_INODES_PER_GROUP(rd->fs->super))
|
||||||
{
|
{
|
||||||
if (rd->new_inode_count < rd->fs->super->s_inodes_count - rd->fs->super->s_free_inodes_count)
|
if (rd->new_inode_count < rd->fs->super->s_inodes_count - rd->fs->super->s_free_inodes_count)
|
||||||
{
|
{
|
||||||
|
@ -564,12 +560,12 @@ int do_realloc(realloc_data *rd)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (rd->new_inodes_per_group > EXT2_INODES_PER_GROUP(rd->fs->super))
|
else if (rd->ig_new > EXT2_INODES_PER_GROUP(rd->fs->super))
|
||||||
{
|
{
|
||||||
blk64_t required_blocks = (rd->new_inode_blocks_per_group - rd->fs->inode_blocks_per_group) * rd->fs->group_desc_count;
|
blk64_t required_blocks = (rd->ibg_new - rd->ibg_old) * rd->fs->group_desc_count;
|
||||||
if (required_blocks > ext2fs_free_blocks_count(rd->fs->super))
|
if (required_blocks > ext2fs_free_blocks_count(rd->fs->super))
|
||||||
{
|
{
|
||||||
printf("Requested number of inodes is too big, it requires %llu free blocks, "
|
printf("Requested number of inodes is too big, it requires at least %llu free blocks, "
|
||||||
"and there are only %llu free blocks available\n",
|
"and there are only %llu free blocks available\n",
|
||||||
required_blocks, ext2fs_free_blocks_count(rd->fs->super));
|
required_blocks, ext2fs_free_blocks_count(rd->fs->super));
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
|
|
Loading…
Reference in New Issue