[PATCH] erofs-utils: mkfs: fragment: gracefully exit if temporary storage is low

Gao Xiang hsiangkao at linux.alibaba.com
Wed Feb 12 23:36:33 AEDT 2025


Currently, EROFS keeps all fragments into a temporary file for later
packed inode compression.  However, this could trigger an unexpected
segfault if temporary storage runs low.

Print a proper error message and gracefully exit.

Closes: https://github.com/erofs/erofs-utils/issues/13
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 include/erofs/internal.h | 3 ++-
 lib/fragments.c          | 4 ++++
 lib/inode.c              | 8 +++-----
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 5f5bc10..2f71557 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -256,7 +256,6 @@ struct erofs_inode {
 	unsigned int eof_tailrawsize;
 
 	union {
-		void *compressmeta;
 		void *chunkindexes;
 		struct {
 			uint16_t z_advise;
@@ -274,6 +273,8 @@ struct erofs_inode {
 #define z_idata_size	idata_size
 		};
 	};
+	void *compressmeta;
+
 #ifdef WITH_ANDROID
 	uint64_t capabilities;
 #endif
diff --git a/lib/fragments.c b/lib/fragments.c
index 32ac6f5..9633a2b 100644
--- a/lib/fragments.c
+++ b/lib/fragments.c
@@ -266,6 +266,10 @@ int z_erofs_pack_file_from_fd(struct erofs_inode *inode, int fd, u32 tofcrc)
 	else
 		rc = 0;
 out:
+	if (rc)
+		erofs_err("Failed to record %llu-byte fragment data @ %llu for nid %llu: %d",
+			  inode->fragment_size | 0ULL,
+			  inode->fragmentoff | 0ULL, inode->nid | 0ULL, rc);
 	if (memblock)
 		munmap(memblock, inode->i_size);
 	return rc;
diff --git a/lib/inode.c b/lib/inode.c
index e51c0fc..434eafb 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -141,16 +141,14 @@ unsigned int erofs_iput(struct erofs_inode *inode)
 		free(d);
 
 	free(inode->compressmeta);
-	if (inode->eof_tailraw)
-		free(inode->eof_tailraw);
+	free(inode->eof_tailraw);
 	list_del(&inode->i_hash);
-	if (inode->i_srcpath)
-		free(inode->i_srcpath);
+	free(inode->i_srcpath);
 
 	if (inode->datasource == EROFS_INODE_DATA_SOURCE_DISKBUF) {
 		erofs_diskbuf_close(inode->i_diskbuf);
 		free(inode->i_diskbuf);
-	} else if (inode->i_link) {
+	} else {
 		free(inode->i_link);
 	}
 	free(inode);
-- 
2.43.5



More information about the Linux-erofs mailing list