mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 15:01:44 +00:00
ext4: convert the free_blocks field in s_flex_groups to be free_clusters
Convert the free_blocks to be free_clusters to make the final revised bigalloc changes easier to read/understand. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
5704265188
commit
24aaa8ef4e
5 changed files with 30 additions and 27 deletions
|
@ -300,7 +300,7 @@ struct ext4_group_desc
|
||||||
|
|
||||||
struct flex_groups {
|
struct flex_groups {
|
||||||
atomic_t free_inodes;
|
atomic_t free_inodes;
|
||||||
atomic_t free_blocks;
|
atomic_t free_clusters;
|
||||||
atomic_t used_dirs;
|
atomic_t used_dirs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -346,7 +346,7 @@ static int find_group_flex(struct super_block *sb, struct inode *parent,
|
||||||
int flex_size = ext4_flex_bg_size(sbi);
|
int flex_size = ext4_flex_bg_size(sbi);
|
||||||
ext4_group_t best_flex = parent_fbg_group;
|
ext4_group_t best_flex = parent_fbg_group;
|
||||||
int blocks_per_flex = sbi->s_blocks_per_group * flex_size;
|
int blocks_per_flex = sbi->s_blocks_per_group * flex_size;
|
||||||
int flexbg_free_blocks;
|
int flexbg_free_clusters;
|
||||||
int flex_freeb_ratio;
|
int flex_freeb_ratio;
|
||||||
ext4_group_t n_fbg_groups;
|
ext4_group_t n_fbg_groups;
|
||||||
ext4_group_t i;
|
ext4_group_t i;
|
||||||
|
@ -355,8 +355,9 @@ static int find_group_flex(struct super_block *sb, struct inode *parent,
|
||||||
sbi->s_log_groups_per_flex;
|
sbi->s_log_groups_per_flex;
|
||||||
|
|
||||||
find_close_to_parent:
|
find_close_to_parent:
|
||||||
flexbg_free_blocks = atomic_read(&flex_group[best_flex].free_blocks);
|
flexbg_free_clusters = atomic_read(&flex_group[best_flex].free_clusters);
|
||||||
flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex;
|
flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 /
|
||||||
|
blocks_per_flex;
|
||||||
if (atomic_read(&flex_group[best_flex].free_inodes) &&
|
if (atomic_read(&flex_group[best_flex].free_inodes) &&
|
||||||
flex_freeb_ratio > free_block_ratio)
|
flex_freeb_ratio > free_block_ratio)
|
||||||
goto found_flexbg;
|
goto found_flexbg;
|
||||||
|
@ -370,8 +371,9 @@ find_close_to_parent:
|
||||||
if (i == parent_fbg_group || i == parent_fbg_group - 1)
|
if (i == parent_fbg_group || i == parent_fbg_group - 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
flexbg_free_blocks = atomic_read(&flex_group[i].free_blocks);
|
flexbg_free_clusters = atomic_read(&flex_group[i].free_clusters);
|
||||||
flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex;
|
flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 /
|
||||||
|
blocks_per_flex;
|
||||||
|
|
||||||
if (flex_freeb_ratio > free_block_ratio &&
|
if (flex_freeb_ratio > free_block_ratio &&
|
||||||
(atomic_read(&flex_group[i].free_inodes))) {
|
(atomic_read(&flex_group[i].free_inodes))) {
|
||||||
|
@ -380,14 +382,14 @@ find_close_to_parent:
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((atomic_read(&flex_group[best_flex].free_inodes) == 0) ||
|
if ((atomic_read(&flex_group[best_flex].free_inodes) == 0) ||
|
||||||
((atomic_read(&flex_group[i].free_blocks) >
|
((atomic_read(&flex_group[i].free_clusters) >
|
||||||
atomic_read(&flex_group[best_flex].free_blocks)) &&
|
atomic_read(&flex_group[best_flex].free_clusters)) &&
|
||||||
atomic_read(&flex_group[i].free_inodes)))
|
atomic_read(&flex_group[i].free_inodes)))
|
||||||
best_flex = i;
|
best_flex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!atomic_read(&flex_group[best_flex].free_inodes) ||
|
if (!atomic_read(&flex_group[best_flex].free_inodes) ||
|
||||||
!atomic_read(&flex_group[best_flex].free_blocks))
|
!atomic_read(&flex_group[best_flex].free_clusters))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
found_flexbg:
|
found_flexbg:
|
||||||
|
@ -407,7 +409,7 @@ out:
|
||||||
|
|
||||||
struct orlov_stats {
|
struct orlov_stats {
|
||||||
__u32 free_inodes;
|
__u32 free_inodes;
|
||||||
__u32 free_blocks;
|
__u32 free_clusters;
|
||||||
__u32 used_dirs;
|
__u32 used_dirs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -424,7 +426,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
|
||||||
|
|
||||||
if (flex_size > 1) {
|
if (flex_size > 1) {
|
||||||
stats->free_inodes = atomic_read(&flex_group[g].free_inodes);
|
stats->free_inodes = atomic_read(&flex_group[g].free_inodes);
|
||||||
stats->free_blocks = atomic_read(&flex_group[g].free_blocks);
|
stats->free_clusters = atomic_read(&flex_group[g].free_clusters);
|
||||||
stats->used_dirs = atomic_read(&flex_group[g].used_dirs);
|
stats->used_dirs = atomic_read(&flex_group[g].used_dirs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -432,11 +434,11 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
|
||||||
desc = ext4_get_group_desc(sb, g, NULL);
|
desc = ext4_get_group_desc(sb, g, NULL);
|
||||||
if (desc) {
|
if (desc) {
|
||||||
stats->free_inodes = ext4_free_inodes_count(sb, desc);
|
stats->free_inodes = ext4_free_inodes_count(sb, desc);
|
||||||
stats->free_blocks = ext4_free_blks_count(sb, desc);
|
stats->free_clusters = ext4_free_blks_count(sb, desc);
|
||||||
stats->used_dirs = ext4_used_dirs_count(sb, desc);
|
stats->used_dirs = ext4_used_dirs_count(sb, desc);
|
||||||
} else {
|
} else {
|
||||||
stats->free_inodes = 0;
|
stats->free_inodes = 0;
|
||||||
stats->free_blocks = 0;
|
stats->free_clusters = 0;
|
||||||
stats->used_dirs = 0;
|
stats->used_dirs = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -471,10 +473,10 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||||
ext4_group_t real_ngroups = ext4_get_groups_count(sb);
|
ext4_group_t real_ngroups = ext4_get_groups_count(sb);
|
||||||
int inodes_per_group = EXT4_INODES_PER_GROUP(sb);
|
int inodes_per_group = EXT4_INODES_PER_GROUP(sb);
|
||||||
unsigned int freei, avefreei;
|
unsigned int freei, avefreei;
|
||||||
ext4_fsblk_t freeb, avefreeb;
|
ext4_fsblk_t freeb, avefreec;
|
||||||
unsigned int ndirs;
|
unsigned int ndirs;
|
||||||
int max_dirs, min_inodes;
|
int max_dirs, min_inodes;
|
||||||
ext4_grpblk_t min_blocks;
|
ext4_grpblk_t min_clusters;
|
||||||
ext4_group_t i, grp, g, ngroups;
|
ext4_group_t i, grp, g, ngroups;
|
||||||
struct ext4_group_desc *desc;
|
struct ext4_group_desc *desc;
|
||||||
struct orlov_stats stats;
|
struct orlov_stats stats;
|
||||||
|
@ -492,8 +494,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||||
avefreei = freei / ngroups;
|
avefreei = freei / ngroups;
|
||||||
freeb = EXT4_C2B(sbi,
|
freeb = EXT4_C2B(sbi,
|
||||||
percpu_counter_read_positive(&sbi->s_freeclusters_counter));
|
percpu_counter_read_positive(&sbi->s_freeclusters_counter));
|
||||||
avefreeb = freeb;
|
avefreec = freeb;
|
||||||
do_div(avefreeb, ngroups);
|
do_div(avefreec, ngroups);
|
||||||
ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
|
ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
|
||||||
|
|
||||||
if (S_ISDIR(mode) &&
|
if (S_ISDIR(mode) &&
|
||||||
|
@ -519,7 +521,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||||
continue;
|
continue;
|
||||||
if (stats.free_inodes < avefreei)
|
if (stats.free_inodes < avefreei)
|
||||||
continue;
|
continue;
|
||||||
if (stats.free_blocks < avefreeb)
|
if (stats.free_clusters < avefreec)
|
||||||
continue;
|
continue;
|
||||||
grp = g;
|
grp = g;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -557,7 +559,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||||
min_inodes = avefreei - inodes_per_group*flex_size / 4;
|
min_inodes = avefreei - inodes_per_group*flex_size / 4;
|
||||||
if (min_inodes < 1)
|
if (min_inodes < 1)
|
||||||
min_inodes = 1;
|
min_inodes = 1;
|
||||||
min_blocks = avefreeb - EXT4_BLOCKS_PER_GROUP(sb)*flex_size / 4;
|
min_clusters = avefreec - EXT4_CLUSTERS_PER_GROUP(sb)*flex_size / 4;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start looking in the flex group where we last allocated an
|
* Start looking in the flex group where we last allocated an
|
||||||
|
@ -576,7 +578,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
||||||
continue;
|
continue;
|
||||||
if (stats.free_inodes < min_inodes)
|
if (stats.free_inodes < min_inodes)
|
||||||
continue;
|
continue;
|
||||||
if (stats.free_blocks < min_blocks)
|
if (stats.free_clusters < min_clusters)
|
||||||
continue;
|
continue;
|
||||||
goto found_flex_bg;
|
goto found_flex_bg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2847,7 +2847,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
|
||||||
ext4_group_t flex_group = ext4_flex_group(sbi,
|
ext4_group_t flex_group = ext4_flex_group(sbi,
|
||||||
ac->ac_b_ex.fe_group);
|
ac->ac_b_ex.fe_group);
|
||||||
atomic_sub(ac->ac_b_ex.fe_len,
|
atomic_sub(ac->ac_b_ex.fe_len,
|
||||||
&sbi->s_flex_groups[flex_group].free_blocks);
|
&sbi->s_flex_groups[flex_group].free_clusters);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh);
|
err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh);
|
||||||
|
@ -4696,7 +4696,8 @@ do_more:
|
||||||
|
|
||||||
if (sbi->s_log_groups_per_flex) {
|
if (sbi->s_log_groups_per_flex) {
|
||||||
ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
|
ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
|
||||||
atomic_add(count, &sbi->s_flex_groups[flex_group].free_blocks);
|
atomic_add(count_clusters,
|
||||||
|
&sbi->s_flex_groups[flex_group].free_clusters);
|
||||||
}
|
}
|
||||||
|
|
||||||
ext4_mb_unload_buddy(&e4b);
|
ext4_mb_unload_buddy(&e4b);
|
||||||
|
@ -4839,8 +4840,8 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
|
||||||
|
|
||||||
if (sbi->s_log_groups_per_flex) {
|
if (sbi->s_log_groups_per_flex) {
|
||||||
ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
|
ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
|
||||||
atomic_add(blocks_freed,
|
atomic_add(EXT4_B2C(sbi, blocks_freed),
|
||||||
&sbi->s_flex_groups[flex_group].free_blocks);
|
&sbi->s_flex_groups[flex_group].free_clusters);
|
||||||
}
|
}
|
||||||
|
|
||||||
ext4_mb_unload_buddy(&e4b);
|
ext4_mb_unload_buddy(&e4b);
|
||||||
|
|
|
@ -946,8 +946,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
|
||||||
sbi->s_log_groups_per_flex) {
|
sbi->s_log_groups_per_flex) {
|
||||||
ext4_group_t flex_group;
|
ext4_group_t flex_group;
|
||||||
flex_group = ext4_flex_group(sbi, input->group);
|
flex_group = ext4_flex_group(sbi, input->group);
|
||||||
atomic_add(input->free_blocks_count,
|
atomic_add(EXT4_B2C(sbi, input->free_blocks_count),
|
||||||
&sbi->s_flex_groups[flex_group].free_blocks);
|
&sbi->s_flex_groups[flex_group].free_clusters);
|
||||||
atomic_add(EXT4_INODES_PER_GROUP(sb),
|
atomic_add(EXT4_INODES_PER_GROUP(sb),
|
||||||
&sbi->s_flex_groups[flex_group].free_inodes);
|
&sbi->s_flex_groups[flex_group].free_inodes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2035,7 +2035,7 @@ static int ext4_fill_flex_info(struct super_block *sb)
|
||||||
atomic_add(ext4_free_inodes_count(sb, gdp),
|
atomic_add(ext4_free_inodes_count(sb, gdp),
|
||||||
&sbi->s_flex_groups[flex_group].free_inodes);
|
&sbi->s_flex_groups[flex_group].free_inodes);
|
||||||
atomic_add(ext4_free_blks_count(sb, gdp),
|
atomic_add(ext4_free_blks_count(sb, gdp),
|
||||||
&sbi->s_flex_groups[flex_group].free_blocks);
|
&sbi->s_flex_groups[flex_group].free_clusters);
|
||||||
atomic_add(ext4_used_dirs_count(sb, gdp),
|
atomic_add(ext4_used_dirs_count(sb, gdp),
|
||||||
&sbi->s_flex_groups[flex_group].used_dirs);
|
&sbi->s_flex_groups[flex_group].used_dirs);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue