| From c89849cc0259f3d33624cc3bd127685c3c0fa25d Mon Sep 17 00:00:00 2001 |
| From: Pan Dong <pandong.peter@bytedance.com> |
| Date: Tue, 25 May 2021 15:36:56 +0800 |
| Subject: ext4: fix avefreec in find_group_orlov |
| |
| From: Pan Dong <pandong.peter@bytedance.com> |
| |
| commit c89849cc0259f3d33624cc3bd127685c3c0fa25d upstream. |
| |
| The avefreec should be average free clusters instead |
| of average free blocks, otherwize Orlov's allocator |
| will not work properly when bigalloc enabled. |
| |
| Cc: stable@kernel.org |
| Signed-off-by: Pan Dong <pandong.peter@bytedance.com> |
| Link: https://lore.kernel.org/r/20210525073656.31594-1-pandong.peter@bytedance.com |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ext4/ialloc.c | 11 +++++------ |
| 1 file changed, 5 insertions(+), 6 deletions(-) |
| |
| --- a/fs/ext4/ialloc.c |
| +++ b/fs/ext4/ialloc.c |
| @@ -402,7 +402,7 @@ static void get_orlov_stats(struct super |
| * |
| * We always try to spread first-level directories. |
| * |
| - * If there are blockgroups with both free inodes and free blocks counts |
| + * If there are blockgroups with both free inodes and free clusters counts |
| * not worse than average we return one with smallest directory count. |
| * Otherwise we simply return a random group. |
| * |
| @@ -411,7 +411,7 @@ static void get_orlov_stats(struct super |
| * It's OK to put directory into a group unless |
| * it has too many directories already (max_dirs) or |
| * it has too few free inodes left (min_inodes) or |
| - * it has too few free blocks left (min_blocks) or |
| + * it has too few free clusters left (min_clusters) or |
| * Parent's group is preferred, if it doesn't satisfy these |
| * conditions we search cyclically through the rest. If none |
| * of the groups look good we just look for a group with more |
| @@ -427,7 +427,7 @@ static int find_group_orlov(struct super |
| ext4_group_t real_ngroups = ext4_get_groups_count(sb); |
| int inodes_per_group = EXT4_INODES_PER_GROUP(sb); |
| unsigned int freei, avefreei, grp_free; |
| - ext4_fsblk_t freeb, avefreec; |
| + ext4_fsblk_t freec, avefreec; |
| unsigned int ndirs; |
| int max_dirs, min_inodes; |
| ext4_grpblk_t min_clusters; |
| @@ -446,9 +446,8 @@ static int find_group_orlov(struct super |
| |
| freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter); |
| avefreei = freei / ngroups; |
| - freeb = EXT4_C2B(sbi, |
| - percpu_counter_read_positive(&sbi->s_freeclusters_counter)); |
| - avefreec = freeb; |
| + freec = percpu_counter_read_positive(&sbi->s_freeclusters_counter); |
| + avefreec = freec; |
| do_div(avefreec, ngroups); |
| ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter); |
| |