@@ -640,16 +640,15 @@ impl OndiskInodeWrapper {
640
640
Ok ( chunks)
641
641
}
642
642
643
- fn find_target_block ( & self , name : & OsStr ) -> Result < usize > {
643
+ fn find_target_block ( & self , name : & OsStr ) -> Result < Option < usize > > {
644
644
let inode = self . disk_inode ( ) ;
645
645
if inode. size ( ) == 0 {
646
- return Err ( enoent ! ( ) ) ;
646
+ return Ok ( None ) ;
647
647
}
648
648
let blocks_count = div_round_up ( inode. size ( ) , EROFS_BLOCK_SIZE ) ;
649
649
// find target block
650
650
let mut first = 0 ;
651
651
let mut last = ( blocks_count - 1 ) as i64 ;
652
- let mut target_block = 0usize ;
653
652
while first <= last {
654
653
let pivot = first + ( ( last - first) >> 1 ) ;
655
654
let head_entry = self
@@ -664,15 +663,17 @@ impl OndiskInodeWrapper {
664
663
. entry_name ( pivot as usize , entries_count - 1 , entries_count)
665
664
. map_err ( err_invalidate_data) ?;
666
665
if h_name <= name && t_name >= name {
667
- target_block = pivot as usize ;
668
- break ;
666
+ return Ok ( Some ( pivot as usize ) ) ;
669
667
} else if h_name > name {
668
+ if pivot == 0 {
669
+ break ;
670
+ }
670
671
last = pivot - 1 ;
671
672
} else {
672
673
first = pivot + 1 ;
673
674
}
674
675
}
675
- Ok ( target_block )
676
+ Ok ( None )
676
677
}
677
678
}
678
679
@@ -785,7 +786,7 @@ impl RafsInode for OndiskInodeWrapper {
785
786
fn get_child_by_name ( & self , name : & OsStr ) -> Result < Arc < dyn RafsInode > > {
786
787
let mut target: Option < u64 > = None ;
787
788
// find target dirent
788
- if let Ok ( target_block) = self . find_target_block ( name) {
789
+ if let Some ( target_block) = self . find_target_block ( name) ? {
789
790
let head_entry = self
790
791
. get_entry ( target_block, 0 )
791
792
. map_err ( err_invalidate_data) ?;
0 commit comments