Skip to contentSkip to conversation

fix FLEX_BG offset

PATCH Applied Celine Bourde 3 participants 5 messages Jul 3, 2008 – Jul 7, 2008

lore
Share & tools
lore
#0 lore raw

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
diff -rpu a/lib/ext2fs/alloc_tables.c b/lib/ext2fs/alloc_tables.c
@@ -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;
 }
Acked-by on v1 1/1
#1 lore raw
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_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.

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

#2 lore raw
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_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.

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.

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
index d87585b..7f6ac77 100644
@@ -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

Applied
#3 lore raw

Thanks, applied. (And ignore my earlier e-mail; I was confused about what the code was trying to do.)

- Ted

#4 lore raw
In reply to Celine Bourde
Quoted 2 lines · Celine Bourde

This patch resolves the offset problem of the flex_bg option 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