Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

erofs: refine erofs_iomap_begin()

- Avoid calling erofs_map_dev() for unmapped extents;

- Assign `iomap->addr` for inline extents too (since they have physical
location).

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250716092254.3826715-1-hsiangkao@linux.alibaba.com

Gao Xiang f7686854 df50848b

+13 -14
+13 -14
fs/erofs/data.c
··· 269 269 if (ret < 0) 270 270 return ret; 271 271 272 + iomap->offset = map.m_la; 273 + iomap->length = map.m_llen; 274 + iomap->flags = 0; 275 + iomap->private = NULL; 276 + if (!(map.m_flags & EROFS_MAP_MAPPED)) { 277 + iomap->type = IOMAP_HOLE; 278 + iomap->addr = IOMAP_NULL_ADDR; 279 + return 0; 280 + } 281 + 272 282 mdev = (struct erofs_map_dev) { 273 283 .m_deviceid = map.m_deviceid, 274 284 .m_pa = map.m_pa, ··· 287 277 if (ret) 288 278 return ret; 289 279 290 - iomap->offset = map.m_la; 291 280 if (flags & IOMAP_DAX) 292 281 iomap->dax_dev = mdev.m_dif->dax_dev; 293 282 else 294 283 iomap->bdev = mdev.m_bdev; 295 - iomap->length = map.m_llen; 296 - iomap->flags = 0; 297 - iomap->private = NULL; 298 284 299 - if (!(map.m_flags & EROFS_MAP_MAPPED)) { 300 - iomap->type = IOMAP_HOLE; 301 - iomap->addr = IOMAP_NULL_ADDR; 302 - if (!iomap->length) 303 - iomap->length = length; 304 - return 0; 305 - } 285 + iomap->addr = mdev.m_dif->fsoff + mdev.m_pa; 286 + if (flags & IOMAP_DAX) 287 + iomap->addr += mdev.m_dif->dax_part_off; 306 288 307 289 if (map.m_flags & EROFS_MAP_META) { 308 290 void *ptr; ··· 308 306 iomap->private = buf.base; 309 307 } else { 310 308 iomap->type = IOMAP_MAPPED; 311 - iomap->addr = mdev.m_dif->fsoff + mdev.m_pa; 312 - if (flags & IOMAP_DAX) 313 - iomap->addr += mdev.m_dif->dax_part_off; 314 309 } 315 310 return 0; 316 311 }