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
