ext4: fix error handling on inode bitmap corruption
authorJan Kara <jack@suse.cz>
Sun, 18 Dec 2011 22:37:02 +0000 (17:37 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 18 Dec 2011 22:37:02 +0000 (17:37 -0500)
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>
fs/ext4/ialloc.c

index 00beb4f9cc4ff0501012b8bdf338541fcb5e5a69..8fb6844f9734755b23a653ef4e1f05fea148bc36 100644 (file)
@@ -885,8 +885,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++;