Loading fs/ext4/ext4.h +1 −1 Original line number Diff line number Diff line Loading @@ -300,7 +300,7 @@ struct ext4_group_desc struct flex_groups { atomic_t free_inodes; atomic_t free_blocks; atomic_t free_clusters; atomic_t used_dirs; }; Loading fs/ext4/ialloc.c +21 −19 Original line number Diff line number Diff line Loading @@ -346,7 +346,7 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, int flex_size = ext4_flex_bg_size(sbi); ext4_group_t best_flex = parent_fbg_group; int blocks_per_flex = sbi->s_blocks_per_group * flex_size; int flexbg_free_blocks; int flexbg_free_clusters; int flex_freeb_ratio; ext4_group_t n_fbg_groups; ext4_group_t i; Loading @@ -355,8 +355,9 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, sbi->s_log_groups_per_flex; find_close_to_parent: flexbg_free_blocks = atomic_read(&flex_group[best_flex].free_blocks); flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex; flexbg_free_clusters = atomic_read(&flex_group[best_flex].free_clusters); flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 / blocks_per_flex; if (atomic_read(&flex_group[best_flex].free_inodes) && flex_freeb_ratio > free_block_ratio) goto found_flexbg; Loading @@ -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) continue; flexbg_free_blocks = atomic_read(&flex_group[i].free_blocks); flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex; flexbg_free_clusters = atomic_read(&flex_group[i].free_clusters); flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 / blocks_per_flex; if (flex_freeb_ratio > free_block_ratio && (atomic_read(&flex_group[i].free_inodes))) { Loading @@ -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) || ((atomic_read(&flex_group[i].free_blocks) > atomic_read(&flex_group[best_flex].free_blocks)) && ((atomic_read(&flex_group[i].free_clusters) > atomic_read(&flex_group[best_flex].free_clusters)) && atomic_read(&flex_group[i].free_inodes))) best_flex = i; } 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; found_flexbg: Loading @@ -407,7 +409,7 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, struct orlov_stats { __u32 free_inodes; __u32 free_blocks; __u32 free_clusters; __u32 used_dirs; }; Loading @@ -424,7 +426,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g, if (flex_size > 1) { 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); return; } Loading @@ -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); if (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); } else { stats->free_inodes = 0; stats->free_blocks = 0; stats->free_clusters = 0; stats->used_dirs = 0; } } Loading Loading @@ -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); int inodes_per_group = EXT4_INODES_PER_GROUP(sb); unsigned int freei, avefreei; ext4_fsblk_t freeb, avefreeb; ext4_fsblk_t freeb, avefreec; unsigned int ndirs; int max_dirs, min_inodes; ext4_grpblk_t min_blocks; ext4_grpblk_t min_clusters; ext4_group_t i, grp, g, ngroups; struct ext4_group_desc *desc; struct orlov_stats stats; Loading @@ -492,8 +494,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, avefreei = freei / ngroups; freeb = EXT4_C2B(sbi, percpu_counter_read_positive(&sbi->s_freeclusters_counter)); avefreeb = freeb; do_div(avefreeb, ngroups); avefreec = freeb; do_div(avefreec, ngroups); ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter); if (S_ISDIR(mode) && Loading @@ -519,7 +521,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, continue; if (stats.free_inodes < avefreei) continue; if (stats.free_blocks < avefreeb) if (stats.free_clusters < avefreec) continue; grp = g; ret = 0; Loading Loading @@ -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; if (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 Loading @@ -576,7 +578,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, continue; if (stats.free_inodes < min_inodes) continue; if (stats.free_blocks < min_blocks) if (stats.free_clusters < min_clusters) continue; goto found_flex_bg; } Loading fs/ext4/mballoc.c +5 −4 Original line number Diff line number Diff line Loading @@ -2847,7 +2847,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, ext4_group_t flex_group = ext4_flex_group(sbi, ac->ac_b_ex.fe_group); 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); Loading Loading @@ -4696,7 +4696,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, if (sbi->s_log_groups_per_flex) { 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); Loading Loading @@ -4839,8 +4840,8 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, if (sbi->s_log_groups_per_flex) { ext4_group_t flex_group = ext4_flex_group(sbi, block_group); atomic_add(blocks_freed, &sbi->s_flex_groups[flex_group].free_blocks); atomic_add(EXT4_B2C(sbi, blocks_freed), &sbi->s_flex_groups[flex_group].free_clusters); } ext4_mb_unload_buddy(&e4b); Loading fs/ext4/resize.c +2 −2 Original line number Diff line number Diff line Loading @@ -946,8 +946,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) sbi->s_log_groups_per_flex) { ext4_group_t flex_group; flex_group = ext4_flex_group(sbi, input->group); atomic_add(input->free_blocks_count, &sbi->s_flex_groups[flex_group].free_blocks); atomic_add(EXT4_B2C(sbi, input->free_blocks_count), &sbi->s_flex_groups[flex_group].free_clusters); atomic_add(EXT4_INODES_PER_GROUP(sb), &sbi->s_flex_groups[flex_group].free_inodes); } Loading fs/ext4/super.c +1 −1 Original line number Diff line number Diff line Loading @@ -2035,7 +2035,7 @@ static int ext4_fill_flex_info(struct super_block *sb) atomic_add(ext4_free_inodes_count(sb, gdp), &sbi->s_flex_groups[flex_group].free_inodes); 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), &sbi->s_flex_groups[flex_group].used_dirs); } Loading Loading
fs/ext4/ext4.h +1 −1 Original line number Diff line number Diff line Loading @@ -300,7 +300,7 @@ struct ext4_group_desc struct flex_groups { atomic_t free_inodes; atomic_t free_blocks; atomic_t free_clusters; atomic_t used_dirs; }; Loading
fs/ext4/ialloc.c +21 −19 Original line number Diff line number Diff line Loading @@ -346,7 +346,7 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, int flex_size = ext4_flex_bg_size(sbi); ext4_group_t best_flex = parent_fbg_group; int blocks_per_flex = sbi->s_blocks_per_group * flex_size; int flexbg_free_blocks; int flexbg_free_clusters; int flex_freeb_ratio; ext4_group_t n_fbg_groups; ext4_group_t i; Loading @@ -355,8 +355,9 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, sbi->s_log_groups_per_flex; find_close_to_parent: flexbg_free_blocks = atomic_read(&flex_group[best_flex].free_blocks); flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex; flexbg_free_clusters = atomic_read(&flex_group[best_flex].free_clusters); flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 / blocks_per_flex; if (atomic_read(&flex_group[best_flex].free_inodes) && flex_freeb_ratio > free_block_ratio) goto found_flexbg; Loading @@ -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) continue; flexbg_free_blocks = atomic_read(&flex_group[i].free_blocks); flex_freeb_ratio = flexbg_free_blocks * 100 / blocks_per_flex; flexbg_free_clusters = atomic_read(&flex_group[i].free_clusters); flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 / blocks_per_flex; if (flex_freeb_ratio > free_block_ratio && (atomic_read(&flex_group[i].free_inodes))) { Loading @@ -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) || ((atomic_read(&flex_group[i].free_blocks) > atomic_read(&flex_group[best_flex].free_blocks)) && ((atomic_read(&flex_group[i].free_clusters) > atomic_read(&flex_group[best_flex].free_clusters)) && atomic_read(&flex_group[i].free_inodes))) best_flex = i; } 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; found_flexbg: Loading @@ -407,7 +409,7 @@ static int find_group_flex(struct super_block *sb, struct inode *parent, struct orlov_stats { __u32 free_inodes; __u32 free_blocks; __u32 free_clusters; __u32 used_dirs; }; Loading @@ -424,7 +426,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g, if (flex_size > 1) { 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); return; } Loading @@ -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); if (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); } else { stats->free_inodes = 0; stats->free_blocks = 0; stats->free_clusters = 0; stats->used_dirs = 0; } } Loading Loading @@ -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); int inodes_per_group = EXT4_INODES_PER_GROUP(sb); unsigned int freei, avefreei; ext4_fsblk_t freeb, avefreeb; ext4_fsblk_t freeb, avefreec; unsigned int ndirs; int max_dirs, min_inodes; ext4_grpblk_t min_blocks; ext4_grpblk_t min_clusters; ext4_group_t i, grp, g, ngroups; struct ext4_group_desc *desc; struct orlov_stats stats; Loading @@ -492,8 +494,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, avefreei = freei / ngroups; freeb = EXT4_C2B(sbi, percpu_counter_read_positive(&sbi->s_freeclusters_counter)); avefreeb = freeb; do_div(avefreeb, ngroups); avefreec = freeb; do_div(avefreec, ngroups); ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter); if (S_ISDIR(mode) && Loading @@ -519,7 +521,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, continue; if (stats.free_inodes < avefreei) continue; if (stats.free_blocks < avefreeb) if (stats.free_clusters < avefreec) continue; grp = g; ret = 0; Loading Loading @@ -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; if (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 Loading @@ -576,7 +578,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, continue; if (stats.free_inodes < min_inodes) continue; if (stats.free_blocks < min_blocks) if (stats.free_clusters < min_clusters) continue; goto found_flex_bg; } Loading
fs/ext4/mballoc.c +5 −4 Original line number Diff line number Diff line Loading @@ -2847,7 +2847,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, ext4_group_t flex_group = ext4_flex_group(sbi, ac->ac_b_ex.fe_group); 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); Loading Loading @@ -4696,7 +4696,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, if (sbi->s_log_groups_per_flex) { 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); Loading Loading @@ -4839,8 +4840,8 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, if (sbi->s_log_groups_per_flex) { ext4_group_t flex_group = ext4_flex_group(sbi, block_group); atomic_add(blocks_freed, &sbi->s_flex_groups[flex_group].free_blocks); atomic_add(EXT4_B2C(sbi, blocks_freed), &sbi->s_flex_groups[flex_group].free_clusters); } ext4_mb_unload_buddy(&e4b); Loading
fs/ext4/resize.c +2 −2 Original line number Diff line number Diff line Loading @@ -946,8 +946,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) sbi->s_log_groups_per_flex) { ext4_group_t flex_group; flex_group = ext4_flex_group(sbi, input->group); atomic_add(input->free_blocks_count, &sbi->s_flex_groups[flex_group].free_blocks); atomic_add(EXT4_B2C(sbi, input->free_blocks_count), &sbi->s_flex_groups[flex_group].free_clusters); atomic_add(EXT4_INODES_PER_GROUP(sb), &sbi->s_flex_groups[flex_group].free_inodes); } Loading
fs/ext4/super.c +1 −1 Original line number Diff line number Diff line Loading @@ -2035,7 +2035,7 @@ static int ext4_fill_flex_info(struct super_block *sb) atomic_add(ext4_free_inodes_count(sb, gdp), &sbi->s_flex_groups[flex_group].free_inodes); 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), &sbi->s_flex_groups[flex_group].used_dirs); } Loading