@@ -1202,34 +1202,27 @@ static int z_erofs_parse_in_bvecs(struct z_erofs_decompress_backend *be,
12021202 struct z_erofs_bvec * bvec = & pcl -> compressed_bvecs [i ];
12031203 struct page * page = bvec -> page ;
12041204
1205- /* compressed pages ought to be present before decompressing */
1205+ /* compressed data ought to be valid before decompressing */
12061206 if (!page ) {
1207- DBG_BUGON ( 1 ) ;
1207+ err = - EIO ;
12081208 continue ;
12091209 }
12101210 be -> compressed_pages [i ] = page ;
12111211
1212- if (z_erofs_is_inline_pcluster (pcl )) {
1212+ if (z_erofs_is_inline_pcluster (pcl ) ||
1213+ erofs_page_is_managed (EROFS_SB (be -> sb ), page )) {
12131214 if (!PageUptodate (page ))
12141215 err = - EIO ;
12151216 continue ;
12161217 }
12171218
12181219 DBG_BUGON (z_erofs_page_is_invalidated (page ));
1219- if (!z_erofs_is_shortlived_page (page )) {
1220- if (erofs_page_is_managed (EROFS_SB (be -> sb ), page )) {
1221- if (!PageUptodate (page ))
1222- err = - EIO ;
1223- continue ;
1224- }
1225- z_erofs_do_decompressed_bvec (be , bvec );
1226- * overlapped = true;
1227- }
1220+ if (z_erofs_is_shortlived_page (page ))
1221+ continue ;
1222+ z_erofs_do_decompressed_bvec (be , bvec );
1223+ * overlapped = true;
12281224 }
1229-
1230- if (err )
1231- return err ;
1232- return 0 ;
1225+ return err ;
12331226}
12341227
12351228static int z_erofs_decompress_pcluster (struct z_erofs_decompress_backend * be ,
@@ -1238,7 +1231,7 @@ static int z_erofs_decompress_pcluster(struct z_erofs_decompress_backend *be,
12381231 struct erofs_sb_info * const sbi = EROFS_SB (be -> sb );
12391232 struct z_erofs_pcluster * pcl = be -> pcl ;
12401233 unsigned int pclusterpages = z_erofs_pclusterpages (pcl );
1241- const struct z_erofs_decompressor * decompressor =
1234+ const struct z_erofs_decompressor * decomp =
12421235 & erofs_decompressors [pcl -> algorithmformat ];
12431236 int i , err2 ;
12441237 struct page * page ;
@@ -1274,10 +1267,8 @@ static int z_erofs_decompress_pcluster(struct z_erofs_decompress_backend *be,
12741267 err2 = z_erofs_parse_in_bvecs (be , & overlapped );
12751268 if (err2 )
12761269 err = err2 ;
1277- if (err )
1278- goto out ;
1279-
1280- err = decompressor -> decompress (& (struct z_erofs_decompress_req ) {
1270+ if (!err )
1271+ err = decomp -> decompress (& (struct z_erofs_decompress_req ) {
12811272 .sb = be -> sb ,
12821273 .in = be -> compressed_pages ,
12831274 .out = be -> decompressed_pages ,
@@ -1291,7 +1282,6 @@ static int z_erofs_decompress_pcluster(struct z_erofs_decompress_backend *be,
12911282 .fillgaps = pcl -> multibases ,
12921283 }, be -> pagepool );
12931284
1294- out :
12951285 /* must handle all compressed pages before actual file pages */
12961286 if (z_erofs_is_inline_pcluster (pcl )) {
12971287 page = pcl -> compressed_bvecs [0 ].page ;
@@ -1302,7 +1292,7 @@ static int z_erofs_decompress_pcluster(struct z_erofs_decompress_backend *be,
13021292 /* consider shortlived pages added when decompressing */
13031293 page = be -> compressed_pages [i ];
13041294
1305- if (erofs_page_is_managed (sbi , page ))
1295+ if (! page || erofs_page_is_managed (sbi , page ))
13061296 continue ;
13071297 (void )z_erofs_put_shortlivedpage (be -> pagepool , page );
13081298 WRITE_ONCE (pcl -> compressed_bvecs [i ].page , NULL );
0 commit comments