@@ -394,10 +394,10 @@ static int z_erofs_map_blocks_fo(struct inode *inode,
394
394
.map = map ,
395
395
.in_mbox = erofs_inode_in_metabox (inode ),
396
396
};
397
- int err = 0 ;
398
- unsigned int endoff , afmt ;
397
+ unsigned int endoff ;
399
398
unsigned long initial_lcn ;
400
399
unsigned long long ofs , end ;
400
+ int err ;
401
401
402
402
ofs = flags & EROFS_GET_BLOCKS_FINDTAIL ? inode -> i_size - 1 : map -> m_la ;
403
403
if (fragment && !(flags & EROFS_GET_BLOCKS_FINDTAIL ) &&
@@ -482,20 +482,15 @@ static int z_erofs_map_blocks_fo(struct inode *inode,
482
482
err = - EFSCORRUPTED ;
483
483
goto unmap_out ;
484
484
}
485
- afmt = vi -> z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER ?
486
- Z_EROFS_COMPRESSION_INTERLACED :
487
- Z_EROFS_COMPRESSION_SHIFTED ;
485
+ if (vi -> z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER )
486
+ map -> m_algorithmformat = Z_EROFS_COMPRESSION_INTERLACED ;
487
+ else
488
+ map -> m_algorithmformat = Z_EROFS_COMPRESSION_SHIFTED ;
489
+ } else if (m .headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2 ) {
490
+ map -> m_algorithmformat = vi -> z_algorithmtype [1 ];
488
491
} else {
489
- afmt = m .headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2 ?
490
- vi -> z_algorithmtype [1 ] : vi -> z_algorithmtype [0 ];
491
- if (!(EROFS_I_SB (inode )-> available_compr_algs & (1 << afmt ))) {
492
- erofs_err (sb , "inconsistent algorithmtype %u for nid %llu" ,
493
- afmt , vi -> nid );
494
- err = - EFSCORRUPTED ;
495
- goto unmap_out ;
496
- }
492
+ map -> m_algorithmformat = vi -> z_algorithmtype [0 ];
497
493
}
498
- map -> m_algorithmformat = afmt ;
499
494
500
495
if ((flags & EROFS_GET_BLOCKS_FIEMAP ) ||
501
496
((flags & EROFS_GET_BLOCKS_READMORE ) &&
@@ -626,9 +621,9 @@ static int z_erofs_fill_inode(struct inode *inode, struct erofs_map_blocks *map)
626
621
{
627
622
struct erofs_inode * const vi = EROFS_I (inode );
628
623
struct super_block * const sb = inode -> i_sb ;
629
- int err , headnr ;
630
- erofs_off_t pos ;
631
624
struct z_erofs_map_header * h ;
625
+ erofs_off_t pos ;
626
+ int err = 0 ;
632
627
633
628
if (test_bit (EROFS_I_Z_INITED_BIT , & vi -> flags )) {
634
629
/*
@@ -642,7 +637,6 @@ static int z_erofs_fill_inode(struct inode *inode, struct erofs_map_blocks *map)
642
637
if (wait_on_bit_lock (& vi -> flags , EROFS_I_BL_Z_BIT , TASK_KILLABLE ))
643
638
return - ERESTARTSYS ;
644
639
645
- err = 0 ;
646
640
if (test_bit (EROFS_I_Z_INITED_BIT , & vi -> flags ))
647
641
goto out_unlock ;
648
642
@@ -679,15 +673,6 @@ static int z_erofs_fill_inode(struct inode *inode, struct erofs_map_blocks *map)
679
673
else if (vi -> z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER )
680
674
vi -> z_idata_size = le16_to_cpu (h -> h_idata_size );
681
675
682
- headnr = 0 ;
683
- if (vi -> z_algorithmtype [0 ] >= Z_EROFS_COMPRESSION_MAX ||
684
- vi -> z_algorithmtype [++ headnr ] >= Z_EROFS_COMPRESSION_MAX ) {
685
- erofs_err (sb , "unknown HEAD%u format %u for nid %llu, please upgrade kernel" ,
686
- headnr + 1 , vi -> z_algorithmtype [headnr ], vi -> nid );
687
- err = - EOPNOTSUPP ;
688
- goto out_unlock ;
689
- }
690
-
691
676
if (!erofs_sb_has_big_pcluster (EROFS_SB (sb )) &&
692
677
vi -> z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |
693
678
Z_EROFS_ADVISE_BIG_PCLUSTER_2 )) {
@@ -726,6 +711,30 @@ static int z_erofs_fill_inode(struct inode *inode, struct erofs_map_blocks *map)
726
711
return err ;
727
712
}
728
713
714
+ static int z_erofs_map_sanity_check (struct inode * inode ,
715
+ struct erofs_map_blocks * map )
716
+ {
717
+ struct erofs_sb_info * sbi = EROFS_I_SB (inode );
718
+
719
+ if (!(map -> m_flags & EROFS_MAP_ENCODED ))
720
+ return 0 ;
721
+ if (unlikely (map -> m_algorithmformat >= Z_EROFS_COMPRESSION_RUNTIME_MAX )) {
722
+ erofs_err (inode -> i_sb , "unknown algorithm %d @ pos %llu for nid %llu, please upgrade kernel" ,
723
+ map -> m_algorithmformat , map -> m_la , EROFS_I (inode )-> nid );
724
+ return - EOPNOTSUPP ;
725
+ }
726
+ if (unlikely (map -> m_algorithmformat < Z_EROFS_COMPRESSION_MAX &&
727
+ !(sbi -> available_compr_algs & (1 << map -> m_algorithmformat )))) {
728
+ erofs_err (inode -> i_sb , "inconsistent algorithmtype %u for nid %llu" ,
729
+ map -> m_algorithmformat , EROFS_I (inode )-> nid );
730
+ return - EFSCORRUPTED ;
731
+ }
732
+ if (unlikely (map -> m_plen > Z_EROFS_PCLUSTER_MAX_SIZE ||
733
+ map -> m_llen > Z_EROFS_PCLUSTER_MAX_DSIZE ))
734
+ return - EOPNOTSUPP ;
735
+ return 0 ;
736
+ }
737
+
729
738
int z_erofs_map_blocks_iter (struct inode * inode , struct erofs_map_blocks * map ,
730
739
int flags )
731
740
{
@@ -746,10 +755,8 @@ int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
746
755
else
747
756
err = z_erofs_map_blocks_fo (inode , map , flags );
748
757
}
749
- if (!err && (map -> m_flags & EROFS_MAP_ENCODED ) &&
750
- unlikely (map -> m_plen > Z_EROFS_PCLUSTER_MAX_SIZE ||
751
- map -> m_llen > Z_EROFS_PCLUSTER_MAX_DSIZE ))
752
- err = - EOPNOTSUPP ;
758
+ if (!err )
759
+ err = z_erofs_map_sanity_check (inode , map );
753
760
if (err )
754
761
map -> m_llen = 0 ;
755
762
}
0 commit comments