From: Yue Hu <[email protected]>

This can benefit from in-place I/O we are using.

Signed-off-by: Yue Hu <[email protected]>
---
 lib/compress.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/lib/compress.c b/lib/compress.c
index fd02053..4bd4e6b 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -139,11 +139,12 @@ static void vle_write_indexes(struct 
z_erofs_vle_compress_ctx *ctx,
        ctx->clusterofs = clusterofs + count;
 }
 
-static int write_uncompressed_extent(struct z_erofs_vle_compress_ctx *ctx,
+static int write_uncompressed_extent(struct erofs_inode *inode,
+                                    struct z_erofs_vle_compress_ctx *ctx,
                                     unsigned int *len, char *dst)
 {
        int ret;
-       unsigned int count;
+       unsigned int count, interlaced_offset, rightpart;
 
        /* reset clusterofs to 0 if permitted */
        if (!erofs_sb_has_lz4_0padding() && ctx->clusterofs &&
@@ -153,11 +154,19 @@ static int write_uncompressed_extent(struct 
z_erofs_vle_compress_ctx *ctx,
                ctx->clusterofs = 0;
        }
 
-       /* write uncompressed data */
        count = min(EROFS_BLKSIZ, *len);
 
-       memcpy(dst, ctx->queue + ctx->head, count);
-       memset(dst + count, 0, EROFS_BLKSIZ - count);
+       /*
+        * write uncompressed data from clusterofs which can benefit from
+        * in-place I/O, loop shift right when to exceed EROFS_BLKSIZ.
+        */
+       interlaced_offset = 0; /* will set it to clusterofs */
+       rightpart = min(EROFS_BLKSIZ - interlaced_offset, count);
+
+       memset(dst, 0, EROFS_BLKSIZ);
+
+       memcpy(dst + interlaced_offset, ctx->queue + ctx->head, rightpart);
+       memcpy(dst, ctx->queue + ctx->head + rightpart, count - rightpart);
 
        erofs_dbg("Writing %u uncompressed data to block %u",
                  count, ctx->blkaddr);
@@ -263,7 +272,8 @@ static int vle_compress_one(struct erofs_inode *inode,
                                                len, true);
                        else
 nocompression:
-                               ret = write_uncompressed_extent(ctx, &len, dst);
+                               ret = write_uncompressed_extent(inode, ctx,
+                                                               &len, dst);
 
                        if (ret < 0)
                                return ret;
-- 
2.17.1

Reply via email to