Currently ctime is effectively ignored because most inodes are compact. If ctime was set, and it's different from the build time, then extended inodes should be used instead.
To guarantee that timestamps do not cause extended inodes, a fixed timestamp should be used (-T). Additionally, a new --ignore-mtime option has been added to preserve the old behavior. Signed-off-by: David Anderson <[email protected]> --- include/erofs/config.h | 1 + lib/config.c | 1 + lib/inode.c | 5 +++++ man/mkfs.erofs.1 | 5 +++++ mkfs/main.c | 5 +++++ 5 files changed, 17 insertions(+) diff --git a/include/erofs/config.h b/include/erofs/config.h index cb064b6..0a1b18b 100644 --- a/include/erofs/config.h +++ b/include/erofs/config.h @@ -43,6 +43,7 @@ struct erofs_configure { char c_timeinherit; char c_chunkbits; bool c_noinline_data; + bool c_ignore_mtime; #ifdef HAVE_LIBSELINUX struct selabel_handle *sehnd; diff --git a/lib/config.c b/lib/config.c index f1c8edf..cc15e57 100644 --- a/lib/config.c +++ b/lib/config.c @@ -20,6 +20,7 @@ void erofs_init_configure(void) cfg.c_dbg_lvl = EROFS_WARN; cfg.c_version = PACKAGE_VERSION; cfg.c_dry_run = false; + cfg.c_ignore_mtime = false; cfg.c_compr_level_master = -1; cfg.c_force_inodeversion = 0; cfg.c_inline_xattr_tolerance = 2; diff --git a/lib/inode.c b/lib/inode.c index 461c797..99a4b2f 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -730,6 +730,11 @@ static bool erofs_should_use_inode_extended(struct erofs_inode *inode) return true; if (inode->i_nlink > USHRT_MAX) return true; + if ((inode->i_ctime != sbi.build_time || + inode->i_ctime_nsec != sbi.build_time_nsec) && + !cfg.c_ignore_mtime) { + return true; + } return false; } diff --git a/man/mkfs.erofs.1 b/man/mkfs.erofs.1 index 9c7788e..679291b 100644 --- a/man/mkfs.erofs.1 +++ b/man/mkfs.erofs.1 @@ -109,6 +109,11 @@ Set all file uids to \fIUID\fR. .BI "\-\-force-gid=" GID Set all file gids to \fIGID\fR. .TP +.BI "\-\-ignore-mtime" +File modification time is ignored whenever it would cause \fBmkfs.erofs\fR to +use extended inodes over compact inodes. When not using a fixed timestamp, +this can reduce metadata size. +.TP .B \-\-help Display this help and exit. .TP diff --git a/mkfs/main.c b/mkfs/main.c index 3f34450..93caf67 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -49,6 +49,7 @@ static struct option long_options[] = { {"chunksize", required_argument, NULL, 11}, {"quiet", no_argument, 0, 12}, {"blobdev", required_argument, NULL, 13}, + {"ignore-mtime", no_argument, NULL, 14}, #ifdef WITH_ANDROID {"mount-point", required_argument, NULL, 512}, {"product-out", required_argument, NULL, 513}, @@ -95,6 +96,7 @@ static void usage(void) #endif " --force-uid=# set all file uids to # (# = UID)\n" " --force-gid=# set all file gids to # (# = GID)\n" + " --ignore-mtime use build time and ignore inode modification time\n" " --help display this help and exit\n" " --max-extent-bytes=# set maximum decompressed extent size # in bytes\n" " --quiet quiet execution (do not write anything to standard output.)\n" @@ -366,6 +368,9 @@ static int mkfs_parse_options_cfg(int argc, char *argv[]) case 13: cfg.c_blobdev_path = optarg; break; + case 14: + cfg.c_ignore_mtime = true; + break; case 1: usage(); exit(0); -- 2.35.1.894.gb6a874cedc-goog
