This came about as part of auditing prandom_u32() usage, but this is a special case: sometimes the starting value comes from prandom_u32, and sometimes it comes from a hash of a name. Does the name hash algorithm have to be stable? In that case, this change would alter it. But it appears to use s_hash_seed which is regenerated on "e2fsck -D", so maybe changing it isn't a big deal. Feedback needed. Signed-off-by: George Spelvin <lkml@xxxxxxx> Cc: "Theodore Ts'o" <tytso@xxxxxxx> Cc: Andreas Dilger <adilger.kernel@xxxxxxxxx> Cc: linux-ext4@xxxxxxxxxxxxxxx --- fs/ext4/ialloc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 7db0c8814f2ec..a4ea89b3ed368 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -457,9 +457,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, grp = hinfo.hash; } else grp = prandom_u32(); - parent_group = (unsigned)grp % ngroups; - for (i = 0; i < ngroups; i++) { - g = (parent_group + i) % ngroups; + g = parent_group = reciprocal_scale(grp, ngroups); + for (i = 0; i < ngroups; i++, ++g == ngroups && (g = 0)) { get_orlov_stats(sb, g, flex_size, &stats); if (!stats.free_inodes) continue; -- 2.26.0