erofs: don't align offset for erofs_read_metabuf() (simple cases)
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 25 Apr 2024 19:59:15 +0000 (20:59 +0100)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Fri, 17 May 2024 17:47:26 +0000 (01:47 +0800)
Most of the callers of erofs_read_metabuf() have the following form:

block = erofs_blknr(sb, offset);
off = erofs_blkoff(sb, offset);
p = erofs_read_metabuf(...., erofs_pos(sb, block), ...);
if (IS_ERR(p))
return PTR_ERR(p);
q = p + off;
// no further uses of p, block or off.

The value passed to erofs_read_metabuf() is offset rounded down to block
size, i.e. offset - off.  Passing offset as-is would increase the return
value by off in case of success and keep the return value unchanged in
in case of error.  In other words, the same could be achieved by

q = erofs_read_metabuf(...., offset, ...);
if (IS_ERR(q))
return PTR_ERR(q);

This commit convert these simple cases.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Link: https://lore.kernel.org/r/20240425195915.GD1031757@ZenIV
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/data.c
fs/erofs/fscache.c
fs/erofs/super.c
fs/erofs/zmap.c

index 82a196e02b5caa5c10062b6513b773e11ae57708..604d0bc82a0e677022c5f9404c25bd2469de05ff 100644 (file)
@@ -152,7 +152,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map)
        pos = ALIGN(erofs_iloc(inode) + vi->inode_isize +
                    vi->xattr_isize, unit) + unit * chunknr;
 
-       kaddr = erofs_read_metabuf(&buf, sb, erofs_pos(sb, erofs_blknr(sb, pos)), EROFS_KMAP);
+       kaddr = erofs_read_metabuf(&buf, sb, pos, EROFS_KMAP);
        if (IS_ERR(kaddr)) {
                err = PTR_ERR(kaddr);
                goto out;
@@ -163,7 +163,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map)
 
        /* handle block map */
        if (!(vi->chunkformat & EROFS_CHUNK_FORMAT_INDEXES)) {
-               __le32 *blkaddr = kaddr + erofs_blkoff(sb, pos);
+               __le32 *blkaddr = kaddr;
 
                if (le32_to_cpu(*blkaddr) == EROFS_NULL_ADDR) {
                        map->m_flags = 0;
@@ -174,7 +174,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map)
                goto out_unlock;
        }
        /* parse chunk indexes */
-       idx = kaddr + erofs_blkoff(sb, pos);
+       idx = kaddr;
        switch (le32_to_cpu(idx->blkaddr)) {
        case EROFS_NULL_ADDR:
                map->m_flags = 0;
@@ -294,11 +294,10 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
                struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
 
                iomap->type = IOMAP_INLINE;
-               ptr = erofs_read_metabuf(&buf, sb,
-                               erofs_pos(sb, erofs_blknr(sb, mdev.m_pa)), EROFS_KMAP);
+               ptr = erofs_read_metabuf(&buf, sb, mdev.m_pa, EROFS_KMAP);
                if (IS_ERR(ptr))
                        return PTR_ERR(ptr);
-               iomap->inline_data = ptr + erofs_blkoff(sb, mdev.m_pa);
+               iomap->inline_data = ptr;
                iomap->private = buf.base;
        } else {
                iomap->type = IOMAP_MAPPED;
index ac618b3484f12000825b800a6d5f81feeabf2b9f..fda16eedafb57858adeea0f15c9736044ba8239f 100644 (file)
@@ -273,21 +273,15 @@ static int erofs_fscache_data_read_slice(struct erofs_fscache_rq *req)
        if (map.m_flags & EROFS_MAP_META) {
                struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
                struct iov_iter iter;
-               erofs_blk_t blknr;
-               size_t offset, size;
+               size_t size = map.m_llen;
                void *src;
 
-               /* For tail packing layout, the offset may be non-zero. */
-               offset = erofs_blkoff(sb, map.m_pa);
-               blknr = erofs_blknr(sb, map.m_pa);
-               size = map.m_llen;
-
-               src = erofs_read_metabuf(&buf, sb, erofs_pos(sb, blknr), EROFS_KMAP);
+               src = erofs_read_metabuf(&buf, sb, map.m_pa, EROFS_KMAP);
                if (IS_ERR(src))
                        return PTR_ERR(src);
 
                iov_iter_xarray(&iter, ITER_DEST, &mapping->i_pages, pos, PAGE_SIZE);
-               if (copy_to_iter(src + offset, size, &iter) != size) {
+               if (copy_to_iter(src, size, &iter) != size) {
                        erofs_put_metabuf(&buf);
                        return -EFAULT;
                }
index 95b05a9490a2dbc04795cea0f2002c567da1175b..c93bd24d27717264aa972c13850b3cc9bd2419b5 100644 (file)
@@ -178,12 +178,10 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb,
        struct erofs_fscache *fscache;
        struct erofs_deviceslot *dis;
        struct file *bdev_file;
-       void *ptr;
 
-       ptr = erofs_read_metabuf(buf, sb, erofs_pos(sb, erofs_blknr(sb, *pos)), EROFS_KMAP);
-       if (IS_ERR(ptr))
-               return PTR_ERR(ptr);
-       dis = ptr + erofs_blkoff(sb, *pos);
+       dis = erofs_read_metabuf(buf, sb, *pos, EROFS_KMAP);
+       if (IS_ERR(dis))
+               return PTR_ERR(dis);
 
        if (!sbi->devs->flatdev && !dif->path) {
                if (!dis->tag[0]) {
index 222fc66366e00ef1f94f8e0cdeab7ce5583a12da..8979def17b582cbbab3a521d86ddce417238e5e2 100644 (file)
@@ -570,7 +570,6 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
        int err, headnr;
        erofs_off_t pos;
        struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
-       void *kaddr;
        struct z_erofs_map_header *h;
 
        if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags)) {
@@ -590,13 +589,12 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
                goto out_unlock;
 
        pos = ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
-       kaddr = erofs_read_metabuf(&buf, sb, erofs_pos(sb, erofs_blknr(sb, pos)), EROFS_KMAP);
-       if (IS_ERR(kaddr)) {
-               err = PTR_ERR(kaddr);
+       h = erofs_read_metabuf(&buf, sb, pos, EROFS_KMAP);
+       if (IS_ERR(h)) {
+               err = PTR_ERR(h);
                goto out_unlock;
        }
 
-       h = kaddr + erofs_blkoff(sb, pos);
        /*
         * if the highest bit of the 8-byte map header is set, the whole file
         * is stored in the packed inode. The rest bits keeps z_fragmentoff.