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

Commit 32e5a2a2 authored by Joseph Qi's avatar Joseph Qi Committed by Linus Torvalds
Browse files

ocfs2: fix shift left overflow



When using a large volume, for example 9T volume with 2T already used,
frequent creation of small files with O_DIRECT when the IO is not
cluster aligned may clear sectors in the wrong place.  This will cause
filesystem corruption.

This is because p_cpos is a u32.  When calculating the corresponding
sector it should be converted to u64 first, otherwise it may overflow.

Signed-off-by: default avatarJoseph Qi <joseph.qi@huawei.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: <stable@vger.kernel.org>	[4.0+]
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 18896451
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -685,7 +685,7 @@ static int ocfs2_direct_IO_zero_extend(struct ocfs2_super *osb,

	if (p_cpos && !(ext_flags & OCFS2_EXT_UNWRITTEN)) {
		u64 s = i_size_read(inode);
		sector_t sector = (p_cpos << (osb->s_clustersize_bits - 9)) +
		sector_t sector = ((u64)p_cpos << (osb->s_clustersize_bits - 9)) +
			(do_div(s, osb->s_clustersize) >> 9);

		ret = blkdev_issue_zeroout(osb->sb->s_bdev, sector,
@@ -910,7 +910,7 @@ static ssize_t ocfs2_direct_IO_write(struct kiocb *iocb,
		BUG_ON(!p_cpos || (ext_flags & OCFS2_EXT_UNWRITTEN));

		ret = blkdev_issue_zeroout(osb->sb->s_bdev,
				p_cpos << (osb->s_clustersize_bits - 9),
				(u64)p_cpos << (osb->s_clustersize_bits - 9),
				zero_len_head >> 9, GFP_NOFS, false);
		if (ret < 0)
			mlog_errno(ret);