[PATCH 9/9] erofs-utils: enable mapfile for `--tar=f`

Gao Xiang hsiangkao at linux.alibaba.com
Tue Jun 18 16:48:59 AEST 2024


The data offsets in the tar streams can always be looked up now:
    mkfs.erofs --tar=f,MAPFILE IMAGE TARBALL

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/tar.c   |  3 ++-
 mkfs/main.c | 40 ++++++++++++++++++++++++++++------------
 2 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/lib/tar.c b/lib/tar.c
index 8d2caa5..532e566 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -858,7 +858,8 @@ restart:
 			eh.link = strndup(th->linkname, sizeof(th->linkname));
 	}
 
-	if (tar->index_mode && !tar->mapfile &&
+	/* EROFS metadata index referring to the original tar data */
+	if (tar->index_mode && sbi->extra_devices &&
 	    erofs_blkoff(sbi, data_offset)) {
 		erofs_err("invalid tar data alignment @ %llu", tar_offset);
 		ret = -EIO;
diff --git a/mkfs/main.c b/mkfs/main.c
index d6c1980..4a0cd7b 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -423,6 +423,27 @@ static int mkfs_apply_zfeature_bits(uintmax_t bits)
 	return 0;
 }
 
+static void mkfs_parse_tar_cfg(char *cfg)
+{
+	char *p;
+
+	tar_mode = true;
+	if (!cfg)
+		return;
+	p = strchr(cfg, ',');
+	if (p) {
+		*p = '\0';
+		if ((*++p) != '\0')
+			erofstar.mapfile = strdup(p);
+	}
+	if (!strcmp(cfg, "headerball"))
+		erofstar.headeronly_mode = true;
+
+	if (erofstar.headeronly_mode || !strcmp(optarg, "i") ||
+	    !strcmp(optarg, "0"))
+		erofstar.index_mode = true;
+}
+
 static int mkfs_parse_one_compress_alg(char *alg,
 				       struct erofs_compr_opts *copts)
 {
@@ -729,15 +750,7 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
 			cfg.c_extra_ea_name_prefixes = true;
 			break;
 		case 20:
-			if (optarg && (!strcmp(optarg, "i") || (!strcmp(optarg, "headerball") ||
-				!strcmp(optarg, "0") || !memcmp(optarg, "0,", 2)))) {
-				erofstar.index_mode = true;
-				if (!memcmp(optarg, "0,", 2))
-					erofstar.mapfile = strdup(optarg + 2);
-				if (!strcmp(optarg, "headerball"))
-					erofstar.headeronly_mode = true;
-			}
-			tar_mode = true;
+			mkfs_parse_tar_cfg(optarg);
 			break;
 		case 21:
 			erofstar.aufs = true;
@@ -1266,10 +1279,13 @@ int main(int argc, char **argv)
 				erofs_err("failed to open %s", erofstar.mapfile);
 				goto exit;
 			}
-		}
-
-		if (erofstar.index_mode)
+		} else if (erofstar.index_mode) {
+			/*
+			 * If mapfile is unspecified for tarfs index mode, 512-byte
+			 * block size is enforced here.
+			 */
 			sbi.blkszbits = 9;
+		}
 	}
 
 	if (rebuild_mode) {
-- 
2.39.3



More information about the Linux-erofs mailing list