Hi, Xiang, On 2025/5/31 8:29, Gao Xiang wrote:
The timestamp of the packed inode should be fixed to the build time.Fixes: 9fa9b017f773 ("erofs-utils: mkfs: support fragments") Signed-off-by: Gao Xiang <[email protected]> --- lib/inode.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/inode.c b/lib/inode.c index 7a10624..ca49a80 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -910,7 +910,8 @@ out: return 0; }-static bool erofs_should_use_inode_extended(struct erofs_inode *inode)+static bool erofs_should_use_inode_extended(struct erofs_inode *inode, + const char *path) { if (cfg.c_force_inodeversion == FORCE_INODE_EXTENDED) return true; @@ -924,7 +925,8 @@ static bool erofs_should_use_inode_extended(struct erofs_inode *inode) return true; if (inode->i_nlink > USHRT_MAX) return true; - if ((inode->i_mtime != inode->sbi->build_time || + if (path != EROFS_PACKED_INODE && + (inode->i_mtime != inode->sbi->build_time || inode->i_mtime_nsec != inode->sbi->build_time_nsec) && !cfg.c_ignore_mtime) return true; @@ -1016,6 +1018,10 @@ int __erofs_fill_inode(struct erofs_inode *inode, struct stat *st, erofs_err("gid overflow @ %s", path); inode->i_gid += cfg.c_gid_offset;+ if (path == EROFS_PACKED_INODE) {+ inode->i_mtime = sbi->build_time; + inode->i_mtime_nsec = 0; + } inode->i_mtime = st->st_mtime; inode->i_mtime_nsec = ST_MTIM_NSEC(st);
Should we put the condition in here? Because it will be reassigned if we do like this.
And what about assigning sbi->build_time_nsec to inode->i_mtime_nsec like the FIXED case?
Thanks, Hongbo
@@ -1065,7 +1071,7 @@ static int erofs_fill_inode(struct erofs_inode *inode, struct stat *st,if (!inode->i_srcpath) return -ENOMEM;- if (erofs_should_use_inode_extended(inode)) {+ if (erofs_should_use_inode_extended(inode, path)) { if (cfg.c_force_inodeversion == FORCE_INODE_COMPACT) { erofs_err("file %s cannot be in compact form", inode->i_srcpath); @@ -1610,7 +1616,7 @@ static int erofs_rebuild_handle_inode(struct erofs_inode *inode, erofs_update_progressinfo("Processing %s ...", trimmed); free(trimmed);- if (erofs_should_use_inode_extended(inode)) {+ if (erofs_should_use_inode_extended(inode, inode->i_srcpath)) { if (cfg.c_force_inodeversion == FORCE_INODE_COMPACT) { erofs_err("file %s cannot be in compact form", inode->i_srcpath);
