Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

Jan Kara ef6919c2 1415dd87

+5 -2
+5 -2
fs/ext2/ialloc.c
··· 573 573 inode->i_generation = sbi->s_next_generation++; 574 574 spin_unlock(&sbi->s_next_gen_lock); 575 575 if (insert_inode_locked(inode) < 0) { 576 - err = -EINVAL; 577 - goto fail_drop; 576 + ext2_error(sb, "ext2_new_inode", 577 + "inode number already in use - inode=%lu", 578 + (unsigned long) ino); 579 + err = -EIO; 580 + goto fail; 578 581 } 579 582 580 583 dquot_initialize(inode);