@@ -20,12 +20,13 @@ pub struct Inode {
2020}
2121
2222impl Inode {
23+ /// We should not acquire efs lock here.
2324 pub fn new (
24- inode_id : u32 ,
25+ block_id : u32 ,
26+ block_offset : usize ,
2527 fs : Arc < Mutex < EasyFileSystem > > ,
2628 block_device : Arc < dyn BlockDevice > ,
2729 ) -> Self {
28- let ( block_id, block_offset) = fs. lock ( ) . get_disk_inode_pos ( inode_id) ;
2930 Self {
3031 block_id : block_id as usize ,
3132 block_offset,
@@ -74,12 +75,14 @@ impl Inode {
7475 }
7576
7677 pub fn find ( & self , name : & str ) -> Option < Arc < Inode > > {
77- let _ = self . fs . lock ( ) ;
78+ let fs = self . fs . lock ( ) ;
7879 self . read_disk_inode ( |disk_inode| {
7980 self . find_inode_id ( name, disk_inode)
8081 . map ( |inode_id| {
82+ let ( block_id, block_offset) = fs. get_disk_inode_pos ( inode_id) ;
8183 Arc :: new ( Self :: new (
82- inode_id,
84+ block_id,
85+ block_offset,
8386 self . fs . clone ( ) ,
8487 self . block_device . clone ( ) ,
8588 ) )
@@ -140,18 +143,20 @@ impl Inode {
140143 & self . block_device ,
141144 ) ;
142145 } ) ;
143- // release efs lock manually because we will acquire it again in Inode::new
144- drop ( fs ) ;
146+
147+ let ( block_id , block_offset ) = fs . get_disk_inode_pos ( new_inode_id ) ;
145148 // return inode
146149 Some ( Arc :: new ( Self :: new (
147- new_inode_id,
150+ block_id,
151+ block_offset,
148152 self . fs . clone ( ) ,
149153 self . block_device . clone ( ) ,
150154 ) ) )
155+ // release efs lock automatically by compiler
151156 }
152157
153158 pub fn ls ( & self ) -> Vec < String > {
154- let _ = self . fs . lock ( ) ;
159+ let _fs = self . fs . lock ( ) ;
155160 self . read_disk_inode ( |disk_inode| {
156161 let file_count = ( disk_inode. size as usize ) / DIRENT_SZ ;
157162 let mut v: Vec < String > = Vec :: new ( ) ;
@@ -172,7 +177,7 @@ impl Inode {
172177 }
173178
174179 pub fn read_at ( & self , offset : usize , buf : & mut [ u8 ] ) -> usize {
175- let _ = self . fs . lock ( ) ;
180+ let _fs = self . fs . lock ( ) ;
176181 self . read_disk_inode ( |disk_inode| {
177182 disk_inode. read_at ( offset, buf, & self . block_device )
178183 } )
0 commit comments