@@ -826,7 +826,10 @@ got:
|
|||||||
ext4_set_inode_flags(inode);
|
ext4_set_inode_flags(inode);
|
||||||
if (IS_DIRSYNC(inode))
|
if (IS_DIRSYNC(inode))
|
||||||
handle->h_sync = 1;
|
handle->h_sync = 1;
|
||||||
insert_inode_hash(inode);
|
if (insert_inode_locked(inode) < 0) {
|
||||||
|
err = -EINVAL;
|
||||||
|
goto fail_drop;
|
||||||
|
}
|
||||||
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++;
|
||||||
spin_unlock(&sbi->s_next_gen_lock);
|
spin_unlock(&sbi->s_next_gen_lock);
|
||||||
@@ -881,6 +884,7 @@ fail_drop:
|
|||||||
DQUOT_DROP(inode);
|
DQUOT_DROP(inode);
|
||||||
inode->i_flags |= S_NOQUOTA;
|
inode->i_flags |= S_NOQUOTA;
|
||||||
inode->i_nlink = 0;
|
inode->i_nlink = 0;
|
||||||
|
unlock_new_inode(inode);
|
||||||
iput(inode);
|
iput(inode);
|
||||||
brelse(bitmap_bh);
|
brelse(bitmap_bh);
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
|
@@ -1693,9 +1693,11 @@ static int ext4_add_nondir(handle_t *handle,
|
|||||||
if (!err) {
|
if (!err) {
|
||||||
ext4_mark_inode_dirty(handle, inode);
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
d_instantiate(dentry, inode);
|
d_instantiate(dentry, inode);
|
||||||
|
unlock_new_inode(inode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
drop_nlink(inode);
|
drop_nlink(inode);
|
||||||
|
unlock_new_inode(inode);
|
||||||
iput(inode);
|
iput(inode);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -1830,6 +1832,7 @@ retry:
|
|||||||
if (err) {
|
if (err) {
|
||||||
out_clear_inode:
|
out_clear_inode:
|
||||||
clear_nlink(inode);
|
clear_nlink(inode);
|
||||||
|
unlock_new_inode(inode);
|
||||||
ext4_mark_inode_dirty(handle, inode);
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
iput(inode);
|
iput(inode);
|
||||||
goto out_stop;
|
goto out_stop;
|
||||||
@@ -1838,6 +1841,7 @@ out_clear_inode:
|
|||||||
ext4_update_dx_flag(dir);
|
ext4_update_dx_flag(dir);
|
||||||
ext4_mark_inode_dirty(handle, dir);
|
ext4_mark_inode_dirty(handle, dir);
|
||||||
d_instantiate(dentry, inode);
|
d_instantiate(dentry, inode);
|
||||||
|
unlock_new_inode(inode);
|
||||||
out_stop:
|
out_stop:
|
||||||
ext4_journal_stop(handle);
|
ext4_journal_stop(handle);
|
||||||
if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
|
if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
|
||||||
@@ -2212,6 +2216,7 @@ retry:
|
|||||||
mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
|
mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
|
||||||
if (err) {
|
if (err) {
|
||||||
clear_nlink(inode);
|
clear_nlink(inode);
|
||||||
|
unlock_new_inode(inode);
|
||||||
ext4_mark_inode_dirty(handle, inode);
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
iput(inode);
|
iput(inode);
|
||||||
goto out_stop;
|
goto out_stop;
|
||||||
@@ -2262,7 +2267,14 @@ retry:
|
|||||||
ext4_inc_count(handle, inode);
|
ext4_inc_count(handle, inode);
|
||||||
atomic_inc(&inode->i_count);
|
atomic_inc(&inode->i_count);
|
||||||
|
|
||||||
err = ext4_add_nondir(handle, dentry, inode);
|
err = ext4_add_entry(handle, dentry, inode);
|
||||||
|
if (!err) {
|
||||||
|
ext4_mark_inode_dirty(handle, inode);
|
||||||
|
d_instantiate(dentry, inode);
|
||||||
|
} else {
|
||||||
|
drop_nlink(inode);
|
||||||
|
iput(inode);
|
||||||
|
}
|
||||||
ext4_journal_stop(handle);
|
ext4_journal_stop(handle);
|
||||||
if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
|
if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
|
||||||
goto retry;
|
goto retry;
|
||||||
|
Reference in New Issue
Block a user