@@ -265,26 +265,22 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m,
265265 if (err )
266266 return err ;
267267
268- switch (m -> type ) {
269- case Z_EROFS_LCLUSTER_TYPE_NONHEAD :
268+ if (m -> type >= Z_EROFS_LCLUSTER_TYPE_MAX ) {
269+ erofs_err (sb , "unknown type %u @ lcn %lu of nid %llu" ,
270+ m -> type , lcn , vi -> nid );
271+ DBG_BUGON (1 );
272+ return - EOPNOTSUPP ;
273+ } else if (m -> type == Z_EROFS_LCLUSTER_TYPE_NONHEAD ) {
270274 lookback_distance = m -> delta [0 ];
271275 if (!lookback_distance )
272- goto err_bogus ;
276+ break ;
273277 continue ;
274- case Z_EROFS_LCLUSTER_TYPE_PLAIN :
275- case Z_EROFS_LCLUSTER_TYPE_HEAD1 :
276- case Z_EROFS_LCLUSTER_TYPE_HEAD2 :
278+ } else {
277279 m -> headtype = m -> type ;
278280 m -> map -> m_la = (lcn << lclusterbits ) | m -> clusterofs ;
279281 return 0 ;
280- default :
281- erofs_err (sb , "unknown type %u @ lcn %lu of nid %llu" ,
282- m -> type , lcn , vi -> nid );
283- DBG_BUGON (1 );
284- return - EOPNOTSUPP ;
285282 }
286283 }
287- err_bogus :
288284 erofs_err (sb , "bogus lookback distance %u @ lcn %lu of nid %llu" ,
289285 lookback_distance , m -> lcn , vi -> nid );
290286 DBG_BUGON (1 );
@@ -329,35 +325,28 @@ static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m,
329325 DBG_BUGON (lcn == initial_lcn &&
330326 m -> type == Z_EROFS_LCLUSTER_TYPE_NONHEAD );
331327
332- switch (m -> type ) {
333- case Z_EROFS_LCLUSTER_TYPE_PLAIN :
334- case Z_EROFS_LCLUSTER_TYPE_HEAD1 :
335- case Z_EROFS_LCLUSTER_TYPE_HEAD2 :
328+ if (m -> type == Z_EROFS_LCLUSTER_TYPE_NONHEAD ) {
329+ if (m -> delta [0 ] != 1 ) {
330+ erofs_err (sb , "bogus CBLKCNT @ lcn %lu of nid %llu" , lcn , vi -> nid );
331+ DBG_BUGON (1 );
332+ return - EFSCORRUPTED ;
333+ }
334+ if (m -> compressedblks )
335+ goto out ;
336+ } else if (m -> type < Z_EROFS_LCLUSTER_TYPE_MAX ) {
336337 /*
337338 * if the 1st NONHEAD lcluster is actually PLAIN or HEAD type
338339 * rather than CBLKCNT, it's a 1 block-sized pcluster.
339340 */
340341 m -> compressedblks = 1 ;
341- break ;
342- case Z_EROFS_LCLUSTER_TYPE_NONHEAD :
343- if (m -> delta [0 ] != 1 )
344- goto err_bonus_cblkcnt ;
345- if (m -> compressedblks )
346- break ;
347- fallthrough ;
348- default :
349- erofs_err (sb , "cannot found CBLKCNT @ lcn %lu of nid %llu" , lcn ,
350- vi -> nid );
351- DBG_BUGON (1 );
352- return - EFSCORRUPTED ;
342+ goto out ;
353343 }
344+ erofs_err (sb , "cannot found CBLKCNT @ lcn %lu of nid %llu" , lcn , vi -> nid );
345+ DBG_BUGON (1 );
346+ return - EFSCORRUPTED ;
354347out :
355348 m -> map -> m_plen = erofs_pos (sb , m -> compressedblks );
356349 return 0 ;
357- err_bonus_cblkcnt :
358- erofs_err (sb , "bogus CBLKCNT @ lcn %lu of nid %llu" , lcn , vi -> nid );
359- DBG_BUGON (1 );
360- return - EFSCORRUPTED ;
361350}
362351
363352static int z_erofs_get_extent_decompressedlen (struct z_erofs_maprecorder * m )
@@ -386,9 +375,7 @@ static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m)
386375 m -> delta [1 ] = 1 ;
387376 DBG_BUGON (1 );
388377 }
389- } else if (m -> type == Z_EROFS_LCLUSTER_TYPE_PLAIN ||
390- m -> type == Z_EROFS_LCLUSTER_TYPE_HEAD1 ||
391- m -> type == Z_EROFS_LCLUSTER_TYPE_HEAD2 ) {
378+ } else if (m -> type < Z_EROFS_LCLUSTER_TYPE_MAX ) {
392379 if (lcn != headlcn )
393380 break ; /* ends at the next HEAD lcluster */
394381 m -> delta [1 ] = 1 ;
@@ -452,8 +439,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
452439 }
453440 /* m.lcn should be >= 1 if endoff < m.clusterofs */
454441 if (!m .lcn ) {
455- erofs_err (inode -> i_sb ,
456- "invalid logical cluster 0 at nid %llu" ,
442+ erofs_err (inode -> i_sb , "invalid logical cluster 0 at nid %llu" ,
457443 vi -> nid );
458444 err = - EFSCORRUPTED ;
459445 goto unmap_out ;
@@ -469,8 +455,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
469455 goto unmap_out ;
470456 break ;
471457 default :
472- erofs_err (inode -> i_sb ,
473- "unknown type %u @ offset %llu of nid %llu" ,
458+ erofs_err (inode -> i_sb , "unknown type %u @ offset %llu of nid %llu" ,
474459 m .type , ofs , vi -> nid );
475460 err = - EOPNOTSUPP ;
476461 goto unmap_out ;
0 commit comments