Commit 2e94e5bb authored by Yuezhang Mo's avatar Yuezhang Mo Committed by Namjae Jeon
Browse files

exfat: fix file being changed by unaligned direct write



Unaligned direct writes are invalid and should return an error
without making any changes, rather than extending ->valid_size
and then returning an error. Therefore, alignment checking is
required before extending ->valid_size.

Fixes: 11a347fb ("exfat: change to get file size from DataLength")
Signed-off-by: default avatarYuezhang Mo <Yuezhang.Mo@sony.com>
Co-developed-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
parent 02dffe9a
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -584,6 +584,16 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
	if (ret < 0)
		goto unlock;

	if (iocb->ki_flags & IOCB_DIRECT) {
		unsigned long align = pos | iov_iter_alignment(iter);

		if (!IS_ALIGNED(align, i_blocksize(inode)) &&
		    !IS_ALIGNED(align, bdev_logical_block_size(inode->i_sb->s_bdev))) {
			ret = -EINVAL;
			goto unlock;
		}
	}

	if (pos > valid_size) {
		ret = exfat_extend_valid_size(file, pos);
		if (ret < 0 && ret != -ENOSPC) {