Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69dc9536 authored by Dmitry Monakhov's avatar Dmitry Monakhov Committed by Theodore Ts'o
Browse files

ext4: fix incorect journal credits reservation in ext4_zero_range



Currently we reserve only 4 blocks but in worst case scenario
ext4_zero_partial_blocks() may want to zeroout and convert two
non adjacent blocks.

Signed-off-by: default avatarDmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
Cc: stable@vger.kernel.org
parent 4631dbf6
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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);