2019-03-07 11:49:50

by Artem Blagodarenko

[permalink] [raw]
Subject: [PATCH] ext4: check if group has free space

Regular allocator make four groups processing loops to
find good group to allocate blocks. On 4th loop it accept any
group, even if there is no free space at all.

This patch adds group free space check to skip full groups.

Sigend-off-by: Artem Blagodarenko <[email protected]>
---
fs/ext4/mballoc.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index e2248083cdca..4e6c36ff1d55 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -2087,7 +2087,8 @@ static int ext4_mb_good_group(struct ext4_allocation_context *ac,
return 1;
break;
case 3:
- return 1;
+ /* Skip group without any free space */
+ return free ? 1 : 0;
default:
BUG();
}
--
2.14.3



2019-03-15 04:31:25

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] ext4: check if group has free space

On Thu, Mar 07, 2019 at 02:49:14PM +0300, Artem Blagodarenko wrote:
> Regular allocator make four groups processing loops to
> find good group to allocate blocks. On 4th loop it accept any
> group, even if there is no free space at all.
>
> This patch adds group free space check to skip full groups.
>
> Sigend-off-by: Artem Blagodarenko <[email protected]>

This patch doesn't change anything. Note the check that we have at
the very beginning of ext4_mb_good_group():

free = grp->bb_free;
if (free == 0)
return 0;

This is before we even go into the case statement, so your change:

> case 3:
> - return 1;
> + /* Skip group without any free space */
> + return free ? 1 : 0;

is a no-op; we will always be returning 1, since if free == 0, we would
have bailed out at the top of the function.

Cheers,

- Ted