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) { diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c index d338a59c27f7..dad570e3d5ef 100644 --- a/fs/exfat/inode.c +++ b/fs/exfat/inode.c @@ -481,8 +481,10 @@ static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter) */ ret = blockdev_direct_IO(iocb, inode, iter, exfat_get_block); if (ret < 0) { - if (rw == WRITE && ret != -EIOCBQUEUED) + if (rw == WRITE && ret != -EIOCBQUEUED) { + pr_err("%s(): %d: ret = %zd\n", __FUNCTION__, __LINE__, ret); exfat_write_failed(mapping, size); + } return ret; } else