[PATCH 1/2] ext4: check free block counters in ext4_mb_find_by_goal

Subsystems: ext4 file system, filesystems (vfs and infrastructure), the rest

STALE5080d

3 messages, 1 author, 2012-09-05 · open the first message on its own page

[PATCH 1/2] ext4: check free block counters in ext4_mb_find_by_goal

From: Yongqiang Yang <hidden>
Date: 2012-09-02 10:20:33

Free block counters should be checked before doing allocation.

Signed-off-by: Yongqiang Yang <redacted>
---
 fs/ext4/mballoc.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 6873571..5d4c21a 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -1659,10 +1659,13 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac,
 	int max;
 	int err;
 	struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
+	struct ext4_group_info *grp = ext4_get_group_info(ac->ac_sb, group);
 	struct ext4_free_extent ex;
 
 	if (!(ac->ac_flags & EXT4_MB_HINT_TRY_GOAL))
 		return 0;
+	if (grp->bb_free == 0)
+		return 0;
 
 	err = ext4_mb_load_buddy(ac->ac_sb, group, e4b);
 	if (err)
-- 
1.7.5.1

[PATCH 2/2] ext4: check free inode count before allocaing an inode

From: Yongqiang Yang <hidden>
Date: 2012-09-02 10:20:36

Recnetly, I ecountered some corrupted filesystems in which some
groups' free inode counts were negative, it seemed that free inode
count was overflow.  This patch teaches ext4 to check free inode
count before allocaing an inode.

Signed-off-by: Yongqiang Yang <redacted>
---
 fs/ext4/ialloc.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index 26154b8..fa36372 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -697,6 +697,15 @@ got_group:
 		if (!gdp)
 			goto fail;
 
+		/*
+		 * Check free inodes count before loading bitmap.
+		 */
+		if (ext4_free_inodes_count(sb, gdp) == 0) {
+			if (++group == ngroups)
+				group = 0;
+			continue;
+		}
+
 		brelse(inode_bitmap_bh);
 		inode_bitmap_bh = ext4_read_inode_bitmap(sb, group);
 		if (!inode_bitmap_bh)
-- 
1.7.5.1

Re: [PATCH 2/2] ext4: check free inode count before allocaing an inode

From: Yongqiang Yang <hidden>
Date: 2012-09-05 02:17:54

On Sun, Sep 2, 2012 at 5:45 PM, Yongqiang Yang [off-list ref] wrote:
Recnetly, I ecountered some corrupted filesystems in which some
groups' free inode counts were negative, it seemed that free inode
This comment is not exactly, it is not negative but 65535.  I will
resend the patch later.

Thanks,
Yongqiang.
quoted hunk
count was overflow.  This patch teaches ext4 to check free inode
count before allocaing an inode.

Signed-off-by: Yongqiang Yang <redacted>
---
 fs/ext4/ialloc.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index 26154b8..fa36372 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -697,6 +697,15 @@ got_group:
                if (!gdp)
                        goto fail;

+               /*
+                * Check free inodes count before loading bitmap.
+                */
+               if (ext4_free_inodes_count(sb, gdp) == 0) {
+                       if (++group == ngroups)
+                               group = 0;
+                       continue;
+               }
+
                brelse(inode_bitmap_bh);
                inode_bitmap_bh = ext4_read_inode_bitmap(sb, group);
                if (!inode_bitmap_bh)
--
1.7.5.1


-- 
Best Wishes
Yongqiang Yang
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help