mirror of https://gitee.com/openkylin/linux.git
ext4: fix error handling on inode bitmap corruption
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>
This commit is contained in:
parent
5635a62b83
commit
acd6ad8351
|
@ -885,8 +885,12 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode,
|
||||||
if (IS_DIRSYNC(inode))
|
if (IS_DIRSYNC(inode))
|
||||||
ext4_handle_sync(handle);
|
ext4_handle_sync(handle);
|
||||||
if (insert_inode_locked(inode) < 0) {
|
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);
|
spin_lock(&sbi->s_next_gen_lock);
|
||||||
inode->i_generation = sbi->s_next_generation++;
|
inode->i_generation = sbi->s_next_generation++;
|
||||||
|
|
Loading…
Reference in New Issue