2013-05-03 21:06:57

by Eric Sandeen

[permalink] [raw]
Subject: [PATCH] ext4: recalculate s_blockfile_groups during resize2fs

s_blockfile_groups is used to limit allocations for non-extent
files to block groups with block numbers less than 2^32.
However, it's not updated when the filesystem is resized online,
so the new groups are unavailable to non-extent files until a remount.

Fix this by updating the value in ext4_update_super() at
resize time.

Signed-off-by: Eric Sandeen <[email protected]>
---

diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
index c169477..1357260 100644
--- a/fs/ext4/resize.c
+++ b/fs/ext4/resize.c
@@ -1341,6 +1341,8 @@ static void ext4_update_super(struct super_block *sb,

/* Update the global fs size fields */
sbi->s_groups_count += flex_gd->count;
+ sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,
+ (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));

/* Update the reserved block counts only once the new group is
* active. */



2013-05-06 00:36:17

by Lachlan McIlroy

[permalink] [raw]
Subject: Re: [PATCH] ext4: recalculate s_blockfile_groups during resize2fs

----- Original Message -----
> s_blockfile_groups is used to limit allocations for non-extent
> files to block groups with block numbers less than 2^32.
> However, it's not updated when the filesystem is resized online,
> so the new groups are unavailable to non-extent files until a remount.
>
> Fix this by updating the value in ext4_update_super() at
> resize time.
>
> Signed-off-by: Eric Sandeen <[email protected]>
> ---
>
> diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
> index c169477..1357260 100644
> --- a/fs/ext4/resize.c
> +++ b/fs/ext4/resize.c
> @@ -1341,6 +1341,8 @@ static void ext4_update_super(struct super_block *sb,
>
> /* Update the global fs size fields */
> sbi->s_groups_count += flex_gd->count;
> + sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,
> + (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));
>
> /* Update the reserved block counts only once the new group is
> * active. */
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>

Good catch Eric - this would have prevented the bug in
ext4_mb_regular_allocator() too. Looks good to me.

2013-05-06 02:08:12

by Eric Sandeen

[permalink] [raw]
Subject: Re: [PATCH] ext4: recalculate s_blockfile_groups during resize2fs

On 5/5/13 7:36 PM, Lachlan McIlroy wrote:
> ----- Original Message -----
>> s_blockfile_groups is used to limit allocations for non-extent
>> files to block groups with block numbers less than 2^32.
>> However, it's not updated when the filesystem is resized online,
>> so the new groups are unavailable to non-extent files until a remount.
>>
>> Fix this by updating the value in ext4_update_super() at
>> resize time.
>>
>> Signed-off-by: Eric Sandeen <[email protected]>
>> ---
>>
>> diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
>> index c169477..1357260 100644
>> --- a/fs/ext4/resize.c
>> +++ b/fs/ext4/resize.c
>> @@ -1341,6 +1341,8 @@ static void ext4_update_super(struct super_block *sb,
>>
>> /* Update the global fs size fields */
>> sbi->s_groups_count += flex_gd->count;
>> + sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,
>> + (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));
>>
>> /* Update the reserved block counts only once the new group is
>> * active. */
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>
> Good catch Eric - this would have prevented the bug in
> ext4_mb_regular_allocator() too. Looks good to me.

Yep - at least until the filesystem grows > 16TB :)

-Eric


2013-05-06 03:06:42

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] ext4: recalculate s_blockfile_groups during resize2fs

On Fri, May 03, 2013 at 04:06:56PM -0500, Eric Sandeen wrote:
> s_blockfile_groups is used to limit allocations for non-extent
> files to block groups with block numbers less than 2^32.
> However, it's not updated when the filesystem is resized online,
> so the new groups are unavailable to non-extent files until a remount.
>
> Fix this by updating the value in ext4_update_super() at
> resize time.
>
> Signed-off-by: Eric Sandeen <[email protected]>

I sent out a patch about two weeks ago, which has since been accepted
into Linus's tree as commit c5c72d814cf0. It's been marked for the
for backporting into the stable trees.

Cheers,

- Ted

commit c5c72d814cf0f650010337c73638b25e6d14d2d4
Author: Theodore Ts'o <[email protected]>
Date: Sun Apr 21 20:19:43 2013 -0400

ext4: fix online resizing for ext3-compat file systems

Commit fb0a387dcdc restricts block allocations for indirect-mapped
files to block groups less than s_blockfile_groups. However, the
online resizing code wasn't setting s_blockfile_groups, so the newly
added block groups were not available for non-extent mapped files.

Reported-by: Eric Sandeen <[email protected]>
Signed-off-by: "Theodore Ts'o" <[email protected]>
Cc: [email protected]

2013-05-06 03:31:23

by Eric Sandeen

[permalink] [raw]
Subject: Re: [PATCH] ext4: recalculate s_blockfile_groups during resize2fs

On May 5, 2013, at 10:06 PM, "Theodore Ts'o" <[email protected]> wrote:

> On Fri, May 03, 2013 at 04:06:56PM -0500, Eric Sandeen wrote:
>> s_blockfile_groups is used to limit allocations for non-extent
>> files to block groups with block numbers less than 2^32.
>> However, it's not updated when the filesystem is resized online,
>> so the new groups are unavailable to non-extent files until a remount.
>>
>> Fix this by updating the value in ext4_update_super() at
>> resize time.
>>
>> Signed-off-by: Eric Sandeen <[email protected]>
>
> I sent out a patch about two weeks ago, which has since been accepted
> into Linus's tree as commit c5c72d814cf0. It's been marked for the
> for backporting into the stable trees.
>
Argh, so you did! One demerit for me for forgetting, and another for patching an old tree....

Thanks,
Eric

> Cheers,
>
> - Ted
>
> commit c5c72d814cf0f650010337c73638b25e6d14d2d4
> Author: Theodore Ts'o <[email protected]>
> Date: Sun Apr 21 20:19:43 2013 -0400
>
> ext4: fix online resizing for ext3-compat file systems
>
> Commit fb0a387dcdc restricts block allocations for indirect-mapped
> files to block groups less than s_blockfile_groups. However, the
> online resizing code wasn't setting s_blockfile_groups, so the newly
> added block groups were not available for non-extent mapped files.
>
> Reported-by: Eric Sandeen <[email protected]>
> Signed-off-by: "Theodore Ts'o" <[email protected]>
> Cc: [email protected]