| From e6155736ad76b2070652745f9e54cdea3f0d8567 Mon Sep 17 00:00:00 2001 |
| From: Lachlan McIlroy <lmcilroy@redhat.com> |
| Date: Sun, 5 May 2013 23:10:00 -0400 |
| Subject: ext4: limit group search loop for non-extent files |
| |
| From: Lachlan McIlroy <lmcilroy@redhat.com> |
| |
| commit e6155736ad76b2070652745f9e54cdea3f0d8567 upstream. |
| |
| 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. |
| |
| [sandeen@redhat.com: add commit msg & comments] |
| |
| Signed-off-by: Lachlan McIlroy <lmcilroy@redhat.com> |
| Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ext4/mballoc.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/fs/ext4/mballoc.c |
| +++ b/fs/ext4/mballoc.c |
| @@ -1994,7 +1994,11 @@ repeat: |
| group = ac->ac_g_ex.fe_group; |
| |
| for (i = 0; i < ngroups; group++, i++) { |
| - if (group == ngroups) |
| + /* |
| + * Artificially restricted ngroups for non-extent |
| + * files makes group > ngroups possible on first loop. |
| + */ |
| + if (group >= ngroups) |
| group = 0; |
| |
| /* This now checks without needing the buddy page */ |