[PATCH v2] erofs-utils: mkfs: use extended inodes when ctime is set

David Anderson dvander at google.com
Fri Mar 18 16:25:36 AEDT 2022


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 <dvander at google.com>
---
 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



More information about the Linux-erofs mailing list