summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/zstd.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c
index c9cddcfa337b..7fad1e299c7a 100644
--- a/fs/btrfs/zstd.c
+++ b/fs/btrfs/zstd.c
@@ -589,7 +589,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
{
struct btrfs_fs_info *fs_info = cb_to_fs_info(cb);
struct workspace *workspace = list_entry(ws, struct workspace, list);
- struct folio **folios_in = cb->compressed_folios;
+ struct folio_iter fi;
size_t srclen = cb->compressed_len;
zstd_dstream *stream;
int ret = 0;
@@ -600,6 +600,11 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
unsigned long buf_start;
unsigned long total_out = 0;
+ bio_first_folio(&fi, &cb->bbio.bio, 0);
+ if (unlikely(!fi.folio))
+ return -EINVAL;
+ ASSERT(folio_size(fi.folio) == blocksize);
+
stream = zstd_init_dstream(
ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
if (unlikely(!stream)) {
@@ -612,7 +617,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
goto done;
}
- workspace->in_buf.src = kmap_local_folio(folios_in[folio_in_index], 0);
+ workspace->in_buf.src = kmap_local_folio(fi.folio, 0);
workspace->in_buf.pos = 0;
workspace->in_buf.size = min_t(size_t, srclen, min_folio_size);
@@ -660,8 +665,9 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
goto done;
}
srclen -= min_folio_size;
- workspace->in_buf.src =
- kmap_local_folio(folios_in[folio_in_index], 0);
+ bio_next_folio(&fi, &cb->bbio.bio);
+ ASSERT(fi.folio);
+ workspace->in_buf.src = kmap_local_folio(fi.folio, 0);
workspace->in_buf.pos = 0;
workspace->in_buf.size = min_t(size_t, srclen, min_folio_size);
}