On Sat, Jan 14, 2012 at 7:02 AM, Andreas Dilger <adilger@xxxxxxxxx> wrote: > > On 2012-01-13, at 2:30 PM, Theodore Ts'o wrote: > > We don't need to initialize the block bitmap when we allocate a new > > inode. > > The reason the block bitmap is initialized when an inode is allocated > in that group is to indicate that the inode bitmap is in use, and the > inode table blocks are also in use. but the inode table blocks will not be from this block group when flex_bg is used and if it's the first group of a flex_bg group, then it's bitmaps are already initialized by mkfs/resize. > > > This is old code from the very early days that is just > > confusing things, and also has the problem of modifying the block > > group descriptor without obeying the ext4_journal_get_write_access() / > > ext4_handle_dirty_metadata() modification protocols. > > The group descriptor was already modified earlier on when the inode was > being allocated from the group, so the group descriptor block was already > accounted for in the transaction credits after "repeat_in_this_group:" > > repeat_in_this_group: > ino = ext4_find_next_zero_bit((unsigned long *) > inode_bitmap_bh->b_data, > EXT4_INODES_PER_GROUP(sb), ino); > > if (ino < EXT4_INODES_PER_GROUP(sb)) { > > BUFFER_TRACE(inode_bitmap_bh, "get_write_access"); > err = ext4_journal_get_write_access(handle, > inode_bitmap_bh); > if (err) > goto fail; > > BUFFER_TRACE(group_desc_bh, "get_write_access"); > *****>>>>> err = ext4_journal_get_write_access(handle, > group_desc_bh); > > That is why ext4_handle_dirty_metadata() isn't called until after the group > descriptor is modified during the block bitmap initialization. > > > I'm not wholly against removing this code, but we have to do it with the > clear understanding that we will have inodes in use for which the block > bitmap is showing that the in-use blocks are free. This doesn't seem like > a great situation to me. > > > > Signed-off-by: "Theodore Ts'o" <tytso@xxxxxxx> > > --- > > fs/ext4/ialloc.c | 31 ------------------------------- > > 1 files changed, 0 insertions(+), 31 deletions(-) > > > > diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c > > index 72fc989..a4ce10f 100644 > > --- a/fs/ext4/ialloc.c > > +++ b/fs/ext4/ialloc.c > > @@ -807,37 +807,6 @@ repeat_in_this_group: > > goto out; > > > > got: > > - /* We may have to initialize the block bitmap if it isn't already */ > > - if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM) && > > - gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { > > - struct buffer_head *block_bitmap_bh; > > - > > - block_bitmap_bh = ext4_read_block_bitmap(sb, group); > > - BUFFER_TRACE(block_bitmap_bh, "get block bitmap access"); > > - err = ext4_journal_get_write_access(handle, block_bitmap_bh); > > - if (err) { > > - brelse(block_bitmap_bh); > > - goto fail; > > - } > > - > > - BUFFER_TRACE(block_bitmap_bh, "dirty block bitmap"); > > - err = ext4_handle_dirty_metadata(handle, NULL, block_bitmap_bh); > > - brelse(block_bitmap_bh); > > - > > - /* recheck and clear flag under lock if we still need to */ > > - ext4_lock_group(sb, group); > > - if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { > > - gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT); > > - ext4_free_group_clusters_set(sb, gdp, > > - ext4_free_clusters_after_init(sb, group, gdp)); > > - gdp->bg_checksum = ext4_group_desc_csum(sbi, group, > > - gdp); > > - } > > - ext4_unlock_group(sb, group); > > - > > - if (err) > > - goto fail; > > - } > > BUFFER_TRACE(group_desc_bh, "call ext4_handle_dirty_metadata"); > > err = ext4_handle_dirty_metadata(handle, NULL, group_desc_bh); > > if (err) > > -- > > 1.7.8.11.gefc1f.dirty > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > Cheers, Andreas > > > > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html