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

Submitted by Yongqiang Yang on Sept. 2, 2012, 9:45 a.m.

Details

Message ID 1346579109-25016-2-git-send-email-xiaoqiangnk@gmail.com
State Superseded, archived
Headers show

Commit Message

Yongqiang Yang Sept. 2, 2012, 9:45 a.m.
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 <xiaoqiangnk@gmail.com>
---
 fs/ext4/ialloc.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

Comments

Yongqiang Yang Sept. 5, 2012, 2:17 a.m.
On Sun, Sep 2, 2012 at 5:45 PM, Yongqiang Yang <xiaoqiangnk@gmail.com> 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.
> count was overflow.  This patch teaches ext4 to check free inode
> count before allocaing an inode.
>
> Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com>
> ---
>  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
>

Patch hide | download patch | download mbox

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)