e2freefrag: Take into account the last free extent in the file system

Fix a bug in e2freefrag where if the last free extent is at the very
end of the filesystem, it would be disregarded.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Theodore Ts'o 2009-08-09 20:15:46 -04:00
parent 3e343b8d9a
commit 1e48a456b6
1 changed files with 30 additions and 17 deletions

View File

@ -71,6 +71,24 @@ void init_chunk_info(ext2_filsys fs, struct chunk_info *info)
} }
} }
void update_chunk_stats(struct chunk_info *info, unsigned long chunk_size)
{
unsigned long index;
index = ul_log2(chunk_size) + 1;
if (index >= MAX_HIST)
index = MAX_HIST-1;
info->histogram.fc_chunks[index]++;
info->histogram.fc_blocks[index] += chunk_size;
if (chunk_size > info->max)
info->max = chunk_size;
if (chunk_size < info->min)
info->min = chunk_size;
info->avg += chunk_size;
info->real_free_chunks++;
}
void scan_block_bitmap(ext2_filsys fs, struct chunk_info *info) void scan_block_bitmap(ext2_filsys fs, struct chunk_info *info)
{ {
unsigned long long blocks_count = fs->super->s_blocks_count; unsigned long long blocks_count = fs->super->s_blocks_count;
@ -109,20 +127,7 @@ void scan_block_bitmap(ext2_filsys fs, struct chunk_info *info)
} }
if (used && last_chunk_size != 0) { if (used && last_chunk_size != 0) {
unsigned long index; update_chunk_stats(info, last_chunk_size);
index = ul_log2(last_chunk_size) + 1;
info->histogram.fc_chunks[index]++;
info->histogram.fc_blocks[index] +=
last_chunk_size;
if (last_chunk_size > info->max)
info->max = last_chunk_size;
if (last_chunk_size < info->min)
info->min = last_chunk_size;
info->avg += last_chunk_size;
info->real_free_chunks++;
last_chunk_size = 0; last_chunk_size = 0;
} }
} }
@ -130,6 +135,8 @@ void scan_block_bitmap(ext2_filsys fs, struct chunk_info *info)
if (chunk_free == info->blks_in_chunk) if (chunk_free == info->blks_in_chunk)
info->free_chunks++; info->free_chunks++;
} }
if (last_chunk_size != 0)
update_chunk_stats(info, last_chunk_size);
} }
errcode_t get_chunk_info(ext2_filsys fs, struct chunk_info *info) errcode_t get_chunk_info(ext2_filsys fs, struct chunk_info *info)
@ -176,13 +183,19 @@ errcode_t get_chunk_info(ext2_filsys fs, struct chunk_info *info)
"Free Blocks", "Percent"); "Free Blocks", "Percent");
for (i = 0; i < MAX_HIST; i++) { for (i = 0; i < MAX_HIST; i++) {
end = 1 << (i + info->blocksize_bits - units); end = 1 << (i + info->blocksize_bits - units);
if (info->histogram.fc_chunks[i] != 0) if (info->histogram.fc_chunks[i] != 0) {
printf("%5lu%c...%5lu%c- : %12lu %12lu %6.2f%%\n", char end_str[32];
start, *unitp, end, *unitp,
sprintf(end_str, "%5lu%c-", end, *unitp);
if (i == MAX_HIST-1)
strcpy(end_str, "max ");
printf("%5lu%c...%7s : %12lu %12lu %6.2f%%\n",
start, *unitp, end_str,
info->histogram.fc_chunks[i], info->histogram.fc_chunks[i],
info->histogram.fc_blocks[i], info->histogram.fc_blocks[i],
(double)info->histogram.fc_blocks[i] * 100 / (double)info->histogram.fc_blocks[i] * 100 /
fs->super->s_free_blocks_count); fs->super->s_free_blocks_count);
}
start = end; start = end;
if (start == 1<<10) { if (start == 1<<10) {
start = 1; start = 1;