diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f250e2083c7e..b5c058b304eb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -10223,6 +10223,13 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from, if (encoded->encryption != BTRFS_ENCODED_IO_ENCRYPTION_NONE) return -EINVAL; + /* + * Compressed extents should always have checksums, so error out if we + * have a NOCOW file or inode was created while mounted with NODATASUM. + */ + if (inode->flags & BTRFS_INODE_NODATASUM) + return -EINVAL; + orig_count = iov_iter_count(from); /* The extent size must be sane. */