- 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 <hsiang...@linux.alibaba.com>
---
 fs/erofs/data.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/fs/erofs/data.c b/fs/erofs/data.c
index dd7d86809c18..383c1337e157 100644
--- a/fs/erofs/data.c
+++ b/fs/erofs/data.c
@@ -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;
 }
-- 
2.43.5


Reply via email to