[PATCH] erofs-utils: mkfs: support exporting GNU tar archive labels

Gao Xiang hsiangkao at linux.alibaba.com
Wed Sep 20 13:51:41 AEST 2023


GNU tar volume labels (by using `-V`) will be applied to EROFS.

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/tar.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/lib/tar.c b/lib/tar.c
index 8e71f11..1cd820f 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -17,6 +17,9 @@
 #include "erofs/blobchunk.h"
 #include "erofs/rebuild.h"
 
+/* This file is a tape/volume header.  Ignore it on extraction.  */
+#define GNUTYPE_VOLHDR 'V'
+
 struct tar_header {
 	char name[100];		/*   0-99 */
 	char mode[8];		/* 100-107 */
@@ -632,12 +635,6 @@ restart:
 		goto restart;
 	}
 
-	if (memcmp(th->magic, "ustar", 5)) {
-		erofs_err("invalid tar magic @ %llu", tar_offset);
-		ret = -EIO;
-		goto out;
-	}
-
 	/* chksum field itself treated as ' ' */
 	csum = tarerofs_otoi(th->chksum, sizeof(th->chksum));
 	if (errno) {
@@ -663,6 +660,21 @@ restart:
 		goto out;
 	}
 
+	if (th->typeflag == GNUTYPE_VOLHDR) {
+		if (th->size[0])
+			erofs_warn("GNUTYPE_VOLHDR with non-zeroed size @ %llu",
+				   tar_offset);
+		/* anyway, strncpy could cause some GCC warning here */
+		memcpy(sbi->volume_name, th->name, sizeof(sbi->volume_name));
+		goto restart;
+	}
+
+	if (memcmp(th->magic, "ustar", 5)) {
+		erofs_err("invalid tar magic @ %llu", tar_offset);
+		ret = -EIO;
+		goto out;
+	}
+
 	st.st_mode = tarerofs_otoi(th->mode, sizeof(th->mode));
 	if (errno)
 		goto invalid_tar;
-- 
2.39.3



More information about the Linux-erofs mailing list