ext4: Don't add the inode to journal handle until after the block is allocated
Make sure we don't add the inode to the journal handle until after the block allocation, so that a journal commit will not include the inode in case of block allocation failure. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Mingming Cao <cmm@us.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
68629f29c6
commit
166348dd37
@ -2063,7 +2063,7 @@ ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
|
|||||||
/*
|
/*
|
||||||
* Account for the allocated meta blocks
|
* Account for the allocated meta blocks
|
||||||
*/
|
*/
|
||||||
if (!(*errp)) {
|
if (!(*errp) && EXT4_I(inode)->i_delalloc_reserved_flag) {
|
||||||
spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
|
spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
|
||||||
EXT4_I(inode)->i_allocated_meta_blocks += *count;
|
EXT4_I(inode)->i_allocated_meta_blocks += *count;
|
||||||
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
||||||
|
@ -2170,18 +2170,24 @@ static int ext4_da_get_block_write(struct inode *inode, sector_t iblock,
|
|||||||
handle_t *handle = NULL;
|
handle_t *handle = NULL;
|
||||||
|
|
||||||
handle = ext4_journal_current_handle();
|
handle = ext4_journal_current_handle();
|
||||||
if (!handle) {
|
BUG_ON(!handle);
|
||||||
ret = ext4_get_blocks_wrap(handle, inode, iblock, max_blocks,
|
ret = ext4_get_blocks_wrap(handle, inode, iblock, max_blocks,
|
||||||
bh_result, 0, 0, 0);
|
bh_result, create, 0, EXT4_DELALLOC_RSVED);
|
||||||
BUG_ON(!ret);
|
|
||||||
} else {
|
|
||||||
ret = ext4_get_blocks_wrap(handle, inode, iblock, max_blocks,
|
|
||||||
bh_result, create, 0, EXT4_DELALLOC_RSVED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
|
|
||||||
bh_result->b_size = (ret << inode->i_blkbits);
|
bh_result->b_size = (ret << inode->i_blkbits);
|
||||||
|
|
||||||
|
if (ext4_should_order_data(inode)) {
|
||||||
|
int retval;
|
||||||
|
retval = ext4_jbd2_file_inode(handle, inode);
|
||||||
|
if (retval)
|
||||||
|
/*
|
||||||
|
* Failed to add inode for ordered
|
||||||
|
* mode. Don't update file size
|
||||||
|
*/
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update on-disk size along with block allocation
|
* Update on-disk size along with block allocation
|
||||||
* we don't use 'extend_disksize' as size may change
|
* we don't use 'extend_disksize' as size may change
|
||||||
@ -2407,18 +2413,6 @@ restart_loop:
|
|||||||
dump_stack();
|
dump_stack();
|
||||||
goto out_writepages;
|
goto out_writepages;
|
||||||
}
|
}
|
||||||
if (ext4_should_order_data(inode)) {
|
|
||||||
/*
|
|
||||||
* With ordered mode we need to add
|
|
||||||
* the inode to the journal handl
|
|
||||||
* when we do block allocation.
|
|
||||||
*/
|
|
||||||
ret = ext4_jbd2_file_inode(handle, inode);
|
|
||||||
if (ret) {
|
|
||||||
ext4_journal_stop(handle);
|
|
||||||
goto out_writepages;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
to_write -= wbc->nr_to_write;
|
to_write -= wbc->nr_to_write;
|
||||||
ret = mpage_da_writepages(mapping, wbc,
|
ret = mpage_da_writepages(mapping, wbc,
|
||||||
|
Loading…
Reference in New Issue
Block a user