Later packed_inode will be used in more scenarios other than fragments,
thus extract the separate packedfile API for future use.

Signed-off-by: Jingbo Xu <[email protected]>
---
 include/erofs/config.h    |  1 +
 include/erofs/fragments.h | 19 ++++++++++++++++---
 include/erofs/inode.h     |  2 ++
 lib/fragments.c           | 20 ++++++++------------
 mkfs/main.c               | 32 ++++++++++++++++++++++++--------
 5 files changed, 51 insertions(+), 23 deletions(-)

diff --git a/include/erofs/config.h b/include/erofs/config.h
index 648a3e8..e4d4130 100644
--- a/include/erofs/config.h
+++ b/include/erofs/config.h
@@ -52,6 +52,7 @@ struct erofs_configure {
        bool c_dedupe;
        bool c_ignore_mtime;
        bool c_showprogress;
+       bool c_packedfile;
 
 #ifdef HAVE_LIBSELINUX
        struct selabel_handle *sehnd;
diff --git a/include/erofs/fragments.h b/include/erofs/fragments.h
index 21753ec..1b7c06b 100644
--- a/include/erofs/fragments.h
+++ b/include/erofs/fragments.h
@@ -12,15 +12,28 @@ extern "C"
 
 #include "erofs/internal.h"
 
-extern const char *frags_packedname;
-#define EROFS_PACKED_INODE     frags_packedname
+extern FILE *packedfile;
+int erofs_packedfile_init(void);
+void erofs_packedfile_exit(void);
+struct erofs_inode *erofs_mkfs_build_packedfile(void);
+
+static inline int erofs_packedfile_is_empty(void)
+{
+#ifdef HAVE_FTELLO64
+       off64_t offset = ftello64(packedfile);
+#else
+       off_t offset = ftello(packedfile);
+#endif
+       if (offset < 0)
+               return -errno;
+       return offset == 0;
+}
 
 int z_erofs_fragments_dedupe(struct erofs_inode *inode, int fd, u32 *tofcrc);
 int z_erofs_pack_file_from_fd(struct erofs_inode *inode, int fd, u32 tofcrc);
 int z_erofs_pack_fragments(struct erofs_inode *inode, void *data,
                           unsigned int len, u32 tofcrc);
 void z_erofs_fragments_commit(struct erofs_inode *inode);
-struct erofs_inode *erofs_mkfs_build_fragments(void);
 int erofs_fragments_init(void);
 void erofs_fragments_exit(void);
 
diff --git a/include/erofs/inode.h b/include/erofs/inode.h
index 058a235..cb8568a 100644
--- a/include/erofs/inode.h
+++ b/include/erofs/inode.h
@@ -21,6 +21,8 @@ void erofs_inode_manager_init(void);
 unsigned int erofs_iput(struct erofs_inode *inode);
 erofs_nid_t erofs_lookupnid(struct erofs_inode *inode);
 struct erofs_inode *erofs_mkfs_build_tree_from_path(const char *path);
+
+#define EROFS_PACKED_INODE     ("packed_file")
 struct erofs_inode *erofs_mkfs_build_special_from_fd(int fd, const char *name);
 
 #ifdef __cplusplus
diff --git a/lib/fragments.c b/lib/fragments.c
index 0366c82..25d72f9 100644
--- a/lib/fragments.c
+++ b/lib/fragments.c
@@ -39,8 +39,7 @@ struct erofs_fragment_dedupe_item {
 
 static struct list_head dupli_frags[FRAGMENT_HASHSIZE];
 
-static FILE *packedfile;
-const char *frags_packedname = "packed_file";
+FILE *packedfile;
 
 #ifndef HAVE_LSEEK64
 #define erofs_lseek64 lseek
@@ -195,15 +194,16 @@ static int z_erofs_fragments_dedupe_insert(void *data, 
unsigned int len,
        return 0;
 }
 
-static void z_erofs_fragments_dedupe_init(void)
+int erofs_fragments_init(void)
 {
        unsigned int i;
 
        for (i = 0; i < FRAGMENT_HASHSIZE; ++i)
                init_list_head(&dupli_frags[i]);
+       return 0;
 }
 
-static void z_erofs_fragments_dedupe_exit(void)
+void erofs_fragments_exit(void)
 {
        struct erofs_fragment_dedupe_item *di, *n;
        struct list_head *head;
@@ -324,23 +324,21 @@ int z_erofs_pack_fragments(struct erofs_inode *inode, 
void *data,
        return len;
 }
 
-struct erofs_inode *erofs_mkfs_build_fragments(void)
+struct erofs_inode *erofs_mkfs_build_packedfile(void)
 {
        fflush(packedfile);
 
        return erofs_mkfs_build_special_from_fd(fileno(packedfile),
-                                               frags_packedname);
+                                               EROFS_PACKED_INODE);
 }
 
-void erofs_fragments_exit(void)
+void erofs_packedfile_exit(void)
 {
        if (packedfile)
                fclose(packedfile);
-
-       z_erofs_fragments_dedupe_exit();
 }
 
-int erofs_fragments_init(void)
+int erofs_packedfile_init(void)
 {
 #ifdef HAVE_TMPFILE64
        packedfile = tmpfile64();
@@ -349,7 +347,5 @@ int erofs_fragments_init(void)
 #endif
        if (!packedfile)
                return -ENOMEM;
-
-       z_erofs_fragments_dedupe_init();
        return 0;
 }
diff --git a/mkfs/main.c b/mkfs/main.c
index 65d3df6..50fd908 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -555,6 +555,8 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
                }
                cfg.c_pclusterblks_packed = pclustersize_packed >> 
sbi.blkszbits;
        }
+       if (cfg.c_fragments)
+               cfg.c_packedfile = true;
        return 0;
 }
 
@@ -770,10 +772,17 @@ int main(int argc, char **argv)
        }
 #endif
        erofs_show_config();
-       if (cfg.c_fragments) {
+       if (cfg.c_packedfile) {
                if (!cfg.c_pclusterblks_packed)
                        cfg.c_pclusterblks_packed = cfg.c_pclusterblks_def;
 
+               err = erofs_packedfile_init();
+               if (err) {
+                       erofs_err("failed to initialize packedfile");
+                       return 1;
+               }
+       }
+       if (cfg.c_fragments) {
                err = erofs_fragments_init();
                if (err) {
                        erofs_err("failed to initialize fragments");
@@ -880,15 +889,20 @@ int main(int argc, char **argv)
        }
 
        packed_nid = 0;
-       if (cfg.c_fragments && erofs_sb_has_fragments()) {
-               erofs_update_progressinfo("Handling packed_file ...");
-               packed_inode = erofs_mkfs_build_fragments();
-               if (IS_ERR(packed_inode)) {
-                       err = PTR_ERR(packed_inode);
+       if (cfg.c_packedfile) {
+               err = erofs_packedfile_is_empty();
+               if (err < 0)
                        goto exit;
+               if (!err) {
+                       erofs_update_progressinfo("Handling packed_file ...");
+                       packed_inode = erofs_mkfs_build_packedfile();
+                       if (IS_ERR(packed_inode)) {
+                               err = PTR_ERR(packed_inode);
+                               goto exit;
+                       }
+                       packed_nid = erofs_lookupnid(packed_inode);
+                       erofs_iput(packed_inode);
                }
-               packed_nid = erofs_lookupnid(packed_inode);
-               erofs_iput(packed_inode);
        }
 
        err = erofs_mkfs_update_super_block(sb_bh, root_nid, &nblocks,
@@ -917,6 +931,8 @@ exit:
                erofs_blob_exit();
        if (cfg.c_fragments)
                erofs_fragments_exit();
+       if (cfg.c_packedfile)
+               erofs_packedfile_exit();
        erofs_exit_configure();
 
        if (err) {
-- 
2.19.1.6.gb485710b

Reply via email to