forked from Minki/linux
erofs: introduce `z_erofs_parse_out_bvecs()'
`z_erofs_decompress_pcluster()' is too long therefore it'd be better to introduce another helper to parse decompressed pages (or laterly, decompressed bvecs.) BTW, since `decompressed_bvecs' is too long as a part of the function name, `out_bvecs' is used instead. Reviewed-by: Yue Hu <huyue2@coolpad.com> Acked-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20220715154203.48093-4-hsiangkao@linux.alibaba.com
This commit is contained in:
parent
0d823b424f
commit
42fec235f1
@ -778,18 +778,58 @@ static bool z_erofs_page_is_invalidated(struct page *page)
|
||||
return !page->mapping && !z_erofs_is_shortlived_page(page);
|
||||
}
|
||||
|
||||
static int z_erofs_parse_out_bvecs(struct z_erofs_pcluster *pcl,
|
||||
struct page **pages, struct page **pagepool)
|
||||
{
|
||||
struct z_erofs_pagevec_ctor ctor;
|
||||
enum z_erofs_page_type page_type;
|
||||
int i, err = 0;
|
||||
|
||||
z_erofs_pagevec_ctor_init(&ctor, Z_EROFS_NR_INLINE_PAGEVECS,
|
||||
pcl->pagevec, 0);
|
||||
for (i = 0; i < pcl->vcnt; ++i) {
|
||||
struct page *page = z_erofs_pagevec_dequeue(&ctor, &page_type);
|
||||
unsigned int pagenr;
|
||||
|
||||
/* all pages in pagevec ought to be valid */
|
||||
DBG_BUGON(!page);
|
||||
DBG_BUGON(z_erofs_page_is_invalidated(page));
|
||||
|
||||
if (z_erofs_put_shortlivedpage(pagepool, page))
|
||||
continue;
|
||||
|
||||
if (page_type == Z_EROFS_VLE_PAGE_TYPE_HEAD)
|
||||
pagenr = 0;
|
||||
else
|
||||
pagenr = z_erofs_onlinepage_index(page);
|
||||
|
||||
DBG_BUGON(pagenr >= pcl->nr_pages);
|
||||
/*
|
||||
* currently EROFS doesn't support multiref(dedup),
|
||||
* so here erroring out one multiref page.
|
||||
*/
|
||||
if (pages[pagenr]) {
|
||||
DBG_BUGON(1);
|
||||
SetPageError(pages[pagenr]);
|
||||
z_erofs_onlinepage_endio(pages[pagenr]);
|
||||
err = -EFSCORRUPTED;
|
||||
}
|
||||
pages[pagenr] = page;
|
||||
}
|
||||
z_erofs_pagevec_ctor_exit(&ctor, true);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int z_erofs_decompress_pcluster(struct super_block *sb,
|
||||
struct z_erofs_pcluster *pcl,
|
||||
struct page **pagepool)
|
||||
{
|
||||
struct erofs_sb_info *const sbi = EROFS_SB(sb);
|
||||
unsigned int pclusterpages = z_erofs_pclusterpages(pcl);
|
||||
struct z_erofs_pagevec_ctor ctor;
|
||||
unsigned int i, inputsize, outputsize, llen, nr_pages;
|
||||
struct page *pages_onstack[Z_EROFS_VMAP_ONSTACK_PAGES];
|
||||
struct page **pages, **compressed_pages, *page;
|
||||
|
||||
enum z_erofs_page_type page_type;
|
||||
bool overlapped, partial;
|
||||
int err;
|
||||
|
||||
@ -823,42 +863,7 @@ static int z_erofs_decompress_pcluster(struct super_block *sb,
|
||||
for (i = 0; i < nr_pages; ++i)
|
||||
pages[i] = NULL;
|
||||
|
||||
err = 0;
|
||||
z_erofs_pagevec_ctor_init(&ctor, Z_EROFS_NR_INLINE_PAGEVECS,
|
||||
pcl->pagevec, 0);
|
||||
|
||||
for (i = 0; i < pcl->vcnt; ++i) {
|
||||
unsigned int pagenr;
|
||||
|
||||
page = z_erofs_pagevec_dequeue(&ctor, &page_type);
|
||||
|
||||
/* all pages in pagevec ought to be valid */
|
||||
DBG_BUGON(!page);
|
||||
DBG_BUGON(z_erofs_page_is_invalidated(page));
|
||||
|
||||
if (z_erofs_put_shortlivedpage(pagepool, page))
|
||||
continue;
|
||||
|
||||
if (page_type == Z_EROFS_VLE_PAGE_TYPE_HEAD)
|
||||
pagenr = 0;
|
||||
else
|
||||
pagenr = z_erofs_onlinepage_index(page);
|
||||
|
||||
DBG_BUGON(pagenr >= nr_pages);
|
||||
|
||||
/*
|
||||
* currently EROFS doesn't support multiref(dedup),
|
||||
* so here erroring out one multiref page.
|
||||
*/
|
||||
if (pages[pagenr]) {
|
||||
DBG_BUGON(1);
|
||||
SetPageError(pages[pagenr]);
|
||||
z_erofs_onlinepage_endio(pages[pagenr]);
|
||||
err = -EFSCORRUPTED;
|
||||
}
|
||||
pages[pagenr] = page;
|
||||
}
|
||||
z_erofs_pagevec_ctor_exit(&ctor, true);
|
||||
err = z_erofs_parse_out_bvecs(pcl, pages, pagepool);
|
||||
|
||||
overlapped = false;
|
||||
compressed_pages = pcl->compressed_pages;
|
||||
|
Loading…
Reference in New Issue
Block a user