]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
erofs: handle 48-bit blocks_hi for compressed inodes
authorZhan Xusheng <zhanxusheng@xiaomi.com>
Mon, 22 Jun 2026 08:11:36 +0000 (16:11 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Mon, 22 Jun 2026 10:50:36 +0000 (18:50 +0800)
Combine i_nb.blocks_hi with i_u.blocks_lo when computing
inode->i_blocks for compressed inodes, mirroring the startblk_hi
handling for unencoded inodes a few lines above.  Also evaluate
the shift in u64 to avoid truncation.

Fixes: efb2aef569b3 ("erofs: add encoded extent on-disk definition")
Fixes: 1d191b4ca51d ("erofs: implement encoded extent metadata")
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/inode.c

index 1df38b7c82a7139769c1dc78920b0330204f350c..45afe5c50de83032cd1c58a77ce4c14a5b0f543b 100644 (file)
@@ -191,8 +191,9 @@ static int erofs_read_inode(struct inode *inode)
                err = -EFSCORRUPTED;
                goto err_out;
        } else {
-               inode->i_blocks = le32_to_cpu(copied.i_u.blocks_lo) <<
-                               (sb->s_blocksize_bits - 9);
+               inode->i_blocks = (le32_to_cpu(copied.i_u.blocks_lo) |
+                       ((u64)le16_to_cpu(copied.i_nb.blocks_hi) << 32)) <<
+                                 (sb->s_blocksize_bits - 9);
        }
 
        if (vi->datalayout == EROFS_INODE_CHUNK_BASED) {