diff options
| -rw-r--r-- | fs/ext4/extents.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index f0e6934291dd..0e9de2328bd2 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4731,6 +4731,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,  	loff_t new_size = 0;  	int ret = 0;  	int flags; +	int credits;  	int partial;  	loff_t start, end;  	ext4_lblk_t lblk; @@ -4830,8 +4831,14 @@ static long ext4_zero_range(struct file *file, loff_t offset,  		if (ret)  			goto out_dio;  	} - -	handle = ext4_journal_start(inode, EXT4_HT_MISC, 4); +	/* +	 * In worst case we have to writeout two nonadjacent unwritten +	 * blocks and update the inode +	 */ +	credits = (2 * ext4_ext_index_trans_blocks(inode, 2)) + 1; +	if (ext4_should_journal_data(inode)) +		credits += 2; +	handle = ext4_journal_start(inode, EXT4_HT_MISC, credits);  	if (IS_ERR(handle)) {  		ret = PTR_ERR(handle);  		ext4_std_error(inode->i_sb, ret);  | 
