This improves performance of meta-only image creation in cases where the
source is a tarball stream that is not seekable. The writer may now use
`--tar=headerball` and omit the file data. Previously, the stream writer
was forced to send the file's size worth of null bytes or any data after
each tar header which was simply discarded by mkfs.erofs.
Signed-off-by: Mike Baynton <mike@mbaynton.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240227084221.342635-1-hsiangkao@linux.alibaba.com
int fd;
u64 offset;
- bool index_mode, aufs;
+ bool index_mode, headeronly_mode, aufs;
};
void erofs_iostream_close(struct erofs_iostream *ios);
ret = tarerofs_write_chunkes(inode, data_offset);
if (ret)
return ret;
- if (erofs_iostream_lskip(&tar->ios, inode->i_size))
+ if (!tar->headeronly_mode && erofs_iostream_lskip(&tar->ios, inode->i_size))
return -EIO;
return 0;
}
unnoticable memory overhead and page cache thrashing.
.PP
mkfs.erofs is used to create such EROFS filesystem \fIDESTINATION\fR image file
-from \fISOURCE\fR directory.
+from \fISOURCE\fR directory or tarball.
.SH OPTIONS
.TP
.BI "\-z " compression-algorithm \fR[\fP, # \fR][\fP: ... \fR]\fP
would overflow compact inodes. This is the default. Overrides
.BR --ignore-mtime .
.TP
-.B "\-\-tar=f"
-Generate a full EROFS image from a tarball.
-.TP
-.B "\-\-tar=i"
-Generate an meta-only EROFS image from a tarball.
+.BI "\-\-tar, \-\-tar="MODE
+Treat \fISOURCE\fR as a tarball or tarball-like "headerball" rather than as a
+directory.
+
+\fIMODE\fR may be one of \fBf\fR, \fBi\fR, or \fBheaderball\fR.
+
+\fBf\fR: Generate a full EROFS image from a regular tarball. (default)
+
+\fBi\fR: Generate a meta-only EROFS image from a regular tarball. Only
+metadata such as dentries, inodes, and xattrs will be added to the image,
+without file data. Uses for such images include as a layer in an overlay
+filesystem with other data-only layers.
+
+\fBheaderball\fR: Generate a meta-only EROFS image from a stream identical
+to a tarball except that file data is not present after each file header.
+It can improve performance especially when \fISOURCE\fR is not seekable.
.TP
.BI "\-\-uid-offset=" UIDOFFSET
Add \fIUIDOFFSET\fR to all file UIDs.
" --preserve-mtime keep per-file modification time strictly\n"
" --offset=# skip # bytes at the beginning of IMAGE.\n"
" --aufs replace aufs special files with overlayfs metadata\n"
- " --tar=[fi] generate an image from tarball(s)\n"
+ " --tar=X generate a full or index-only image from a tarball(-ish) source\n"
+ " (X = f|i|headerball; f=full mode, i=index mode,\n"
+ " headerball=file data is omited in the source stream)\n"
" --ovlfs-strip=<0,1> strip overlayfs metadata in the target image (e.g. whiteouts)\n"
" --quiet quiet execution (do not write anything to standard output.)\n"
#ifndef NDEBUG
cfg.c_extra_ea_name_prefixes = true;
break;
case 20:
- if (optarg && (!strcmp(optarg, "i") ||
- !strcmp(optarg, "0") || !memcmp(optarg, "0,", 2))) {
+ 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;
break;