Skip to content

Commit e615573

Browse files
Lachlan McIlroytytso
Lachlan McIlroy
authored andcommitted
ext4: limit group search loop for non-extent files
In the case where we are allocating for a non-extent file, we must limit the groups we allocate from to those below 2^32 blocks, and ext4_mb_regular_allocator() attempts to do this initially by putting a cap on ngroups for the subsequent search loop. However, the initial target group comes in from the allocation context (ac), and it may already be beyond the artificially limited ngroups. In this case, the limit if (group == ngroups) group = 0; at the top of the loop is never true, and the loop will run away. Catch this case inside the loop and reset the search to start at group 0. [[email protected]: add commit msg & comments] Signed-off-by: Lachlan McIlroy <[email protected]> Signed-off-by: Eric Sandeen <[email protected]> Signed-off-by: "Theodore Ts'o" <[email protected]> Cc: [email protected]
1 parent e30b5dc commit e615573

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

fs/ext4/mballoc.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2105,7 +2105,11 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
21052105
group = ac->ac_g_ex.fe_group;
21062106

21072107
for (i = 0; i < ngroups; group++, i++) {
2108-
if (group == ngroups)
2108+
/*
2109+
* Artificially restricted ngroups for non-extent
2110+
* files makes group > ngroups possible on first loop.
2111+
*/
2112+
if (group >= ngroups)
21092113
group = 0;
21102114

21112115
/* This now checks without needing the buddy page */

0 commit comments

Comments
 (0)