Add option --hard-dereference to dereference hardlinks when creating an image. Instead of reusing the inode, hardlinks are added as separate inodes. This is useful for reproducible builds, when the rootfs is space-optimized using hardlinks on some machines, but not on others.
Co-authored-by: Leonard Cohnen <leonard.coh...@gmail.com> Signed-off-by: Paul Meyer <katexoch...@gmail.com> --- v3: Fix commit title and body, fix usage ordering. v2: https://lore.kernel.org/all/20241212135630.15811-1-katexoch...@gmail.com/ v1: https://lore.kernel.org/all/20241211150734.97830-1-katexoch...@gmail.com/ --- include/erofs/config.h | 1 + lib/inode.c | 2 +- mkfs/main.c | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/erofs/config.h b/include/erofs/config.h index cff4cea..bb03e70 100644 --- a/include/erofs/config.h +++ b/include/erofs/config.h @@ -58,6 +58,7 @@ struct erofs_configure { bool c_extra_ea_name_prefixes; bool c_xattr_name_filter; bool c_ovlfs_strip; + bool c_hard_dereference; #ifdef HAVE_LIBSELINUX struct selabel_handle *sehnd; diff --git a/lib/inode.c b/lib/inode.c index 7e5c581..0404a8d 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -1141,7 +1141,7 @@ static struct erofs_inode *erofs_iget_from_srcpath(struct erofs_sb_info *sbi, * hard-link, just return it. Also don't lookup for directories * since hard-link directory isn't allowed. */ - if (!S_ISDIR(st.st_mode)) { + if (!S_ISDIR(st.st_mode) && (!cfg.c_hard_dereference)) { inode = erofs_iget(st.st_dev, st.st_ino); if (inode) return inode; diff --git a/mkfs/main.c b/mkfs/main.c index d422787..b94923f 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -85,6 +85,7 @@ static struct option long_options[] = { {"mkfs-time", no_argument, NULL, 525}, {"all-time", no_argument, NULL, 526}, {"sort", required_argument, NULL, 527}, + {"hard-dereference", no_argument, NULL, 528}, {0, 0, 0, 0}, }; @@ -174,6 +175,7 @@ static void usage(int argc, char **argv) " --force-gid=# set all file gids to # (# = GID)\n" " --uid-offset=# add offset # to all file uids (# = id offset)\n" " --gid-offset=# add offset # to all file gids (# = id offset)\n" + " --hard-dereference dereference hardlinks, add links as separate inodes\n" " --ignore-mtime use build time instead of strict per-file modification time\n" " --max-extent-bytes=# set maximum decompressed extent size # in bytes\n" " --mount-point=X X=prefix of target fs path (default: /)\n" @@ -846,6 +848,9 @@ static int mkfs_parse_options_cfg(int argc, char *argv[]) if (!strcmp(optarg, "none")) erofstar.try_no_reorder = true; break; + case 528: + cfg.c_hard_dereference = true; + break; case 'V': version(); exit(0); -- 2.47.0