fix FLEX_BG offset
PATCH 1/1 fix FLEX_BG offset
This patch resolves the offset problem of the flex_bg option when you use mke2fs tool.
For example, if you type mkfs.ext4 -I256 -O flex_bg -G32 -E test_fs <device> and look dumpe2fs <device> result you will see an offset problem.
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-5 Reserved GDT blocks at 6-1024
Block bitmap at 1025 (+1025), Inode bitmap at 1058 (+1058) Inode table at 1090-1601 (+1090)
0 free blocks, 8181 free inodes, 2 directories Free blocks:
Free inodes: 12-8192
Inode bitmap must start at 1025 + 32 = 1057
In all flexbg groups, the block between the last block bitmap and the first inode bitmap (metatdata) is not used, which introduced a hole.
This patch corrects it.
You have to apply it on e2fsprogs (mke2fs 1.41-WIP (17-Jun-2008)) master branch.
Celine Bourde.
alloc_tables.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
lib/ext2fs/alloc_tables.c +5 -3
@@ -71,9 +71,11 @@ static blk_t flexbg_offset(ext2_filsys f &first_free))return first_free; -if (ext2fs_get_free_blocks (fs, first_free + offset, last_blk, size, - bmap, &first_free)) -return first_free; +if (offset) +if (ext2fs_get_free_blocks (fs, first_free + offset -1 , + last_blk, size, bmap, + &first_free)) +return first_free;return first_free; }
Quoted 20 lines · On Thu, 03 Jul 2008 10:21:02 +0200 Celine Bourde <[email protected]> wrote:
This patch resolves the offset problem of the
flex_bgoption when you use mke2fs tool.For example, if you type mkfs.ext4 -I256 -O
flex_bg-G32 -Etest_fs<device> and look dumpe2fs <device> result you will see an offset problem.Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-5 Reserved GDT blocks at 6-1024
Block bitmap at 1025 (+1025), Inode bitmap at 1058 (+1058) Inode table at 1090-1601 (+1090)
0 free blocks, 8181 free inodes, 2 directories Free blocks:
Free inodes: 12-8192Inode bitmap must start at 1025 + 32 = 1057
In all flexbg groups, the block between the last block bitmap and the first inode
bitmap (metatdata) is not used, which introduced a hole.
Quoted 5 lines
This patch corrects it.
You have to apply it on e2fsprogs (mke2fs 1.41-WIP (17-Jun-2008)) master branch.Celine Bourde.
-JRS
Quoted 23 lines · On Thu, 3 Jul 2008 06:55:53 -0500 "Jose R. Santos" <[email protected]> wrote:
Quoted 20 lines · On Thu, 03 Jul 2008 10:21:02 +0200 Celine Bourde <[email protected]> wrote:
This patch resolves the offset problem of the
flex_bgoption when you use mke2fs tool.For example, if you type mkfs.ext4 -I256 -O
flex_bg-G32 -Etest_fs<device> and look dumpe2fs <device> result you will see an offset problem.Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-5 Reserved GDT blocks at 6-1024
Block bitmap at 1025 (+1025), Inode bitmap at 1058 (+1058) Inode table at 1090-1601 (+1090)
0 free blocks, 8181 free inodes, 2 directories Free blocks:
Free inodes: 12-8192Inode bitmap must start at 1025 + 32 = 1057
In all flexbg groups, the block between the last block bitmap and the first inode
bitmap (metatdata) is not used, which introduced a hole.
Quoted 7 lines
Quoted 5 lines
This patch corrects it.
You have to apply it on e2fsprogs (mke2fs 1.41-WIP (17-Jun-2008)) master branch.Celine Bourde.
Acked-by Jose R. Santos <[email protected]>
Looks like I jumped the gun to fast acknowledging this patch. The current patch doesn't run the second ext2fs_get_free_blocks() when doing a search for block bitmap space.
Here is an updated patch.
commit a58058e85240c7834cd863efa35b21688e104047
Author: Jose R. Santos <[email protected]> Date: Mon Jul 7 14:36:08 2008 -0500
Fix FLEX_BG offset
The offset for both inode bitmaps and inode tables is overshot by one block causing a hole between the group of bitmaps and inode tables.
lib/ext2fs/alloc_tables.c +2 -0
@@ -46,6 +46,8 @@ static blk_t flexbg_offset(ext2_filsys fs, dgrp_t group, blk_t start_blk,if (size > fs->super->s_blocks_per_group /8 ) size = fs->super->s_blocks_per_group /8 ; +if (offset) + offset -=1 ;/* * Dont do a long search if the previous block * search is still valid.
-JRS
Theodore Tso
AppliedThanks, applied. (And ignore my earlier e-mail; I was confused about what the code was trying to do.)
- Ted
Quoted 2 lines · Celine Bourde
This patch resolves the offset problem of the
flex_bgoption when you use mke2fs tool.
Actually, I think the problem is a bigger one. Ext2fs_get_free_blocks() returns a error code on failure. So the code before the conditional you modified is totally bogus:
/* Find the first available block */ if (ext2fs_get_free_blocks(fs, start_blk, last_blk, 1, bmap, &first_free)) return first_free; if (ext2fs_get_free_blocks(fs, first_free + offset, last_blk, size, bmap, &first_free)) return first_free; return first_free;
I think this should be instead:
/* Find the first available block */ if (ext2fs_get_free_blocks(fs, start_blk, last_blk, 1, bmap, &first_free) == 0) return first_free; if (ext2fs_get_free_blocks(fs, first_free + offset, last_blk, size, bmap, &first_free) == 0) return first_free; /* * Oops, we weren't able to find enough space. We return * first_free as a best try. */ return first_free; - Ted