FILE *erofs_packedfile_init(void);
void erofs_packedfile_exit(void);
-struct erofs_inode *erofs_mkfs_build_packedfile(void);
+int erofs_flush_packed_inode(struct erofs_sb_info *sbi);
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);
return len;
}
-struct erofs_inode *erofs_mkfs_build_packedfile(void)
+int erofs_flush_packed_inode(struct erofs_sb_info *sbi)
{
+ struct erofs_inode *inode;
+
+ if (!erofs_sb_has_fragments(sbi))
+ return -EINVAL;
fflush(packedfile);
+ if (!ftello(packedfile))
+ return 0;
- return erofs_mkfs_build_special_from_fd(&sbi, fileno(packedfile),
- EROFS_PACKED_INODE);
+ inode = erofs_mkfs_build_special_from_fd(sbi, fileno(packedfile),
+ EROFS_PACKED_INODE);
+ sbi->packed_nid = erofs_lookupnid(inode);
+ erofs_iput(inode);
+ return 0;
}
void erofs_packedfile_exit(void)
static int erofs_mkfs_dump_tree(struct erofs_inode *root, bool rebuild)
{
- struct erofs_inode *dumpdir;
+ struct erofs_sb_info *sbi = root->sbi;
+ struct erofs_inode *dumpdir = erofs_igrab(root);
int err;
erofs_mark_parent_inode(root, root); /* rootdir mark */
root->next_dirwrite = NULL;
- (void)erofs_igrab(root);
- dumpdir = root;
err = !rebuild ? erofs_mkfs_handle_inode(root) :
erofs_rebuild_handle_inode(root);
if (err)
return err;
- erofs_mkfs_flushjobs(root->sbi);
+ erofs_mkfs_flushjobs(sbi);
erofs_fixup_meta_blkaddr(root); /* assign root NID */
+ sbi->root_nid = root->nid;
+
do {
int err;
struct erofs_inode *dir = dumpdir;
}
*last = dumpdir; /* fixup the last (or the only) one */
dumpdir = head;
- err = erofs_mkfs_go(dir->sbi, EROFS_MKFS_JOB_DIR_BH,
+ err = erofs_mkfs_go(sbi, EROFS_MKFS_JOB_DIR_BH,
&dir, sizeof(dir));
if (err)
return err;
{
int err = 0;
struct erofs_buffer_head *sb_bh;
- struct erofs_inode *root, *packed_inode;
+ struct erofs_inode *root;
erofs_blk_t nblocks;
struct timeval t;
FILE *packedfile = NULL;
goto exit;
}
}
- sbi.root_nid = erofs_lookupnid(root);
erofs_iput(root);
if (erofstar.index_mode && sbi.extra_devices && !erofstar.mapfile)
sbi.devs[0].blocks = BLK_ROUND_UP(&sbi, erofstar.offset);
- if (erofstar.index_mode || cfg.c_chunkbits || sbi.extra_devices) {
- err = erofs_mkfs_dump_blobs(&sbi);
+ if (erofs_sb_has_fragments(&sbi)) {
+ erofs_update_progressinfo("Handling packed data ...");
+ err = erofs_flush_packed_inode(&sbi);
if (err)
goto exit;
}
- sbi.packed_nid = 0;
- if ((cfg.c_fragments || cfg.c_extra_ea_name_prefixes) &&
- erofs_sb_has_fragments(&sbi)) {
- erofs_update_progressinfo("Handling packed_file ...");
- packed_inode = erofs_mkfs_build_packedfile();
- if (IS_ERR(packed_inode)) {
- err = PTR_ERR(packed_inode);
+ if (erofstar.index_mode || cfg.c_chunkbits || sbi.extra_devices) {
+ err = erofs_mkfs_dump_blobs(&sbi);
+ if (err)
goto exit;
- }
- sbi.packed_nid = erofs_lookupnid(packed_inode);
- erofs_iput(packed_inode);
}
/* flush all buffers except for the superblock */