| From 95ed7f3f2a7f83ac45434f18c9b3437936c3ed12 Mon Sep 17 00:00:00 2001 |
| From: Jan Kara <jack@suse.cz> |
| Date: Thu, 8 Dec 2011 21:13:46 +0100 |
| Subject: [PATCH] ext3: Fix error handling on inode bitmap corruption |
| |
| commit 1415dd8705394399d59a3df1ab48d149e1e41e77 upstream. |
| |
| When insert_inode_locked() fails in ext3_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 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(). |
| |
| Reviewed-by: Eric Sandeen <sandeen@redhat.com> |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| fs/ext3/ialloc.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c |
| index 0d0e97ed3ff6..fd16a928574c 100644 |
| --- a/fs/ext3/ialloc.c |
| +++ b/fs/ext3/ialloc.c |
| @@ -575,8 +575,12 @@ got: |
| if (IS_DIRSYNC(inode)) |
| handle->h_sync = 1; |
| 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 |
| |