diff mbox

ext4: recalculate s_blockfile_groups during resize2fs

Message ID 518426F0.1000103@redhat.com
State Not Applicable, archived
Headers show

Commit Message

Eric Sandeen May 3, 2013, 9:06 p.m. UTC
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 <sandeen@redhat.com>
---


--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Lachlan McIlroy May 6, 2013, 12:36 a.m. UTC | #1
----- 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 <sandeen@redhat.com>
> ---
> 
> 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 majordomo@vger.kernel.org
> 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.
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen May 6, 2013, 2:08 a.m. UTC | #2
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 <sandeen@redhat.com>
>> ---
>>
>> 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 majordomo@vger.kernel.org
>> 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

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Theodore Ts'o May 6, 2013, 3:06 a.m. UTC | #3
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 <sandeen@redhat.com>

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 <tytso@mit.edu>
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 <sandeen@redhat.com>
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    Cc: stable@vger.kernel.org
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Sandeen May 6, 2013, 3:31 a.m. UTC | #4
On May 5, 2013, at 10:06 PM, "Theodore Ts'o" <tytso@mit.edu> 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 <sandeen@redhat.com>
> 
> 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 <tytso@mit.edu>
> 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 <sandeen@redhat.com>
>    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
>    Cc: stable@vger.kernel.org
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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. */