More than one extent could be emitted in __z_erofs_compress_one()
later.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 lib/compress.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/lib/compress.c b/lib/compress.c
index 65edd00..6a409de 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -278,8 +278,7 @@ static void z_erofs_commit_extent(struct 
z_erofs_compress_sctx *ctx,
                          (erofs_blksiz(ctx->ictx->inode->sbi) - 1);
 }
 
-static int z_erofs_compress_dedupe(struct z_erofs_compress_sctx *ctx,
-                                  unsigned int *len)
+static int z_erofs_compress_dedupe(struct z_erofs_compress_sctx *ctx)
 {
        struct erofs_inode *inode = ctx->ictx->inode;
        const unsigned int lclustermask = (1 << inode->z_logical_clusterbits) - 
1;
@@ -306,7 +305,7 @@ static int z_erofs_compress_dedupe(struct 
z_erofs_compress_sctx *ctx,
                                else
                                        rc = ei->e.length - erofs_blksiz(sbi);
                                rc; }),
-                       .end = ctx->queue + ctx->head + *len,
+                       .end = ctx->queue + ctx->tail,
                        .cur = ctx->queue + ctx->head,
                };
                int delta;
@@ -366,12 +365,11 @@ static int z_erofs_compress_dedupe(struct 
z_erofs_compress_sctx *ctx,
                ei->e = dctx.e;
 
                ctx->head += dctx.e.length - delta;
-               DBG_BUGON(*len < dctx.e.length - delta);
-               *len -= dctx.e.length - delta;
+               DBG_BUGON(ctx->head > ctx->tail);
 
                if (z_erofs_need_refill(ctx))
                        return 1;
-       } while (*len);
+       } while (ctx->tail > ctx->head);
 out:
        z_erofs_commit_extent(ctx, ei);
        ctx->pivot = NULL;
@@ -484,13 +482,12 @@ out:
        return 0;
 }
 
-static bool z_erofs_fixup_deduped_fragment(struct z_erofs_compress_sctx *ctx,
-                                          unsigned int len)
+static bool z_erofs_fixup_deduped_fragment(struct z_erofs_compress_sctx *ctx)
 {
        struct z_erofs_compress_ictx *ictx = ctx->ictx;
        struct erofs_inode *inode = ictx->inode;
        struct erofs_sb_info *sbi = inode->sbi;
-       const unsigned int newsize = ctx->remaining + len;
+       const unsigned int newsize = ctx->remaining + ctx->tail - ctx->head;
 
        DBG_BUGON(!inode->fragment_size);
 
@@ -700,11 +697,10 @@ fix_dedupedfrag:
 static int z_erofs_compress_one(struct z_erofs_compress_sctx *ctx)
 {
        struct z_erofs_compress_ictx *ictx = ctx->ictx;
-       unsigned int len = ctx->tail - ctx->head;
        struct z_erofs_extent_item *ei;
 
-       while (len) {
-               int ret = z_erofs_compress_dedupe(ctx, &len);
+       while (ctx->tail > ctx->head) {
+               int ret = z_erofs_compress_dedupe(ctx);
 
                if (ret > 0)
                        break;
@@ -725,10 +721,9 @@ static int z_erofs_compress_one(struct 
z_erofs_compress_sctx *ctx)
                        return ret;
                }
 
-               len -= ei->e.length;
                ctx->pivot = ei;
                if (ictx->fix_dedupedfrag && !ictx->fragemitted &&
-                   z_erofs_fixup_deduped_fragment(ctx, len))
+                   z_erofs_fixup_deduped_fragment(ctx))
                        break;
 
                if (z_erofs_need_refill(ctx))
-- 
2.43.5

Reply via email to