[PATCH v1] erofs-utils: mkfs: fix fingerprint not set in certain modes
Yuezhang.Mo at sony.com
Yuezhang.Mo at sony.com
Fri Apr 10 19:00:24 AEST 2026
> On 2026/4/10 14:05, Yuezhang Mo wrote:
> > In certain modes, such as "--tar=f --sort=none", data is written to
> > the image before fingerprint calculation. In this case, ->datasource
> > will be set to `EROFS_INODE_DATA_SOURCE_NONE`.
> >
> > The original `erofs_set_inode_fingerprint()` function only attempts to
> > read data from a local file or disk buffer; it cannot handle the
> > `EROFS_INODE_DATA_SOURCE_NONE` case, causing fingerprint setting to be
> > skipped.
> >
> > This patch adds handling for the `EROFS_INODE_DATA_SOURCE_NONE` case,
> > reading data from the image and calculating the fingerprint.
> >
> > Signed-off-by: Yuezhang Mo <Yuezhang.Mo at sony.com>
> > Reviewed-by: Friendy Su <friendy.su at sony.com>
> > Reviewed-by: Daniel Palmer <daniel.palmer at sony.com>
> > ---
> > lib/inode.c | 20 ++++++++++++++------
> > 1 file changed, 14 insertions(+), 6 deletions(-)
> >
> > diff --git a/lib/inode.c b/lib/inode.c
> > index 2cfc6c5..51d5266 100644
> > --- a/lib/inode.c
> > +++ b/lib/inode.c
> > @@ -1975,6 +1975,13 @@ static int erofs_set_inode_fingerprint(struct erofs_inode *inode, int fd,
> >
> > if (!ishare_xattr_prefix_id)
> > return 0;
> > +
> > + if (inode->datasource == EROFS_INODE_DATA_SOURCE_NONE) {
> > + ret = erofs_iopen(&vf, inode);
> > + if (ret)
> > + return ret;
> > + }
> > +
> > erofs_sha256_init(&md);
> > do {
> > u8 buf[32768];
> > @@ -2018,12 +2025,6 @@ static int erofs_mkfs_begin_nondirectory(const struct erofs_mkfs_btctx *btctx,
> > goto out;
> > }
> >
> > - if (S_ISREG(inode->i_mode) && inode->i_size) {
> > - ret = erofs_set_inode_fingerprint(inode, ctx.fd, ctx.fpos);
> > - if (ret < 0)
> > - return ret;
> > - }
>
> I vaguely remembered we have to leave it here since
> otherwise it may impact compressed files.
>
> Also EROFS_INODE_DATA_SOURCE_NONE means that mkfs
> dump will change nothing about that, so I suggest
>
> apply erofs_set_inode_fingerprint() to every
> EROFS_INODE_DATA_SOURCE_NONE user
> (e.g. in lib/tar.c) instead.
>
Hi Xiang,
This will bring a bit big code change.
How about changing it like this? It maintains the original
order and the change is simple.
@@ -1975,6 +1975,13 @@ static int erofs_set_inode_fingerprint(struct erofs_inode *inode, int fd,
if (!ishare_xattr_prefix_id)
return 0;
+
+ if (inode->datasource == EROFS_INODE_DATA_SOURCE_NONE) {
+ ret = erofs_iopen(&vf, inode);
+ if (ret)
+ return ret;
+ }
+
erofs_sha256_init(&md);
do {
u8 buf[32768];
@@ -2014,6 +2021,8 @@ static int erofs_mkfs_begin_nondirectory(const struct erofs_mkfs_btctx *btctx,
if (ctx.fd < 0)
return -errno;
break;
+ case EROFS_INODE_DATA_SOURCE_NONE:
+ break;
default:
goto out;
}
@@ -2024,6 +2033,9 @@ static int erofs_mkfs_begin_nondirectory(const struct erofs_mkfs_btctx *btctx,
return ret;
}
+ if (inode->datasource == EROFS_INODE_DATA_SOURCE_NONE)
+ goto out;
+
if (inode->sbi->available_compr_algs &&
erofs_file_is_compressible(im, inode)) {
ctx.ictx = erofs_prepare_compressed_file(im, inode);
Thanks.
More information about the Linux-erofs
mailing list