From: Yifan Zhao <stopire@gmail.com>
To: linux-erofs@lists.ozlabs.org
Cc: xiang@kernel.org
Subject: [PATCH v2 2/4] erofs-utils: lib: fix large chunk index writes
Date: Mon, 21 Sep 2026 21:35:33 +0800 [thread overview]
Message-ID: <20260921133535.2381246-2-stopire@gmail.com> (raw)
In-Reply-To: <20260921133535.2381246-1-stopire@gmail.com>
Use ssize_t for chunk index write results in erofs_write_chunk_indexes()
and erofs_iflush(). Widen index buffer offsets and inode metadata size
calculations to avoid truncation with large index tables.
Assisted-by: Codex:gpt-6-astra
Signed-off-by: Yifan Zhao <stopire@gmail.com>
---
lib/blobchunk.c | 7 ++++---
lib/inode.c | 19 +++++++++----------
lib/liberofs_chunk.h | 4 ++--
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/lib/blobchunk.c b/lib/blobchunk.c
index 8f43dd0..2f42541 100644
--- a/lib/blobchunk.c
+++ b/lib/blobchunk.c
@@ -192,8 +192,8 @@ void erofs_inode_fixup_chunkformat(struct erofs_inode *inode)
inode->u.chunkformat |= EROFS_CHUNK_FORMAT_48BIT;
}
-int erofs_write_chunk_indexes(struct erofs_inode *inode, struct erofs_vfile *vf,
- erofs_off_t off)
+ssize_t erofs_write_chunk_indexes(struct erofs_inode *inode, struct erofs_vfile *vf,
+ erofs_off_t off)
{
struct erofs_sb_info *sbi = inode->sbi;
erofs_blk_t remaining_blks = BLK_ROUND_UP(sbi, inode->i_size);
@@ -201,7 +201,8 @@ int erofs_write_chunk_indexes(struct erofs_inode *inode, struct erofs_vfile *vf,
erofs_blk_t extent_end = EROFS_NULL_ADDR, chunkblks, addrmask;
erofs_blk_t extent_start = EROFS_NULL_ADDR;
erofs_off_t source_offset;
- unsigned int dst, src, unit, zeroedlen;
+ unsigned int unit, zeroedlen;
+ size_t dst, src;
bool _48bit;
if (inode->u.chunkformat & EROFS_CHUNK_FORMAT_INDEXES)
diff --git a/lib/inode.c b/lib/inode.c
index ec96556..0cf09b8 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -816,7 +816,8 @@ int erofs_iflush(struct erofs_inode *inode)
struct iovec iov[2];
char *xattrs = NULL;
bool nlink_1 = true;
- int ret, fmt;
+ ssize_t ret;
+ int fmt;
DBG_BUGON(inode->nid == EROFS_NID_UNALLOCATED);
DBG_BUGON(bh && erofs_btell(bh, false) != off);
@@ -998,11 +999,11 @@ static bool erofs_inode_need_48bit(struct erofs_inode *inode)
return false;
}
-static unsigned int erofs_inode_meta_size(struct erofs_inode *inode)
+static erofs_off_t erofs_inode_meta_size(struct erofs_inode *inode)
{
- unsigned int inodesize;
+ erofs_off_t inodesize;
- inodesize = inode->inode_isize + inode->xattr_isize;
+ inodesize = inode->inode_isize + (erofs_off_t)inode->xattr_isize;
if (inode->extent_isize)
inodesize = roundup(inodesize, 8) + inode->extent_isize;
return inodesize;
@@ -1014,7 +1015,7 @@ static int erofs_prepare_inode_buffer(struct erofs_importer *im,
const struct erofs_importer_params *params = im->params;
struct erofs_sb_info *sbi = im->sbi;
struct erofs_bufmgr *ibmgr;
- unsigned int inodesize;
+ erofs_off_t inodesize;
struct erofs_buffer_head *bh, *ibh;
DBG_BUGON(inode->bh || inode->bh_inline);
@@ -2456,7 +2457,8 @@ int erofs_fixup_root_inode(struct erofs_inode *root)
{
struct erofs_sb_info *sbi = root->sbi;
struct erofs_inode oi;
- unsigned int ondisk_capacity, ondisk_size;
+ unsigned int ondisk_capacity;
+ erofs_off_t ondisk_size;
char *ibuf;
int err;
@@ -2484,10 +2486,7 @@ int erofs_fixup_root_inode(struct erofs_inode *root)
if (oi.datalayout == EROFS_INODE_FLAT_INLINE)
ondisk_capacity += erofs_blkoff(sbi, oi.i_size);
- ondisk_size = root->inode_isize + root->xattr_isize;
- if (root->extent_isize)
- ondisk_size = roundup(ondisk_size, 8) + root->extent_isize;
- ondisk_size += root->idata_size;
+ ondisk_size = erofs_inode_meta_size(root) + root->idata_size;
if (ondisk_size > ondisk_capacity) {
erofs_err("no enough room for the root inode from nid %llu",
diff --git a/lib/liberofs_chunk.h b/lib/liberofs_chunk.h
index 16f3d05..64e7ec8 100644
--- a/lib/liberofs_chunk.h
+++ b/lib/liberofs_chunk.h
@@ -18,8 +18,8 @@ struct erofs_chunkitem *erofs_get_unhashed_chunk(struct erofs_sb_info *sbi,
unsigned int device_id, erofs_blk_t blkaddr,
erofs_off_t sourceoffset);
void erofs_inode_fixup_chunkformat(struct erofs_inode *inode);
-int erofs_write_chunk_indexes(struct erofs_inode *inode, struct erofs_vfile *vf,
- erofs_off_t off);
+ssize_t erofs_write_chunk_indexes(struct erofs_inode *inode, struct erofs_vfile *vf,
+ erofs_off_t off);
int erofs_blob_write_chunked_file(struct erofs_inode *inode, int fd,
erofs_off_t startoff, int device_id);
int erofs_write_zero_inode(struct erofs_inode *inode);
--
2.55.0
next prev parent reply other threads:[~2026-09-21 13:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 13:35 [PATCH v2 1/4] erofs-utils: lib: fix short write retries Yifan Zhao
2026-09-21 13:35 ` Yifan Zhao [this message]
2026-09-21 13:35 ` [PATCH v2 3/4] erofs-utils: mkfs: add file-delta framework Yifan Zhao
2026-09-21 13:35 ` [PATCH v2 4/4] erofs-utils: mkfs: support dm-persistent file deltas Yifan Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260921133535.2381246-2-stopire@gmail.com \
--to=stopire@gmail.com \
--cc=linux-erofs@lists.ozlabs.org \
--cc=xiang@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox