Commit e4c1cf52 authored by Gao Xiang's avatar Gao Xiang
Browse files

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: default avatarYue Hu <huyue2@coolpad.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20230817082813.81180-4-hsiangkao@linux.alibaba.com
parent aeebae9d
Loading
Loading
Loading
Loading
+24 −29
Original line number Diff line number Diff line
@@ -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;
	const loff_t offset = page_offset(page);
	bool tight = true, exclusive;
	unsigned int cur, end, len, spiltted;
	unsigned int cur, end, len, split;
	int err = 0;

	/* register locked file pages as online pages in pack */
	z_erofs_onlinepage_init(page);

	spiltted = 0;
	split = 0;
	end = PAGE_SIZE;
repeat:
	cur = end - 1;

	if (offset + cur < map->m_la ||
	    offset + cur >= map->m_la + map->m_llen) {
	if (offset + end - 1 < map->m_la ||
	    offset + end - 1 >= map->m_la + map->m_llen) {
		z_erofs_pcluster_end(fe);
		map->m_la = offset + cur;
		map->m_la = offset + end - 1;
		map->m_llen = 0;
		err = z_erofs_map_blocks_iter(inode, map, 0);
		if (err)
			goto out;
	} else if (fe->pcl) {
		goto hitted;
	}

	if ((map->m_flags & EROFS_MAP_MAPPED) &&
	    !(map->m_flags & EROFS_MAP_FRAGMENT)) {
		err = z_erofs_pcluster_begin(fe);
		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 = offset > map->m_la ? 0 : map->m_la - offset;
	/* bump split parts first to avoid several separate cases */
	++split;

	cur = end - min_t(erofs_off_t, offset + end - map->m_la, end);
	if (!(map->m_flags & EROFS_MAP_MAPPED)) {
		zero_user_segment(page, cur, end);
		tight = false;
		goto next_part;
	}

	if (map->m_flags & EROFS_MAP_FRAGMENT) {
		erofs_off_t fpos = offset + cur - map->m_la;

@@ -1032,12 +1017,24 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
				EROFS_I(inode)->z_fragmentoff + fpos);
		if (err)
			goto out;
		++spiltted;
		tight = false;
		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)
		tight &= (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED);

@@ -1050,8 +1047,6 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
		goto out;

	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))
		fe->pcl->multibases = true;
	if (fe->pcl->length < offset + end - map->m_la) {