]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
erofs: refine erofs_iomap_begin()
authorGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 16 Jul 2025 09:22:54 +0000 (17:22 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Thu, 24 Jul 2025 11:42:06 +0000 (19:42 +0800)
 - 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
fs/erofs/data.c

index dd7d86809c18813e6a4b8eac700a9e1ab31632c9..383c1337e157d9689654f8f50a0609032d78f0b4 100644 (file)
@@ -269,6 +269,16 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
        if (ret < 0)
                return ret;
 
+       iomap->offset = map.m_la;
+       iomap->length = map.m_llen;
+       iomap->flags = 0;
+       iomap->private = NULL;
+       if (!(map.m_flags & EROFS_MAP_MAPPED)) {
+               iomap->type = IOMAP_HOLE;
+               iomap->addr = IOMAP_NULL_ADDR;
+               return 0;
+       }
+
        mdev = (struct erofs_map_dev) {
                .m_deviceid = map.m_deviceid,
                .m_pa = map.m_pa,
@@ -277,22 +287,14 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
        if (ret)
                return ret;
 
-       iomap->offset = map.m_la;
        if (flags & IOMAP_DAX)
                iomap->dax_dev = mdev.m_dif->dax_dev;
        else
                iomap->bdev = mdev.m_bdev;
-       iomap->length = map.m_llen;
-       iomap->flags = 0;
-       iomap->private = NULL;
 
-       if (!(map.m_flags & EROFS_MAP_MAPPED)) {
-               iomap->type = IOMAP_HOLE;
-               iomap->addr = IOMAP_NULL_ADDR;
-               if (!iomap->length)
-                       iomap->length = length;
-               return 0;
-       }
+       iomap->addr = mdev.m_dif->fsoff + mdev.m_pa;
+       if (flags & IOMAP_DAX)
+               iomap->addr += mdev.m_dif->dax_part_off;
 
        if (map.m_flags & EROFS_MAP_META) {
                void *ptr;
@@ -306,9 +308,6 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
                iomap->private = buf.base;
        } else {
                iomap->type = IOMAP_MAPPED;
-               iomap->addr = mdev.m_dif->fsoff + mdev.m_pa;
-               if (flags & IOMAP_DAX)
-                       iomap->addr += mdev.m_dif->dax_part_off;
        }
        return 0;
 }