Commit 24aaa8ef authored by Theodore Ts'o's avatar Theodore Ts'o

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: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 57042651
...@@ -300,7 +300,7 @@ struct ext4_group_desc ...@@ -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, ...@@ -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, ...@@ -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 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, ...@@ -370,8 +371,9 @@ static int find_group_flex(struct super_block *sb, struct inode *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 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, ...@@ -380,14 +382,14 @@ static int find_group_flex(struct super_block *sb, struct inode *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 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, ...@@ -407,7 +409,7 @@ static int find_group_flex(struct super_block *sb, struct inode *parent,
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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, ...@@ -4696,7 +4696,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
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, ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment