With -E(all-)fragments, pclustersize has a different value per segment,
so move it to struct z_erofs_compress_sctx.

Signed-off-by: Noboru Asai <a...@sijam.com>
---
 lib/compress.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/lib/compress.c b/lib/compress.c
index 9eb40b5..0803a63 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -40,7 +40,6 @@ struct z_erofs_extent_item {
 struct z_erofs_compress_ictx {         /* inode context */
        struct erofs_inode *inode;
        int fd;
-       unsigned int pclustersize;
 
        u32 tof_chksum;
        bool fix_dedupedfrag;
@@ -64,6 +63,7 @@ struct z_erofs_compress_sctx {                /* segment 
context */
 
        unsigned int head, tail;
        erofs_off_t remaining;
+       unsigned int pclustersize;
        erofs_blk_t blkaddr;            /* pointing to the next blkaddr */
        u16 clusterofs;
 
@@ -479,7 +479,7 @@ static bool z_erofs_fixup_deduped_fragment(struct 
z_erofs_compress_sctx *ctx,
 
        /* try to fix again if it gets larger (should be rare) */
        if (inode->fragment_size < newsize) {
-               ictx->pclustersize = min_t(erofs_off_t,
+               ctx->pclustersize = min_t(erofs_off_t,
                                z_erofs_get_max_pclustersize(inode),
                                roundup(newsize - inode->fragment_size,
                                        erofs_blksiz(sbi)));
@@ -519,12 +519,12 @@ static int __z_erofs_compress_one(struct 
z_erofs_compress_sctx *ctx,
        unsigned int compressedsize;
        int ret;
 
-       if (len <= ictx->pclustersize) {
+       if (len <= ctx->pclustersize) {
                if (!final || !len)
                        return 1;
                if (may_packing) {
                        if (inode->fragment_size && !ictx->fix_dedupedfrag) {
-                               ictx->pclustersize = roundup(len, blksz);
+                               ctx->pclustersize = roundup(len, blksz);
                                goto fix_dedupedfrag;
                        }
                        e->length = len;
@@ -536,7 +536,7 @@ static int __z_erofs_compress_one(struct 
z_erofs_compress_sctx *ctx,
 
        e->length = min(len, cfg.c_max_decompressed_extent_bytes);
        ret = erofs_compress_destsize(h, ctx->queue + ctx->head,
-                                     &e->length, dst, ictx->pclustersize);
+                                     &e->length, dst, ctx->pclustersize);
        if (ret <= 0) {
                erofs_err("failed to compress %s: %s", inode->i_srcpath,
                          erofs_strerror(ret));
@@ -573,7 +573,7 @@ nocompression:
                e->compressedblks = 1;
                e->raw = true;
        } else if (may_packing && len == e->length &&
-                  compressedsize < ictx->pclustersize &&
+                  compressedsize < ctx->pclustersize &&
                   (!inode->fragment_size || ictx->fix_dedupedfrag)) {
 frag_packing:
                ret = z_erofs_pack_fragments(inode, ctx->queue + ctx->head,
@@ -612,7 +612,7 @@ frag_packing:
                if (may_packing && len == e->length &&
                    (compressedsize & (blksz - 1)) &&
                    ctx->tail < Z_EROFS_COMPR_QUEUE_SZ) {
-                       ictx->pclustersize = roundup(compressedsize, blksz);
+                       ctx->pclustersize = roundup(compressedsize, blksz);
                        goto fix_dedupedfrag;
                }
 
@@ -1202,6 +1202,7 @@ void z_erofs_mt_workfn(struct erofs_work *work, void 
*tlsp)
                goto out;
        }
        sctx->memoff = 0;
+       sctx->pclustersize = z_erofs_get_max_pclustersize(sctx->ictx->inode);
 
        ret = z_erofs_compress_segment(sctx, sctx->seg_idx * cfg.c_segment_size,
                                       EROFS_NULL_ADDR);
@@ -1460,7 +1461,6 @@ int erofs_write_compressed_file(struct erofs_inode 
*inode, int fd)
        }
 
        ctx.inode = inode;
-       ctx.pclustersize = z_erofs_get_max_pclustersize(inode);
        ctx.metacur = compressmeta + Z_EROFS_LEGACY_MAP_HEADER_SIZE;
        init_list_head(&ctx.extents);
        ctx.fd = fd;
@@ -1500,6 +1500,7 @@ int erofs_write_compressed_file(struct erofs_inode 
*inode, int fd)
                sctx.seg_num = 1;
                sctx.seg_idx = 0;
                sctx.pivot = &dummy_pivot;
+               sctx.pclustersize = z_erofs_get_max_pclustersize(inode);
 
                ret = z_erofs_compress_segment(&sctx, -1, blkaddr);
                if (ret)
-- 
2.44.0

Reply via email to