| From d34744f53b5ae2414141e77b6c0b02db41d31d50 Mon Sep 17 00:00:00 2001 |
| From: Jan Kara <jack@suse.cz> |
| Date: Sun, 18 Dec 2011 17:37:02 -0500 |
| Subject: [PATCH] ext4: fix error handling on inode bitmap corruption |
| |
| commit acd6ad83517639e8f09a8c5525b1dccd81cd2a10 upstream. |
| |
| When insert_inode_locked() fails in ext4_new_inode() it most likely means inode |
| bitmap got corrupted and we allocated again inode which is already in use. Also |
| doing unlock_new_inode() during error recovery is wrong since the inode does |
| not have I_NEW set. Fix the problem by jumping to fail: (instead of fail_drop:) |
| which declares filesystem error and does not call unlock_new_inode(). |
| |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| fs/ext4/ialloc.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c |
| index 7f6b5826d5a6..4783c5a4adac 100644 |
| --- a/fs/ext4/ialloc.c |
| +++ b/fs/ext4/ialloc.c |
| @@ -1009,8 +1009,12 @@ got: |
| if (IS_DIRSYNC(inode)) |
| ext4_handle_sync(handle); |
| if (insert_inode_locked(inode) < 0) { |
| - err = -EINVAL; |
| - goto fail_drop; |
| + /* |
| + * Likely a bitmap corruption causing inode to be allocated |
| + * twice. |
| + */ |
| + err = -EIO; |
| + goto fail; |
| } |
| spin_lock(&sbi->s_next_gen_lock); |
| inode->i_generation = sbi->s_next_generation++; |
| -- |
| 1.8.5.2 |
| |