[PATCH 5/7] erofs-utils: lib: switch to vfile interfaces for compression
Gao Xiang
hsiangkao at linux.alibaba.com
Thu Oct 16 13:48:13 AEDT 2025
Split erofs_begin_compressed_file() into three interfaces:
- erofs_prepare_compressed_file();
- erofs_bind_compressed_file_with_fd();
- erofs_begin_compressed_file().
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
lib/compress.c | 74 +++++++++++++++++++++++++----------------
lib/inode.c | 16 ++++++---
lib/liberofs_compress.h | 7 ++--
3 files changed, 63 insertions(+), 34 deletions(-)
diff --git a/lib/compress.c b/lib/compress.c
index 74d40b1..1417967 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -35,6 +35,7 @@ struct z_erofs_extent_item {
};
struct z_erofs_compress_ictx { /* inode context */
+ struct erofs_vfile _vf, *vf;
struct erofs_importer *im;
struct erofs_inode *inode;
struct erofs_compress_cfg *ccfg;
@@ -1258,14 +1259,14 @@ int z_erofs_compress_segment(struct z_erofs_compress_sctx *ctx,
bool frag = params->fragments && !erofs_is_packed_inode(inode) &&
!erofs_is_metabox_inode(inode) &&
ctx->seg_idx >= ictx->seg_num - 1;
- struct erofs_vfile vf = { .fd = ictx->fd };
+ struct erofs_vfile *vf = ictx->vf;
int ret;
DBG_BUGON(offset != -1 && frag && inode->fragment_size);
if (offset != -1 && frag && !inode->fragment_size &&
params->fragdedupe != EROFS_FRAGDEDUPE_OFF) {
- ret = erofs_fragment_findmatch(inode,
- &vf, ictx->fpos, ictx->tofh);
+ ret = erofs_fragment_findmatch(inode, vf, ictx->fpos,
+ ictx->tofh);
if (ret < 0)
return ret;
if (inode->fragment_size > ctx->remaining)
@@ -1281,8 +1282,8 @@ int z_erofs_compress_segment(struct z_erofs_compress_sctx *ctx,
int ret;
ret = (offset == -1 ?
- erofs_io_read(&vf, ctx->queue + ctx->tail, rx) :
- erofs_io_pread(&vf, ctx->queue + ctx->tail, rx,
+ erofs_io_read(vf, ctx->queue + ctx->tail, rx) :
+ erofs_io_pread(vf, ctx->queue + ctx->tail, rx,
ictx->fpos + offset));
if (ret != rx)
return -errno;
@@ -1780,6 +1781,8 @@ int z_erofs_mt_global_exit(void)
return 0;
}
#else
+
+
static int z_erofs_mt_global_init(struct erofs_importer *im)
{
z_erofs_mt_enabled = false;
@@ -1792,8 +1795,8 @@ int z_erofs_mt_global_exit(void)
}
#endif
-void *erofs_begin_compressed_file(struct erofs_importer *im,
- struct erofs_inode *inode, int fd, u64 fpos)
+void *erofs_prepare_compressed_file(struct erofs_importer *im,
+ struct erofs_inode *inode)
{
const struct erofs_importer_params *params = im->params;
struct erofs_sb_info *sbi = inode->sbi;
@@ -1801,7 +1804,6 @@ void *erofs_begin_compressed_file(struct erofs_importer *im,
bool frag = params->fragments && !erofs_is_packed_inode(inode) &&
!erofs_is_metabox_inode(inode);
bool all_fragments = params->all_fragments && frag;
- int ret;
/* initialize per-file compression setting */
inode->z_advise = 0;
@@ -1835,7 +1837,6 @@ void *erofs_begin_compressed_file(struct erofs_importer *im,
}
ictx->im = im;
ictx->inode = inode;
- ictx->fd = fd;
if (erofs_is_metabox_inode(inode))
ictx->ccfg = &sbi->zmgr->ccfg[cfg.c_mkfs_metabox_algid];
else
@@ -1848,10 +1849,33 @@ void *erofs_begin_compressed_file(struct erofs_importer *im,
if (params->fragments && !params->dedupe && !ictx->data_unaligned)
inode->z_advise |= Z_EROFS_ADVISE_INTERLACED_PCLUSTER;
- if (frag) {
- struct erofs_vfile vf = { .fd = fd };
+ init_list_head(&ictx->extents);
+ ictx->fix_dedupedfrag = false;
+ ictx->fragemitted = false;
+ ictx->dedupe = false;
+ return ictx;
+}
+
+void erofs_bind_compressed_file_with_fd(struct z_erofs_compress_ictx *ictx,
+ int fd, u64 fpos)
+{
+ ictx->_vf = (struct erofs_vfile){ .fd = fd };
+ ictx->vf = &ictx->_vf;
+ ictx->fpos = fpos;
+}
+
+int erofs_begin_compressed_file(struct z_erofs_compress_ictx *ictx)
+{
+ const struct erofs_importer_params *params = ictx->im->params;
+ struct erofs_inode *inode = ictx->inode;
+ bool frag = params->fragments && !erofs_is_packed_inode(inode) &&
+ !erofs_is_metabox_inode(inode);
+ bool all_fragments = params->all_fragments && frag;
+ int ret;
- ictx->tofh = z_erofs_fragments_tofh(inode, &vf, fpos);
+ if (frag) {
+ ictx->tofh = z_erofs_fragments_tofh(inode,
+ ictx->vf, ictx->fpos);
if (ictx == &g_ictx &&
params->fragdedupe != EROFS_FRAGDEDUPE_OFF) {
/*
@@ -1859,9 +1883,9 @@ void *erofs_begin_compressed_file(struct erofs_importer *im,
* parts into the packed inode.
*/
ret = erofs_fragment_findmatch(inode,
- &vf, fpos, ictx->tofh);
+ ictx->vf, ictx->fpos, ictx->tofh);
if (ret < 0)
- goto err_free_ictx;
+ goto err_out;
if (params->fragdedupe == EROFS_FRAGDEDUPE_INODE &&
inode->fragment_size < inode->i_size) {
@@ -1871,36 +1895,30 @@ void *erofs_begin_compressed_file(struct erofs_importer *im,
}
}
}
- ictx->fpos = fpos;
- init_list_head(&ictx->extents);
- ictx->fix_dedupedfrag = false;
- ictx->fragemitted = false;
- ictx->dedupe = false;
if (all_fragments && !inode->fragment_size) {
- ret = erofs_pack_file_from_fd(inode,
- &((struct erofs_vfile){ .fd = fd }), fpos, ictx->tofh);
+ ret = erofs_pack_file_from_fd(inode, ictx->vf, ictx->fpos,
+ ictx->tofh);
if (ret)
- goto err_free_idata;
+ goto err_out;
}
+
#ifdef EROFS_MT_ENABLED
if (ictx != &g_ictx) {
ret = z_erofs_mt_compress(ictx);
if (ret)
- goto err_free_idata;
+ goto err_out;
}
#endif
- return ictx;
-
-err_free_idata:
+ return 0;
+err_out:
if (inode->idata) {
free(inode->idata);
inode->idata = NULL;
}
-err_free_ictx:
if (ictx != &g_ictx)
free(ictx);
- return ERR_PTR(ret);
+ return ret;
}
int erofs_write_compressed_file(struct z_erofs_compress_ictx *ictx)
diff --git a/lib/inode.c b/lib/inode.c
index 14a65af..e7c3edf 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -1790,6 +1790,7 @@ static int erofs_mkfs_begin_nondirectory(struct erofs_importer *im,
{
struct erofs_mkfs_job_ndir_ctx ctx =
{ .inode = inode, .fd = -1 };
+ int ret;
if (S_ISREG(inode->i_mode) && inode->i_size) {
switch (inode->datasource) {
@@ -1808,10 +1809,14 @@ static int erofs_mkfs_begin_nondirectory(struct erofs_importer *im,
}
if (ctx.fd >= 0 && cfg.c_compr_opts[0].alg &&
erofs_file_is_compressible(im, inode)) {
- ctx.ictx = erofs_begin_compressed_file(im, inode,
- ctx.fd, ctx.fpos);
+ ctx.ictx = erofs_prepare_compressed_file(im, inode);
if (IS_ERR(ctx.ictx))
return PTR_ERR(ctx.ictx);
+ erofs_bind_compressed_file_with_fd(ctx.ictx,
+ ctx.fd, ctx.fpos);
+ ret = erofs_begin_compressed_file(ctx.ictx);
+ if (ret)
+ return ret;
}
}
return erofs_mkfs_go(im, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx));
@@ -2129,11 +2134,14 @@ struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_importer *im,
if (cfg.c_compr_opts[0].alg &&
erofs_file_is_compressible(im, inode)) {
- ictx = erofs_begin_compressed_file(im, inode, fd, 0);
+ ictx = erofs_prepare_compressed_file(im, inode);
if (IS_ERR(ictx))
return ERR_CAST(ictx);
- DBG_BUGON(!ictx);
+ erofs_bind_compressed_file_with_fd(ictx, fd, 0);
+ ret = erofs_begin_compressed_file(ictx);
+ if (ret)
+ return ERR_PTR(ret);
ret = erofs_write_compressed_file(ictx);
if (!ret)
goto out;
diff --git a/lib/liberofs_compress.h b/lib/liberofs_compress.h
index e0f4d24..8b39735 100644
--- a/lib/liberofs_compress.h
+++ b/lib/liberofs_compress.h
@@ -15,8 +15,11 @@
struct z_erofs_compress_ictx;
void z_erofs_drop_inline_pcluster(struct erofs_inode *inode);
-void *erofs_begin_compressed_file(struct erofs_importer *im,
- struct erofs_inode *inode, int fd, u64 fpos);
+void *erofs_prepare_compressed_file(struct erofs_importer *im,
+ struct erofs_inode *inode);
+void erofs_bind_compressed_file_with_fd(struct z_erofs_compress_ictx *ictx,
+ int fd, u64 fpos);
+int erofs_begin_compressed_file(struct z_erofs_compress_ictx *ictx);
int erofs_write_compressed_file(struct z_erofs_compress_ictx *ictx);
int z_erofs_compress_init(struct erofs_importer *im);
--
2.43.5
More information about the Linux-erofs
mailing list