mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
erofs: get rid of z_erofs_do_map_blocks() forward declaration
commit 999f2f9a63 upstream.
The code can be neater without forward declarations. Let's
get rid of z_erofs_do_map_blocks() forward declaration.
Reviewed-by: Yue Hu <huyue2@coolpad.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Stable-dep-of: 9ed50b8231e3 ("erofs: fix incorrect symlink detection in fast symlink")
Link: https://lore.kernel.org/r/20230204093040.97967-5-hsiangkao@linux.alibaba.com
[ Gao Xiang: apply this to 6.6.y to avoid further backport twists
due to obsoleted EROFS_BLKSIZ. ]
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
808ccede87
commit
7b33d69a08
242
fs/erofs/zmap.c
242
fs/erofs/zmap.c
@@ -7,10 +7,6 @@
|
|||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <trace/events/erofs.h>
|
#include <trace/events/erofs.h>
|
||||||
|
|
||||||
static int z_erofs_do_map_blocks(struct inode *inode,
|
|
||||||
struct erofs_map_blocks *map,
|
|
||||||
int flags);
|
|
||||||
|
|
||||||
int z_erofs_fill_inode(struct inode *inode)
|
int z_erofs_fill_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct erofs_inode *const vi = EROFS_I(inode);
|
struct erofs_inode *const vi = EROFS_I(inode);
|
||||||
@@ -29,125 +25,6 @@ int z_erofs_fill_inode(struct inode *inode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int z_erofs_fill_inode_lazy(struct inode *inode)
|
|
||||||
{
|
|
||||||
struct erofs_inode *const vi = EROFS_I(inode);
|
|
||||||
struct super_block *const sb = inode->i_sb;
|
|
||||||
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)) {
|
|
||||||
/*
|
|
||||||
* paired with smp_mb() at the end of the function to ensure
|
|
||||||
* fields will only be observed after the bit is set.
|
|
||||||
*/
|
|
||||||
smp_mb();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wait_on_bit_lock(&vi->flags, EROFS_I_BL_Z_BIT, TASK_KILLABLE))
|
|
||||||
return -ERESTARTSYS;
|
|
||||||
|
|
||||||
err = 0;
|
|
||||||
if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags))
|
|
||||||
goto out_unlock;
|
|
||||||
|
|
||||||
pos = ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
|
|
||||||
kaddr = erofs_read_metabuf(&buf, sb, erofs_blknr(pos), EROFS_KMAP);
|
|
||||||
if (IS_ERR(kaddr)) {
|
|
||||||
err = PTR_ERR(kaddr);
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
h = kaddr + erofs_blkoff(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.
|
|
||||||
*/
|
|
||||||
if (h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT) {
|
|
||||||
vi->z_advise = Z_EROFS_ADVISE_FRAGMENT_PCLUSTER;
|
|
||||||
vi->z_fragmentoff = le64_to_cpu(*(__le64 *)h) ^ (1ULL << 63);
|
|
||||||
vi->z_tailextent_headlcn = 0;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
vi->z_advise = le16_to_cpu(h->h_advise);
|
|
||||||
vi->z_algorithmtype[0] = h->h_algorithmtype & 15;
|
|
||||||
vi->z_algorithmtype[1] = h->h_algorithmtype >> 4;
|
|
||||||
|
|
||||||
headnr = 0;
|
|
||||||
if (vi->z_algorithmtype[0] >= Z_EROFS_COMPRESSION_MAX ||
|
|
||||||
vi->z_algorithmtype[++headnr] >= Z_EROFS_COMPRESSION_MAX) {
|
|
||||||
erofs_err(sb, "unknown HEAD%u format %u for nid %llu, please upgrade kernel",
|
|
||||||
headnr + 1, vi->z_algorithmtype[headnr], vi->nid);
|
|
||||||
err = -EOPNOTSUPP;
|
|
||||||
goto out_put_metabuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
vi->z_logical_clusterbits = LOG_BLOCK_SIZE + (h->h_clusterbits & 7);
|
|
||||||
if (!erofs_sb_has_big_pcluster(EROFS_SB(sb)) &&
|
|
||||||
vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |
|
|
||||||
Z_EROFS_ADVISE_BIG_PCLUSTER_2)) {
|
|
||||||
erofs_err(sb, "per-inode big pcluster without sb feature for nid %llu",
|
|
||||||
vi->nid);
|
|
||||||
err = -EFSCORRUPTED;
|
|
||||||
goto out_put_metabuf;
|
|
||||||
}
|
|
||||||
if (vi->datalayout == EROFS_INODE_FLAT_COMPRESSION &&
|
|
||||||
!(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1) ^
|
|
||||||
!(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2)) {
|
|
||||||
erofs_err(sb, "big pcluster head1/2 of compact indexes should be consistent for nid %llu",
|
|
||||||
vi->nid);
|
|
||||||
err = -EFSCORRUPTED;
|
|
||||||
goto out_put_metabuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vi->z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER) {
|
|
||||||
struct erofs_map_blocks map = {
|
|
||||||
.buf = __EROFS_BUF_INITIALIZER
|
|
||||||
};
|
|
||||||
|
|
||||||
vi->z_idata_size = le16_to_cpu(h->h_idata_size);
|
|
||||||
err = z_erofs_do_map_blocks(inode, &map,
|
|
||||||
EROFS_GET_BLOCKS_FINDTAIL);
|
|
||||||
erofs_put_metabuf(&map.buf);
|
|
||||||
|
|
||||||
if (!map.m_plen ||
|
|
||||||
erofs_blkoff(map.m_pa) + map.m_plen > EROFS_BLKSIZ) {
|
|
||||||
erofs_err(sb, "invalid tail-packing pclustersize %llu",
|
|
||||||
map.m_plen);
|
|
||||||
err = -EFSCORRUPTED;
|
|
||||||
}
|
|
||||||
if (err < 0)
|
|
||||||
goto out_put_metabuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER &&
|
|
||||||
!(h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT)) {
|
|
||||||
struct erofs_map_blocks map = {
|
|
||||||
.buf = __EROFS_BUF_INITIALIZER
|
|
||||||
};
|
|
||||||
|
|
||||||
vi->z_fragmentoff = le32_to_cpu(h->h_fragmentoff);
|
|
||||||
err = z_erofs_do_map_blocks(inode, &map,
|
|
||||||
EROFS_GET_BLOCKS_FINDTAIL);
|
|
||||||
erofs_put_metabuf(&map.buf);
|
|
||||||
if (err < 0)
|
|
||||||
goto out_put_metabuf;
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
/* paired with smp_mb() at the beginning of the function */
|
|
||||||
smp_mb();
|
|
||||||
set_bit(EROFS_I_Z_INITED_BIT, &vi->flags);
|
|
||||||
out_put_metabuf:
|
|
||||||
erofs_put_metabuf(&buf);
|
|
||||||
out_unlock:
|
|
||||||
clear_and_wake_up_bit(EROFS_I_BL_Z_BIT, &vi->flags);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct z_erofs_maprecorder {
|
struct z_erofs_maprecorder {
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct erofs_map_blocks *map;
|
struct erofs_map_blocks *map;
|
||||||
@@ -732,6 +609,125 @@ unmap_out:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int z_erofs_fill_inode_lazy(struct inode *inode)
|
||||||
|
{
|
||||||
|
struct erofs_inode *const vi = EROFS_I(inode);
|
||||||
|
struct super_block *const sb = inode->i_sb;
|
||||||
|
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)) {
|
||||||
|
/*
|
||||||
|
* paired with smp_mb() at the end of the function to ensure
|
||||||
|
* fields will only be observed after the bit is set.
|
||||||
|
*/
|
||||||
|
smp_mb();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wait_on_bit_lock(&vi->flags, EROFS_I_BL_Z_BIT, TASK_KILLABLE))
|
||||||
|
return -ERESTARTSYS;
|
||||||
|
|
||||||
|
err = 0;
|
||||||
|
if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags))
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
pos = ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
|
||||||
|
kaddr = erofs_read_metabuf(&buf, sb, erofs_blknr(pos), EROFS_KMAP);
|
||||||
|
if (IS_ERR(kaddr)) {
|
||||||
|
err = PTR_ERR(kaddr);
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
h = kaddr + erofs_blkoff(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.
|
||||||
|
*/
|
||||||
|
if (h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT) {
|
||||||
|
vi->z_advise = Z_EROFS_ADVISE_FRAGMENT_PCLUSTER;
|
||||||
|
vi->z_fragmentoff = le64_to_cpu(*(__le64 *)h) ^ (1ULL << 63);
|
||||||
|
vi->z_tailextent_headlcn = 0;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
vi->z_advise = le16_to_cpu(h->h_advise);
|
||||||
|
vi->z_algorithmtype[0] = h->h_algorithmtype & 15;
|
||||||
|
vi->z_algorithmtype[1] = h->h_algorithmtype >> 4;
|
||||||
|
|
||||||
|
headnr = 0;
|
||||||
|
if (vi->z_algorithmtype[0] >= Z_EROFS_COMPRESSION_MAX ||
|
||||||
|
vi->z_algorithmtype[++headnr] >= Z_EROFS_COMPRESSION_MAX) {
|
||||||
|
erofs_err(sb, "unknown HEAD%u format %u for nid %llu, please upgrade kernel",
|
||||||
|
headnr + 1, vi->z_algorithmtype[headnr], vi->nid);
|
||||||
|
err = -EOPNOTSUPP;
|
||||||
|
goto out_put_metabuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
vi->z_logical_clusterbits = LOG_BLOCK_SIZE + (h->h_clusterbits & 7);
|
||||||
|
if (!erofs_sb_has_big_pcluster(EROFS_SB(sb)) &&
|
||||||
|
vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |
|
||||||
|
Z_EROFS_ADVISE_BIG_PCLUSTER_2)) {
|
||||||
|
erofs_err(sb, "per-inode big pcluster without sb feature for nid %llu",
|
||||||
|
vi->nid);
|
||||||
|
err = -EFSCORRUPTED;
|
||||||
|
goto out_put_metabuf;
|
||||||
|
}
|
||||||
|
if (vi->datalayout == EROFS_INODE_FLAT_COMPRESSION &&
|
||||||
|
!(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1) ^
|
||||||
|
!(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2)) {
|
||||||
|
erofs_err(sb, "big pcluster head1/2 of compact indexes should be consistent for nid %llu",
|
||||||
|
vi->nid);
|
||||||
|
err = -EFSCORRUPTED;
|
||||||
|
goto out_put_metabuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vi->z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER) {
|
||||||
|
struct erofs_map_blocks map = {
|
||||||
|
.buf = __EROFS_BUF_INITIALIZER
|
||||||
|
};
|
||||||
|
|
||||||
|
vi->z_idata_size = le16_to_cpu(h->h_idata_size);
|
||||||
|
err = z_erofs_do_map_blocks(inode, &map,
|
||||||
|
EROFS_GET_BLOCKS_FINDTAIL);
|
||||||
|
erofs_put_metabuf(&map.buf);
|
||||||
|
|
||||||
|
if (!map.m_plen ||
|
||||||
|
erofs_blkoff(map.m_pa) + map.m_plen > EROFS_BLKSIZ) {
|
||||||
|
erofs_err(sb, "invalid tail-packing pclustersize %llu",
|
||||||
|
map.m_plen);
|
||||||
|
err = -EFSCORRUPTED;
|
||||||
|
}
|
||||||
|
if (err < 0)
|
||||||
|
goto out_put_metabuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vi->z_advise & Z_EROFS_ADVISE_FRAGMENT_PCLUSTER &&
|
||||||
|
!(h->h_clusterbits >> Z_EROFS_FRAGMENT_INODE_BIT)) {
|
||||||
|
struct erofs_map_blocks map = {
|
||||||
|
.buf = __EROFS_BUF_INITIALIZER
|
||||||
|
};
|
||||||
|
|
||||||
|
vi->z_fragmentoff = le32_to_cpu(h->h_fragmentoff);
|
||||||
|
err = z_erofs_do_map_blocks(inode, &map,
|
||||||
|
EROFS_GET_BLOCKS_FINDTAIL);
|
||||||
|
erofs_put_metabuf(&map.buf);
|
||||||
|
if (err < 0)
|
||||||
|
goto out_put_metabuf;
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
/* paired with smp_mb() at the beginning of the function */
|
||||||
|
smp_mb();
|
||||||
|
set_bit(EROFS_I_Z_INITED_BIT, &vi->flags);
|
||||||
|
out_put_metabuf:
|
||||||
|
erofs_put_metabuf(&buf);
|
||||||
|
out_unlock:
|
||||||
|
clear_and_wake_up_bit(EROFS_I_BL_Z_BIT, &vi->flags);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
|
int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user