ext2: Fix error handling on inode bitmap corruption
When insert_inode_locked() fails in ext2_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 informing about filesystem error and jumping to fail: (instead of fail_drop:) which doesn't call unlock_new_inode(). Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
1415dd8705
commit
ef6919c283
|
@ -573,8 +573,11 @@ got:
|
||||||
inode->i_generation = sbi->s_next_generation++;
|
inode->i_generation = sbi->s_next_generation++;
|
||||||
spin_unlock(&sbi->s_next_gen_lock);
|
spin_unlock(&sbi->s_next_gen_lock);
|
||||||
if (insert_inode_locked(inode) < 0) {
|
if (insert_inode_locked(inode) < 0) {
|
||||||
err = -EINVAL;
|
ext2_error(sb, "ext2_new_inode",
|
||||||
goto fail_drop;
|
"inode number already in use - inode=%lu",
|
||||||
|
(unsigned long) ino);
|
||||||
|
err = -EIO;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
dquot_initialize(inode);
|
dquot_initialize(inode);
|
||||||
|
|
Loading…
Reference in New Issue