The `EROFS_INODE_COMPRESSED_FULL` datalayout should be used forcibly.

Fixes: cf04b8b78f09 ("erofs-utils: mkfs: implement extent-based deduplication")
Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/fragments.h |  1 -
 lib/compress.c            | 13 +++++++++++--
 lib/fragments.c           | 25 ++++++-------------------
 3 files changed, 17 insertions(+), 22 deletions(-)

diff --git a/include/erofs/fragments.h b/include/erofs/fragments.h
index ccfdd9b..a57b63c 100644
--- a/include/erofs/fragments.h
+++ b/include/erofs/fragments.h
@@ -17,7 +17,6 @@ extern const char *erofs_frags_packedname;
 
 int z_erofs_fragments_dedupe(struct erofs_inode *inode, int fd, u32 *tofcrc);
 
-void z_erofs_fragments_commit(struct erofs_inode *inode);
 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);
diff --git a/lib/compress.c b/lib/compress.c
index 9f71022..1742529 100644
--- a/lib/compress.c
+++ b/lib/compress.c
@@ -1004,7 +1004,13 @@ static void *z_erofs_write_indexes(struct 
z_erofs_compress_ictx *ctx)
        struct z_erofs_extent_item *ei, *n;
        void *metabuf;
 
-       if (!cfg.c_legacy_compress && !ctx->dedupe &&
+       /*
+        * If the packed inode is larger than 4GiB, the full fragmentoff
+        * will be recorded by switching to the noncompact layout anyway.
+        */
+       if (inode->fragment_size && inode->fragmentoff >> 32) {
+               inode->datalayout = EROFS_INODE_COMPRESSED_FULL;
+       } else if (!cfg.c_legacy_compress && !ctx->dedupe &&
            inode->z_logical_clusterbits <= 14) {
                if (inode->z_logical_clusterbits <= 12)
                        inode->z_advise |= Z_EROFS_ADVISE_COMPACTED_2B;
@@ -1165,7 +1171,10 @@ int erofs_commit_compressed_file(struct 
z_erofs_compress_ictx *ictx,
        u8 *compressmeta;
        int ret;
 
-       z_erofs_fragments_commit(inode);
+       if (inode->fragment_size) {
+               inode->z_advise |= Z_EROFS_ADVISE_FRAGMENT_PCLUSTER;
+               erofs_sb_set_fragments(inode->sbi);
+       }
 
        /* fall back to no compression mode */
        DBG_BUGON(pstart < (!!inode->idata_size) << bbits);
diff --git a/lib/fragments.c b/lib/fragments.c
index 41b9912..9dfe0e3 100644
--- a/lib/fragments.c
+++ b/lib/fragments.c
@@ -179,21 +179,6 @@ static int z_erofs_fragments_dedupe_insert(struct 
list_head *hash, void *data,
        return 0;
 }
 
-void z_erofs_fragments_commit(struct erofs_inode *inode)
-{
-       if (!inode->fragment_size)
-               return;
-       /*
-        * If the packed inode is larger than 4GiB, the full fragmentoff
-        * will be recorded by switching to the noncompact layout anyway.
-        */
-       if (inode->fragmentoff >> 32)
-               inode->datalayout = EROFS_INODE_COMPRESSED_FULL;
-
-       inode->z_advise |= Z_EROFS_ADVISE_FRAGMENT_PCLUSTER;
-       erofs_sb_set_fragments(inode->sbi);
-}
-
 int z_erofs_pack_file_from_fd(struct erofs_inode *inode, int fd, u32 tofcrc)
 {
        struct erofs_packed_inode *epi = inode->sbi->packedinode;
@@ -250,8 +235,9 @@ int z_erofs_pack_file_from_fd(struct erofs_inode *inode, 
int fd, u32 tofcrc)
                }
        }
 
-       erofs_dbg("Recording %llu fragment data at %llu",
-                 inode->fragment_size | 0ULL, inode->fragmentoff | 0ULL);
+       erofs_dbg("Recording %llu fragment data at %llu of %s",
+                 inode->fragment_size | 0ULL, inode->fragmentoff | 0ULL,
+                 inode->i_srcpath);
 
        if (memblock)
                rc = z_erofs_fragments_dedupe_insert(
@@ -289,8 +275,9 @@ int z_erofs_pack_fragments(struct erofs_inode *inode, void 
*data,
                return -EIO;
        }
 
-       erofs_dbg("Recording %llu fragment data at %llu",
-                 inode->fragment_size | 0ULL, inode->fragmentoff | 0ULL);
+       erofs_dbg("Recording %llu fragment data at %llu of %s",
+                 inode->fragment_size | 0ULL, inode->fragmentoff | 0ULL,
+                 inode->i_srcpath);
 
        ret = z_erofs_fragments_dedupe_insert(&epi->hash[FRAGMENT_HASH(tofcrc)],
                                              data, len, inode->fragmentoff);
-- 
2.43.5


Reply via email to