resize2fs: clear uninit BG if allocating from new group
PATCH 1/1 resize2fs: clear uninit BG if allocating from new group
If resize2fs_get_alloc_block() allocates from a BLOCK_UNINIT group, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap.
This shamelessly cuts & pastes clear_block_uninit() into resize2fs.c, and my problem goes away.
---
I've kind of lost the thread on resize2fs lately, so maybe this is a hack job? At least it highlights the issue, even if it's not quite right. Passes "make check" here and seems ok to me...
Thanks,
-Eric
resize/resize2fs.c +21 -0
@@ -1614,12 +1614,27 @@ static blk64_t get_new_block(ext2_resize_t rfs) } } +static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +{ +if (!ext2fs_has_group_desc_csum (fs) || + !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT ))) +return ; + +/* uninit block bitmaps are now initialized in read_bitmaps() */ + +ext2fs_bg_flags_clear (fs, group,EXT2_BG_BLOCK_UNINIT ); +ext2fs_group_desc_csum_set (fs, group); +ext2fs_mark_super_dirty (fs); +ext2fs_mark_bb_dirty (fs); +} +static errcode_t resize2fs_get_alloc_block (ext2_filsys fs, blk64_t goal EXT2FS_ATTR((unused)), blk64_t *ret) {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)
@@ -1632,6 +1647,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; }
Quoted 8 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap.This shamelessly cuts & pastes
clear_block_uninit()intoresize2fs.c, and my problem goes away.
Hmm... which test was it that exhibited this error?
Quoted 43 lines
Signed-off-by Eric Sandeen <[email protected]>---
I've kind of lost the thread on resize2fs lately, so maybe this is a hack job? At least it highlights the issue, even if it's not quite right. Passes "make check" here and seems ok to me...
Thanks,
(quoted diff) +0
-1-Ericresize/resize2fs.c +15
-0@@ -1614,12 +1614,27 @@ static blk64_t get_new_block(ext2_resize_t rfs) } } +static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +{ +if (!ext2fs_has_group_desc_csum (fs) || + !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT ))) +return ; + +/* uninit block bitmaps are now initialized in read_bitmaps() */ + +ext2fs_bg_flags_clear (fs, group,EXT2_BG_BLOCK_UNINIT ); +ext2fs_group_desc_csum_set (fs, group); +ext2fs_mark_super_dirty (fs); +ext2fs_mark_bb_dirty (fs); +} +static errcode_t resize2fs_get_alloc_block (ext2_filsys fs, blk64_t goal EXT2FS_ATTR((unused)), blk64_t *ret) {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)
resize/resize2fs.c static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, · line 1652
Quoted 6 lines
resize/resize2fs.c +3
-0@@ -1632,6 +1647,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group);
Why does the old fs need to have BLOCK_UNINIT cleared?
--D
Quoted 11 lines
resize/resize2fs.c +3
-1+ group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Quoted 8 lines · Darrick J. Wong
Quoted 8 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap.
Quoted 5 lines
Quoted 2 lines
This shamelessly cuts & pastes
clear_block_uninit()intoresize2fs.c, and my problem goes away.Hmm... which test was it that exhibited this error?
r_ext4_small_bg
Originally it was claimed that only a gcc change exposed it; I'm still trying to make sense of that. But the pre-resize image exhibits it with any recent resizefs when resized up to 2g as the test does.
Quoted 44 lines
Quoted 44 lines
Signed-off-by Eric Sandeen <[email protected]>---
I've kind of lost the thread on resize2fs lately, so maybe this is a hack job? At least it highlights the issue, even if it's not quite right. Passes "make check" here and seems ok to me...
Thanks,
(quoted diff) +0
-1-Ericresize/resize2fs.c +15
-0@@ -1614,12 +1614,27 @@ static blk64_t get_new_block(ext2_resize_t rfs) } } +static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +{ +if (!ext2fs_has_group_desc_csum (fs) || + !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT ))) +return ; + +/* uninit block bitmaps are now initialized in read_bitmaps() */ + +ext2fs_bg_flags_clear (fs, group,EXT2_BG_BLOCK_UNINIT ); +ext2fs_group_desc_csum_set (fs, group); +ext2fs_mark_super_dirty (fs); +ext2fs_mark_bb_dirty (fs); +} +static errcode_t resize2fs_get_alloc_block (ext2_filsys fs, blk64_t goal EXT2FS_ATTR((unused)), blk64_t *ret) {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1647,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,
Quoted 8 lines
resize/resize2fs.c static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, · line 1652
Quoted 5 lines
resize/resize2fs.c +3
-0ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group);Why does the old fs need to have
BLOCK_UNINITcleared?
Same reason we mark the block used in the old fs? TBH I didn't understand why we do that either, but sinc we do....
Eric
Quoted 13 lines
--D
Quoted 11 lines
resize/resize2fs.c +3
-1+ group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Quoted 12 lines · Eric Sandeen
Quoted 11 lines · Darrick J. Wong
Quoted 10 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap.This shamelessly cuts & pastes
clear_block_uninit()intoresize2fs.c, and my problem goes away.
Quoted 7 lines
Quoted 2 lines
Hmm... which test was it that exhibited this error?
r_ext4_small_bgOriginally it was claimed that only a gcc change exposed it; I'm still trying to make sense of that. But the pre-resize image exhibits it with any recent resizefs when resized up to 2g as the test does.
I think the only reason the different gcc tweaked the bug is that the test copies the e2fsck/e2fsck binary into the filesystem under test, and the size changes depending on the compiler.
I can put up an fs image that exhibits it if you're curious...
-Eric
Quoted 8 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap.This shamelessly cuts & pastes
clear_block_uninit()intoresize2fs.c, and my problem goes away.
Ping on this?
Quoted 61 lines
Signed-off-by Eric Sandeen <[email protected]>---
I've kind of lost the thread on resize2fs lately, so maybe this is a hack job? At least it highlights the issue, even if it's not quite right. Passes "make check" here and seems ok to me...
Thanks,
(quoted diff) +0
-1-Ericresize/resize2fs.c +21
-1@@ -1614,12 +1614,27 @@ static blk64_t get_new_block(ext2_resize_t rfs) } } +static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +{ +if (!ext2fs_has_group_desc_csum (fs) || + !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT ))) +return ; + +/* uninit block bitmaps are now initialized in read_bitmaps() */ + +ext2fs_bg_flags_clear (fs, group,EXT2_BG_BLOCK_UNINIT ); +ext2fs_group_desc_csum_set (fs, group); +ext2fs_mark_super_dirty (fs); +ext2fs_mark_bb_dirty (fs); +} +static errcode_t resize2fs_get_alloc_block (ext2_filsys fs, blk64_t goal EXT2FS_ATTR((unused)), blk64_t *ret) {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1647,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Quoted 8 lines · Eric Sandeen
Quoted 8 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap.
Quoted 4 lines
Quoted 2 lines
This shamelessly cuts & pastes
clear_block_uninit()intoresize2fs.c, and my problem goes away.Ping on this?
My only minor concern is about the code duplication. Is there a common place this could be moved?
Cheers, Andreas
Quoted 66 lines
Quoted 57 lines
Signed-off-by Eric Sandeen <[email protected]>---
I've kind of lost the thread on resize2fs lately, so maybe this is a hack job? At least it highlights the issue, even if it's not quite right. Passes "make check" here and seems ok to me...
Thanks,
(quoted diff) +0
-1-Ericresize/resize2fs.c +21
-1@@ -1614,12 +1614,27 @@ static blk64_t get_new_block(ext2_resize_t rfs) } } +static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +{ +if (!ext2fs_has_group_desc_csum (fs) || + !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT ))) +return ; + +/* uninit block bitmaps are now initialized in read_bitmaps() */ + +ext2fs_bg_flags_clear (fs, group,EXT2_BG_BLOCK_UNINIT ); +ext2fs_group_desc_csum_set (fs, group); +ext2fs_mark_super_dirty (fs); +ext2fs_mark_bb_dirty (fs); +} +static errcode_t resize2fs_get_alloc_block (ext2_filsys fs, blk64_t goal EXT2FS_ATTR((unused)), blk64_t *ret) {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1647,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --Quoted 4 lines
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--
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
PATCH v2 1/1 resize2fs: clear uninit BG if allocating from new group
In reply to Eric SandeenIf resize2fs_get_alloc_block() allocates from a BLOCK_UNINIT group, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen on r_ext4_small_bg.
This patch uses clear_block_uninit() to clear the flag, and my problem goes away.
---
V2: don't cut and paste, sorry! :)
Thanks,
-Eric
lib/ext2fs/alloc.c +1 -1
@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))
lib/ext2fs/ext2fs.h +1 -0
@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void clear_block_uninit (ext2_filsys fs,dgrp_t group);extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
resize/resize2fs.c +7 -0
@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)
@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; }
Quoted 35 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen onr_ext4_small_bg.This patch uses
clear_block_uninit()to clear the flag, and my problem goes away.Signed-off-by Eric Sandeen <[email protected]>---
V2: don't cut and paste, sorry! :)
Thanks,
(quoted diff) +0
-1-Ericlib/ext2fs/alloc.c +1
-1@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))lib/ext2fs/ext2fs.h +0
-0
lib/ext2fs/ext2fs.h static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) · line 650
Quoted 4 lines
lib/ext2fs/ext2fs.h +1
-0@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void clear_block_uninit (ext2_filsys fs,dgrp_t group);
If you're going to expose this as a new API call then this needs to be ext2fs_clear_block_uninit().
(Do we want a flags arg just in case we ever need one?)
--D
Quoted 33 lines
lib/ext2fs/ext2fs.h +0
-0extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,resize/resize2fs.c +7
-1@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Quoted 1 line · Darrick J. Wong
On Thu, Jan 14, 2016 at 12:46:03PM -0600, Eric Sandeen wrote:
...
Quoted 7 lines
Quoted 7 lines
lib/ext2fs/ext2fs.h +0
-0@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }
Quoted 5 lines
lib/ext2fs/ext2fs.h static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) · line 650
Quoted 2 lines
lib/ext2fs/ext2fs.h +1
-0/* alloc.c */ +extern void clear_block_uninit (ext2_filsys fs,dgrp_t group);If you're going to expose this as a new API call then this needs to be
ext2fs_clear_block_uninit().
Hm, yes. I tried to work around it but don't see a nice way.
Quoted 1 line
(Do we want a flags arg just in case we ever need one?)
No. ;)
(EXT2_CLEAR_GROUP_UNINIT_HALFWAY? I can't really think of any reasonable variation on "clear this group's uninit status")
-Eric
PATCH v3 1/1 resize2fs: clear uninit BG if allocating from new group
In reply to Eric SandeenIf resize2fs_get_alloc_block() allocates from a BLOCK_UNINIT group, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen on r_ext4_small_bg.
This patch uses clear_block_uninit() to clear the flag, and my problem goes away.
---
V2: don't cut and paste, sorry!
V3: ext2fs_* namespace for the exported function, thanks Darrick
Thanks,
-Eric
lib/ext2fs/alloc.c +3 -3
@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))
@@ -183,7 +183,7 @@ allocated:if (retval)return retval; -clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); *ret = b;return 0 ; }
@@ -455,7 +455,7 @@ errcode_t ext2fs_new_range(ext2_filsys fs, int flags, blk64_t goal, allocated:for (b = start; b < end; b += fs->super->s_blocks_per_group) -clear_block_uninit (fs, +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b));return 0 ; }
lib/ext2fs/ext2fs.h +1 -0
@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group);extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
resize/resize2fs.c +7 -0
@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)
@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +ext2fs_clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +ext2fs_clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; }
Quoted 8 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen onr_ext4_small_bg.This patch uses
clear_block_uninit()to clear the flag, and my problem goes away.
Looks reasonable,
--D
Quoted 83 lines
Signed-off-by Eric Sandeen <[email protected]>---
V2: don't cut and paste, sorry!
V3: ext2fs_* namespace for the exported function, thanks DarrickThanks,
(quoted diff) +0
-1-Ericlib/ext2fs/alloc.c +3
-3@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))@@ -183,7 +183,7 @@ allocated:if (retval)return retval; -clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); *ret = b;return 0 ; }@@ -455,7 +455,7 @@ errcode_t ext2fs_new_range(ext2_filsys fs, int flags, blk64_t goal, allocated:for (b = start; b < end; b += fs->super->s_blocks_per_group) -clear_block_uninit (fs, +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b));return 0 ; }lib/ext2fs/ext2fs.h +1
-0@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group);extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,resize/resize2fs.c +7
-1@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +ext2fs_clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +ext2fs_clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Quoted 11 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen onr_ext4_small_bg.This patch uses
clear_block_uninit()to clear the flag, and my problem goes away.Signed-off-by Eric Sandeen <[email protected]>
Quoted 78 lines
---
V2: don't cut and paste, sorry!
V3: ext2fs_* namespace for the exported function, thanks DarrickThanks,
(quoted diff) +0
-1-Ericlib/ext2fs/alloc.c +2
-2@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))@@ -183,7 +183,7 @@ allocated:if (retval)return retval; -clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); *ret = b;return 0 ; }@@ -455,7 +455,7 @@ errcode_t ext2fs_new_range(ext2_filsys fs, int flags, blk64_t goal,allocated:
for (b = start; b < end; b += fs->super->s_blocks_per_group)lib/ext2fs/alloc.c +1
-1- clear_block_uninit(fs, + ext2fs_clear_block_uninit(fs,ext2fs_group_of_blk2(fs, b)); return 0; }lib/ext2fs/ext2fs.h +1
-0@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group);extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,resize/resize2fs.c +7
-1@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +ext2fs_clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +ext2fs_clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --
Quoted 3 lines
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
Cheers, Andreas
Quoted 8 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen onr_ext4_small_bg.This patch uses
clear_block_uninit()to clear the flag, and my problem goes away.
Ted, if you want to clarify the commit log, I realized that the issue here is that although we are called via ->get_alloc_block, and the caller clears uninit after the call, in resize-land we have *2* filesystems to deal with, hanging off the fs private pointer. Explicitly clearing uninit in both filesystems in the resize code seems like the safest path.
Quoted 83 lines
Signed-off-by Eric Sandeen <[email protected]>---
V2: don't cut and paste, sorry!
V3: ext2fs_* namespace for the exported function, thanks DarrickThanks,
(quoted diff) +0
-1-Ericlib/ext2fs/alloc.c +3
-3@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))@@ -183,7 +183,7 @@ allocated:if (retval)return retval; -clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); *ret = b;return 0 ; }@@ -455,7 +455,7 @@ errcode_t ext2fs_new_range(ext2_filsys fs, int flags, blk64_t goal, allocated:for (b = start; b < end; b += fs->super->s_blocks_per_group) -clear_block_uninit (fs, +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b));return 0 ; }lib/ext2fs/ext2fs.h +1
-0@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group);extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,resize/resize2fs.c +7
-1@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +ext2fs_clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +ext2fs_clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Quoted 6 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen onr_ext4_small_bg.
Quoted 8 lines
This patch uses
clear_block_uninit()to clear the flag, and my problem goes away.Signed-off-by Eric Sandeen <[email protected]>---
V2: don't cut and paste, sorry!
V3: ext2fs_* namespace for the exported function, thanks Darrick
Ted, any chance this could get merged? It has 2 reviews now.
Thanks,
-Eric
Quoted 77 lines
Thanks,
(quoted diff) +0
-1-Ericlib/ext2fs/alloc.c +3
-3@@ -39,7 +39,7 @@/* * Clear the uninit block bitmap flag if necessary */ -static void clear_block_uninit (ext2_filsys fs,dgrp_t group) +void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group) {if (!ext2fs_has_group_desc_csum (fs) || !(ext2fs_bg_flags_test (fs, group,EXT2_BG_BLOCK_UNINIT )))@@ -183,7 +183,7 @@ allocated:if (retval)return retval; -clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b)); *ret = b;return 0 ; }@@ -455,7 +455,7 @@ errcode_t ext2fs_new_range(ext2_filsys fs, int flags, blk64_t goal, allocated:for (b = start; b < end; b += fs->super->s_blocks_per_group) -clear_block_uninit (fs, +ext2fs_clear_block_uninit (fs,ext2fs_group_of_blk2 (fs, b));return 0 ; }lib/ext2fs/ext2fs.h +1
-0@@ -647,6 +647,7 @@ static inline int ext2fs_needs_large_file_feature(unsigned long long file_size) }/* alloc.c */ +extern void ext2fs_clear_block_uninit (ext2_filsys fs,dgrp_t group);extern errcode_t ext2fs_new_inode (ext2_filsys fs,ext2_ino_t dir,int mode,ext2fs_inode_bitmap map,ext2_ino_t *ret); extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,resize/resize2fs.c +7
-1@@ -1620,6 +1620,7 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs, {ext2_resize_t rfs = (ext2_resize_t ) fs->priv_data;blk64_t blk; +int group; blk =get_new_block (rfs);if (!blk)@@ -1632,6 +1633,12 @@ static errcode_t resize2fs_get_alloc_block(ext2_filsys fs,ext2fs_mark_block_bitmap2 (rfs->old_fs->block_map, blk);ext2fs_mark_block_bitmap2 (rfs->new_fs->block_map, blk); + + group =ext2fs_group_of_blk2 (rfs->old_fs, blk); +ext2fs_clear_block_uninit (rfs->old_fs, group); + group =ext2fs_group_of_blk2 (rfs->new_fs, blk); +ext2fs_clear_block_uninit (rfs->new_fs, group); + *ret = (blk64_t ) blk;return 0 ; } --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
Theodore Ts'o
AppliedQuoted 10 lines · Eric Sandeen
If
resize2fs_get_alloc_block()allocates from aBLOCK_UNINITgroup, nothing clears the UNINIT flag, so it is skipped when we go to write out modified bitmaps. This leads to post-resize2fs e2fsck errors; used blocks in UNINIT groups, not marked in the block bitmap. This was seen onr_ext4_small_bg.This patch uses
clear_block_uninit()to clear the flag, and my problem goes away.Signed-off-by Eric Sandeen <[email protected]>
Thanks, applied. Apologies for the delay.
- Ted