]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
erofs: fix encoded extents handling
authorGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 8 Apr 2025 11:44:48 +0000 (19:44 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 9 Apr 2025 14:56:31 +0000 (22:56 +0800)
 - The MSB 32 bits of `z_fragmentoff` are available only in extent
records of size >= 8B.

 - Use round_down() to calculate `lstart` as well as increase `pos`
   correspondingly for extent records of size == 8B.

Fixes: 1d191b4ca51d ("erofs: implement encoded extent metadata")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250408114448.4040220-2-hsiangkao@linux.alibaba.com
fs/erofs/zmap.c

index 8de50df05dfe1ba872600e3d80e18b6055e48e3d..14ea47f954f5526695fc3306b7dc8230ffec7809 100644 (file)
@@ -559,7 +559,8 @@ static int z_erofs_map_blocks_ext(struct inode *inode,
                        pos += sizeof(__le64);
                        lstart = 0;
                } else {
-                       lstart = map->m_la >> vi->z_lclusterbits;
+                       lstart = round_down(map->m_la, 1 << vi->z_lclusterbits);
+                       pos += (lstart >> vi->z_lclusterbits) * recsz;
                        pa = EROFS_NULL_ADDR;
                }
 
@@ -614,7 +615,7 @@ static int z_erofs_map_blocks_ext(struct inode *inode,
                if (last && (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER)) {
                        map->m_flags |= EROFS_MAP_MAPPED | EROFS_MAP_FRAGMENT;
                        vi->z_fragmentoff = map->m_plen;
-                       if (recsz >= offsetof(struct z_erofs_extent, pstart_lo))
+                       if (recsz > offsetof(struct z_erofs_extent, pstart_lo))
                                vi->z_fragmentoff |= map->m_pa << 32;
                } else if (map->m_plen) {
                        map->m_flags |= EROFS_MAP_MAPPED |