From: Qu Wenruo Date: Fri, 6 Sep 2024 04:10:30 +0000 (+0930) Subject: btrfs: zstd: make the compression path to handle sector size < page size X-Git-Tag: v6.13-rc1~213^2~114 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=90275a7762c85bde21c0884404993ed20e265d86;p=thirdparty%2Flinux.git btrfs: zstd: make the compression path to handle sector size < page size Inside zstd_compress_folios(), after exhausted one input page, we need to switch to the next page as input. However when counting the total input bytes (@tot_in), we always increase it by PAGE_SIZE. For the following case, it can cause incorrect value: 0 32K 64K 96K | |///////////||///////////| After compressing range [32K, 64K), we switch to the next page, and increasing @tot_in by 64K, while we only read 32K. This will cause the @total_in to return a value larger than the input length. Fix it by only increase @tot_in by the input size. Signed-off-by: Qu Wenruo Signed-off-by: David Sterba --- diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c index 866607fd3e588..15f8a83165a38 100644 --- a/fs/btrfs/zstd.c +++ b/fs/btrfs/zstd.c @@ -495,7 +495,7 @@ int zstd_compress_folios(struct list_head *ws, struct address_space *mapping, /* Check if we need more input */ if (workspace->in_buf.pos == workspace->in_buf.size) { - tot_in += PAGE_SIZE; + tot_in += workspace->in_buf.size; kunmap_local(workspace->in_buf.src); workspace->in_buf.src = NULL; folio_put(in_folio);