Commit 076d965e authored by Al Viro's avatar Al Viro Committed by Gao Xiang

erofs: don't align offset for erofs_read_metabuf() (simple cases)

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
Link: https://lore.kernel.org/r/20240425195915.GD1031757@ZenIVSigned-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
parent e0981544
...@@ -152,7 +152,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map) ...@@ -152,7 +152,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map)
pos = ALIGN(erofs_iloc(inode) + vi->inode_isize + pos = ALIGN(erofs_iloc(inode) + vi->inode_isize +
vi->xattr_isize, unit) + unit * chunknr; 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)) { if (IS_ERR(kaddr)) {
err = PTR_ERR(kaddr); err = PTR_ERR(kaddr);
goto out; goto out;
...@@ -163,7 +163,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map) ...@@ -163,7 +163,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map)
/* handle block map */ /* handle block map */
if (!(vi->chunkformat & EROFS_CHUNK_FORMAT_INDEXES)) { 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) { if (le32_to_cpu(*blkaddr) == EROFS_NULL_ADDR) {
map->m_flags = 0; map->m_flags = 0;
...@@ -174,7 +174,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map) ...@@ -174,7 +174,7 @@ int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map)
goto out_unlock; goto out_unlock;
} }
/* parse chunk indexes */ /* parse chunk indexes */
idx = kaddr + erofs_blkoff(sb, pos); idx = kaddr;
switch (le32_to_cpu(idx->blkaddr)) { switch (le32_to_cpu(idx->blkaddr)) {
case EROFS_NULL_ADDR: case EROFS_NULL_ADDR:
map->m_flags = 0; map->m_flags = 0;
...@@ -294,11 +294,10 @@ static int erofs_iomap_begin(struct inode *inode, loff_t offset, loff_t length, ...@@ -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; struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
iomap->type = IOMAP_INLINE; iomap->type = IOMAP_INLINE;
ptr = erofs_read_metabuf(&buf, sb, ptr = erofs_read_metabuf(&buf, sb, mdev.m_pa, EROFS_KMAP);
erofs_pos(sb, erofs_blknr(sb, mdev.m_pa)), EROFS_KMAP);
if (IS_ERR(ptr)) if (IS_ERR(ptr))
return PTR_ERR(ptr); return PTR_ERR(ptr);
iomap->inline_data = ptr + erofs_blkoff(sb, mdev.m_pa); iomap->inline_data = ptr;
iomap->private = buf.base; iomap->private = buf.base;
} else { } else {
iomap->type = IOMAP_MAPPED; iomap->type = IOMAP_MAPPED;
......
...@@ -273,21 +273,15 @@ static int erofs_fscache_data_read_slice(struct erofs_fscache_rq *req) ...@@ -273,21 +273,15 @@ static int erofs_fscache_data_read_slice(struct erofs_fscache_rq *req)
if (map.m_flags & EROFS_MAP_META) { if (map.m_flags & EROFS_MAP_META) {
struct erofs_buf buf = __EROFS_BUF_INITIALIZER; struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
struct iov_iter iter; struct iov_iter iter;
erofs_blk_t blknr; size_t size = map.m_llen;
size_t offset, size;
void *src; void *src;
/* For tail packing layout, the offset may be non-zero. */ src = erofs_read_metabuf(&buf, sb, map.m_pa, EROFS_KMAP);
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);
if (IS_ERR(src)) if (IS_ERR(src))
return PTR_ERR(src); return PTR_ERR(src);
iov_iter_xarray(&iter, ITER_DEST, &mapping->i_pages, pos, PAGE_SIZE); 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); erofs_put_metabuf(&buf);
return -EFAULT; return -EFAULT;
} }
......
...@@ -178,12 +178,10 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb, ...@@ -178,12 +178,10 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb,
struct erofs_fscache *fscache; struct erofs_fscache *fscache;
struct erofs_deviceslot *dis; struct erofs_deviceslot *dis;
struct file *bdev_file; struct file *bdev_file;
void *ptr;
ptr = erofs_read_metabuf(buf, sb, erofs_pos(sb, erofs_blknr(sb, *pos)), EROFS_KMAP); dis = erofs_read_metabuf(buf, sb, *pos, EROFS_KMAP);
if (IS_ERR(ptr)) if (IS_ERR(dis))
return PTR_ERR(ptr); return PTR_ERR(dis);
dis = ptr + erofs_blkoff(sb, *pos);
if (!sbi->devs->flatdev && !dif->path) { if (!sbi->devs->flatdev && !dif->path) {
if (!dis->tag[0]) { if (!dis->tag[0]) {
......
...@@ -570,7 +570,6 @@ static int z_erofs_fill_inode_lazy(struct inode *inode) ...@@ -570,7 +570,6 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
int err, headnr; int err, headnr;
erofs_off_t pos; erofs_off_t pos;
struct erofs_buf buf = __EROFS_BUF_INITIALIZER; struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
void *kaddr;
struct z_erofs_map_header *h; struct z_erofs_map_header *h;
if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags)) { if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags)) {
...@@ -590,13 +589,12 @@ static int z_erofs_fill_inode_lazy(struct inode *inode) ...@@ -590,13 +589,12 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
goto out_unlock; goto out_unlock;
pos = ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8); 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); h = erofs_read_metabuf(&buf, sb, pos, EROFS_KMAP);
if (IS_ERR(kaddr)) { if (IS_ERR(h)) {
err = PTR_ERR(kaddr); err = PTR_ERR(h);
goto out_unlock; goto out_unlock;
} }
h = kaddr + erofs_blkoff(sb, pos);
/* /*
* if the highest bit of the 8-byte map header is set, the whole file * 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. * is stored in the packed inode. The rest bits keeps z_fragmentoff.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment