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: 11a347fb6cef ("exfat: change to get file size from DataLength") Signed-off-by: Yuezhang Mo <Yuezhang.Mo@xxxxxxxx> Co-developed-by: Namjae Jeon <linkinjeon@xxxxxxxxxx> Signed-off-by: Namjae Jeon <linkinjeon@xxxxxxxxxx> --- fs/exfat/file.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/exfat/file.c b/fs/exfat/file.c index a25d7eb789f4..a00f3f1b2cbb 100644 --- a/fs/exfat/file.c +++ b/fs/exfat/file.c @@ -584,6 +584,12 @@ 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) && + EXFAT_BLK_OFFSET(pos | ret, inode->i_sb)) { + ret = -EINVAL; + goto unlock; + } + if (pos > valid_size) { ret = exfat_extend_valid_size(file, pos); if (ret < 0 && ret != -ENOSPC) { -- 2.43.0