erofs: tidy up z_erofs_do_read_page()
- Fix a typo: spiltted => split; - Move !EROFS_MAP_MAPPED and EROFS_MAP_FRAGMENT upwards; - Increase `split` in advance to avoid unnecessary repeats. Reviewed-by: Yue Hu <huyue2@coolpad.com> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20230817082813.81180-4-hsiangkao@linux.alibaba.com
This commit is contained in:
@ -981,49 +981,34 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
|
|||||||
struct erofs_map_blocks *const map = &fe->map;
|
struct erofs_map_blocks *const map = &fe->map;
|
||||||
const loff_t offset = page_offset(page);
|
const loff_t offset = page_offset(page);
|
||||||
bool tight = true, exclusive;
|
bool tight = true, exclusive;
|
||||||
unsigned int cur, end, len, spiltted;
|
unsigned int cur, end, len, split;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
/* register locked file pages as online pages in pack */
|
|
||||||
z_erofs_onlinepage_init(page);
|
z_erofs_onlinepage_init(page);
|
||||||
|
|
||||||
spiltted = 0;
|
split = 0;
|
||||||
end = PAGE_SIZE;
|
end = PAGE_SIZE;
|
||||||
repeat:
|
repeat:
|
||||||
cur = end - 1;
|
if (offset + end - 1 < map->m_la ||
|
||||||
|
offset + end - 1 >= map->m_la + map->m_llen) {
|
||||||
if (offset + cur < map->m_la ||
|
|
||||||
offset + cur >= map->m_la + map->m_llen) {
|
|
||||||
z_erofs_pcluster_end(fe);
|
z_erofs_pcluster_end(fe);
|
||||||
map->m_la = offset + cur;
|
map->m_la = offset + end - 1;
|
||||||
map->m_llen = 0;
|
map->m_llen = 0;
|
||||||
err = z_erofs_map_blocks_iter(inode, map, 0);
|
err = z_erofs_map_blocks_iter(inode, map, 0);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
} else if (fe->pcl) {
|
|
||||||
goto hitted;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((map->m_flags & EROFS_MAP_MAPPED) &&
|
cur = offset > map->m_la ? 0 : map->m_la - offset;
|
||||||
!(map->m_flags & EROFS_MAP_FRAGMENT)) {
|
/* bump split parts first to avoid several separate cases */
|
||||||
err = z_erofs_pcluster_begin(fe);
|
++split;
|
||||||
if (err)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
hitted:
|
|
||||||
/*
|
|
||||||
* Ensure the current partial page belongs to this submit chain rather
|
|
||||||
* than other concurrent submit chains or the noio(bypass) chain since
|
|
||||||
* those chains are handled asynchronously thus the page cannot be used
|
|
||||||
* for inplace I/O or bvpage (should be processed in a strict order.)
|
|
||||||
*/
|
|
||||||
tight &= (fe->mode > Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE);
|
|
||||||
|
|
||||||
cur = end - min_t(erofs_off_t, offset + end - map->m_la, end);
|
|
||||||
if (!(map->m_flags & EROFS_MAP_MAPPED)) {
|
if (!(map->m_flags & EROFS_MAP_MAPPED)) {
|
||||||
zero_user_segment(page, cur, end);
|
zero_user_segment(page, cur, end);
|
||||||
|
tight = false;
|
||||||
goto next_part;
|
goto next_part;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (map->m_flags & EROFS_MAP_FRAGMENT) {
|
if (map->m_flags & EROFS_MAP_FRAGMENT) {
|
||||||
erofs_off_t fpos = offset + cur - map->m_la;
|
erofs_off_t fpos = offset + cur - map->m_la;
|
||||||
|
|
||||||
@ -1032,12 +1017,24 @@ hitted:
|
|||||||
EROFS_I(inode)->z_fragmentoff + fpos);
|
EROFS_I(inode)->z_fragmentoff + fpos);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
++spiltted;
|
|
||||||
tight = false;
|
tight = false;
|
||||||
goto next_part;
|
goto next_part;
|
||||||
}
|
}
|
||||||
|
|
||||||
exclusive = (!cur && (!spiltted || tight));
|
if (!fe->pcl) {
|
||||||
|
err = z_erofs_pcluster_begin(fe);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure the current partial page belongs to this submit chain rather
|
||||||
|
* than other concurrent submit chains or the noio(bypass) chain since
|
||||||
|
* those chains are handled asynchronously thus the page cannot be used
|
||||||
|
* for inplace I/O or bvpage (should be processed in a strict order.)
|
||||||
|
*/
|
||||||
|
tight &= (fe->mode > Z_EROFS_PCLUSTER_FOLLOWED_NOINPLACE);
|
||||||
|
exclusive = (!cur && ((split <= 1) || tight));
|
||||||
if (cur)
|
if (cur)
|
||||||
tight &= (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED);
|
tight &= (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED);
|
||||||
|
|
||||||
@ -1050,8 +1047,6 @@ hitted:
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
z_erofs_onlinepage_split(page);
|
z_erofs_onlinepage_split(page);
|
||||||
/* bump up the number of spiltted parts of a page */
|
|
||||||
++spiltted;
|
|
||||||
if (fe->pcl->pageofs_out != (map->m_la & ~PAGE_MASK))
|
if (fe->pcl->pageofs_out != (map->m_la & ~PAGE_MASK))
|
||||||
fe->pcl->multibases = true;
|
fe->pcl->multibases = true;
|
||||||
if (fe->pcl->length < offset + end - map->m_la) {
|
if (fe->pcl->length < offset + end - map->m_la) {
|
||||||
|
Reference in New Issue
Block a user