mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
erofs: simplify z_erofs_load_compact_lcluster()
- Get rid of unpack_compacted_index() and fold it into z_erofs_load_compact_lcluster(); - Avoid a goto. Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20250114034429.431408-1-hsiangkao@linux.alibaba.com
This commit is contained in:
parent
db902986de
commit
2a810ea79c
|
|
@ -97,17 +97,48 @@ static int get_compacted_la_distance(unsigned int lobits,
|
|||
return d1;
|
||||
}
|
||||
|
||||
static int unpack_compacted_index(struct z_erofs_maprecorder *m,
|
||||
unsigned int amortizedshift,
|
||||
erofs_off_t pos, bool lookahead)
|
||||
static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,
|
||||
unsigned long lcn, bool lookahead)
|
||||
{
|
||||
struct erofs_inode *const vi = EROFS_I(m->inode);
|
||||
struct inode *const inode = m->inode;
|
||||
struct erofs_inode *const vi = EROFS_I(inode);
|
||||
const erofs_off_t ebase = sizeof(struct z_erofs_map_header) +
|
||||
ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
|
||||
const unsigned int lclusterbits = vi->z_logical_clusterbits;
|
||||
const unsigned int totalidx = erofs_iblks(inode);
|
||||
unsigned int compacted_4b_initial, compacted_2b, amortizedshift;
|
||||
unsigned int vcnt, lo, lobits, encodebits, nblk, bytes;
|
||||
bool big_pcluster;
|
||||
bool big_pcluster = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1;
|
||||
erofs_off_t pos;
|
||||
u8 *in, type;
|
||||
int i;
|
||||
|
||||
if (lcn >= totalidx || lclusterbits > 14)
|
||||
return -EINVAL;
|
||||
|
||||
m->lcn = lcn;
|
||||
/* used to align to 32-byte (compacted_2b) alignment */
|
||||
compacted_4b_initial = ((32 - ebase % 32) / 4) & 7;
|
||||
compacted_2b = 0;
|
||||
if ((vi->z_advise & Z_EROFS_ADVISE_COMPACTED_2B) &&
|
||||
compacted_4b_initial < totalidx)
|
||||
compacted_2b = rounddown(totalidx - compacted_4b_initial, 16);
|
||||
|
||||
pos = ebase;
|
||||
amortizedshift = 2; /* compact_4b */
|
||||
if (lcn >= compacted_4b_initial) {
|
||||
pos += compacted_4b_initial * 4;
|
||||
lcn -= compacted_4b_initial;
|
||||
if (lcn < compacted_2b) {
|
||||
amortizedshift = 1;
|
||||
} else {
|
||||
pos += compacted_2b * 2;
|
||||
lcn -= compacted_2b;
|
||||
}
|
||||
}
|
||||
pos += lcn * (1 << amortizedshift);
|
||||
|
||||
/* figure out the lcluster count in this pack */
|
||||
if (1 << amortizedshift == 4 && lclusterbits <= 14)
|
||||
vcnt = 2;
|
||||
else if (1 << amortizedshift == 2 && lclusterbits <= 12)
|
||||
|
|
@ -122,7 +153,6 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m,
|
|||
/* it doesn't equal to round_up(..) */
|
||||
m->nextpackoff = round_down(pos, vcnt << amortizedshift) +
|
||||
(vcnt << amortizedshift);
|
||||
big_pcluster = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1;
|
||||
lobits = max(lclusterbits, ilog2(Z_EROFS_LI_D0_CBLKCNT) + 1U);
|
||||
encodebits = ((vcnt << amortizedshift) - sizeof(__le32)) * 8 / vcnt;
|
||||
bytes = pos & ((vcnt << amortizedshift) - 1);
|
||||
|
|
@ -207,53 +237,6 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,
|
||||
unsigned long lcn, bool lookahead)
|
||||
{
|
||||
struct inode *const inode = m->inode;
|
||||
struct erofs_inode *const vi = EROFS_I(inode);
|
||||
const erofs_off_t ebase = sizeof(struct z_erofs_map_header) +
|
||||
ALIGN(erofs_iloc(inode) + vi->inode_isize + vi->xattr_isize, 8);
|
||||
unsigned int totalidx = erofs_iblks(inode);
|
||||
unsigned int compacted_4b_initial, compacted_2b;
|
||||
unsigned int amortizedshift;
|
||||
erofs_off_t pos;
|
||||
|
||||
if (lcn >= totalidx || vi->z_logical_clusterbits > 14)
|
||||
return -EINVAL;
|
||||
|
||||
m->lcn = lcn;
|
||||
/* used to align to 32-byte (compacted_2b) alignment */
|
||||
compacted_4b_initial = (32 - ebase % 32) / 4;
|
||||
if (compacted_4b_initial == 32 / 4)
|
||||
compacted_4b_initial = 0;
|
||||
|
||||
if ((vi->z_advise & Z_EROFS_ADVISE_COMPACTED_2B) &&
|
||||
compacted_4b_initial < totalidx)
|
||||
compacted_2b = rounddown(totalidx - compacted_4b_initial, 16);
|
||||
else
|
||||
compacted_2b = 0;
|
||||
|
||||
pos = ebase;
|
||||
if (lcn < compacted_4b_initial) {
|
||||
amortizedshift = 2;
|
||||
goto out;
|
||||
}
|
||||
pos += compacted_4b_initial * 4;
|
||||
lcn -= compacted_4b_initial;
|
||||
|
||||
if (lcn < compacted_2b) {
|
||||
amortizedshift = 1;
|
||||
goto out;
|
||||
}
|
||||
pos += compacted_2b * 2;
|
||||
lcn -= compacted_2b;
|
||||
amortizedshift = 2;
|
||||
out:
|
||||
pos += lcn * (1 << amortizedshift);
|
||||
return unpack_compacted_index(m, amortizedshift, pos, lookahead);
|
||||
}
|
||||
|
||||
static int z_erofs_load_lcluster_from_disk(struct z_erofs_maprecorder *m,
|
||||
unsigned int lcn, bool lookahead)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user