On 2024/12/12 21:56, Paul Meyer wrote:
Add option --hardlink-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.


The subject and commit message is still unchanged...

Co-authored-by: Leonard Cohnen <leonard.coh...@gmail.com>
Signed-off-by: Paul Meyer <katexoch...@gmail.com>
---

v1: https://lore.kernel.org/all/20241211150734.97830-1-katexoch...@gmail.com/
change since v1:
  - rename option to --hard-dereference
  - add usage

  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..7eb86f5 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},
  };
@@ -214,6 +215,7 @@ static void usage(int argc, char **argv)
  #ifdef EROFS_MT_ENABLED
                , erofs_get_available_processors() /* --workers= */
  #endif
+               " --hard-dereference    dereference hardlinks, add links as separate 
inodes\n"


Does it compile with EROFS_MT_ENABLED?...

Also `--hard-dereference` should be moved upwards to match
alphabetical order.

Thanks,
Gao Xiang

        );
  }
@@ -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);

Reply via email to