@@ -10,7 +10,7 @@ use std::{
10
10
mem,
11
11
sync:: Arc ,
12
12
time:: { SystemTime , UNIX_EPOCH } ,
13
- vec,
13
+ vec, f32 :: consts :: E ,
14
14
} ;
15
15
16
16
pub const BLOCK_SIZE : usize = 1024 ; //每个数据块的大小为1kB
@@ -169,9 +169,7 @@ impl BlockGroup {
169
169
}
170
170
171
171
pub fn bg_list ( & self , parent_inode : usize ) -> Vec < DirectoryEntry > {
172
- dbg ! ( self . inode_table. get( parent_inode as usize - 1 ) ) ;
173
172
let mut all_dirs: Vec < DirectoryEntry > = vec ! [ ] ;
174
- dbg ! ( self . inode_table[ parent_inode as usize - 1 ] . direct_pointer) ;
175
173
for index in self . inode_table [ parent_inode as usize - 1 ] . direct_pointer {
176
174
if let Some ( i_block) = index {
177
175
all_dirs. append ( & mut self . data_block [ i_block as usize ] . get_all_dirs_name ( ) ) ;
@@ -188,10 +186,13 @@ impl BlockGroup {
188
186
}
189
187
}
190
188
191
- pub fn bg_mkdir ( & mut self , name : String , parent_inode : usize ) {
189
+ pub fn bg_mkdir ( & mut self , name : String , parent_inode : usize ) -> Option < fuser :: FileAttr > {
192
190
let child_inode = self . add_entry_to_directory ( name, parent_inode) ;
193
- self . add_entry_to_directory ( "." . to_string ( ) , child_inode) ;
194
- self . add_entry_to_directory ( ".." . to_string ( ) , child_inode) ;
191
+ let t = self . add_entry_to_directory ( "." . to_string ( ) , child_inode) ;
192
+ dbg ! ( t) ;
193
+ let m = self . add_entry_to_directory ( ".." . to_string ( ) , child_inode) ;
194
+ dbg ! ( m) ;
195
+ Some ( self . inode_table [ child_inode - 1 ] . get_file_attr ( child_inode as u64 ) )
195
196
}
196
197
197
198
pub fn bg_lookup ( & mut self , name : String , parent_inode : usize ) -> Option < fuser:: FileAttr > {
@@ -205,36 +206,9 @@ impl BlockGroup {
205
206
let data_block = & self . data_block [ index as usize ] ;
206
207
let dirs = data_block. get_all_dirs_name ( ) ;
207
208
for dir in dirs {
208
- if dir. name == name {
209
+ if dbg ! ( dir. name) == name {
209
210
let inode = & self . inode_table [ index as usize - 1 ] ;
210
- return Some ( fuser:: FileAttr {
211
- ino : index as u64 ,
212
- size : inode. i_size as u64 ,
213
- // todo
214
- blocks : 0 ,
215
- atime : SystemTime :: UNIX_EPOCH
216
- + std:: time:: Duration :: from_secs ( inode. i_atime as u64 ) ,
217
- mtime : SystemTime :: UNIX_EPOCH
218
- + std:: time:: Duration :: from_secs ( inode. i_mtime as u64 ) ,
219
- ctime : SystemTime :: UNIX_EPOCH
220
- + std:: time:: Duration :: from_secs ( inode. i_ctime as u64 ) ,
221
- crtime : SystemTime :: UNIX_EPOCH
222
- + std:: time:: Duration :: from_secs ( inode. i_ctime as u64 ) ,
223
- kind : match inode. i_mode & 0xf000 {
224
- 0x8000 => fuser:: FileType :: RegularFile ,
225
- 0x4000 => fuser:: FileType :: Directory ,
226
- _ => fuser:: FileType :: RegularFile ,
227
- } ,
228
- perm : inode. i_mode & 0x0fff ,
229
- nlink : inode. i_links_count as u32 ,
230
- uid : inode. i_uid as u32 ,
231
- gid : inode. i_gid as u32 ,
232
- // 不熟这些 attr 先不实现
233
- rdev : 0 ,
234
- flags : 0 ,
235
- blksize : BLOCK_SIZE as u32 ,
236
- padding : 0 ,
237
- } ) ;
211
+ return Some ( inode. get_file_attr ( index as u64 ) ) ;
238
212
}
239
213
}
240
214
}
@@ -244,30 +218,7 @@ impl BlockGroup {
244
218
245
219
pub fn bg_getattr ( & self , inode_index : usize ) -> fuser:: FileAttr {
246
220
let inode = self . inode_table . get ( inode_index - 1 ) . unwrap ( ) ;
247
- fuser:: FileAttr {
248
- ino : inode_index as u64 ,
249
- size : inode. i_size as u64 ,
250
- // todo
251
- blocks : 0 ,
252
- atime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( inode. i_atime as u64 ) ,
253
- mtime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( inode. i_mtime as u64 ) ,
254
- ctime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( inode. i_ctime as u64 ) ,
255
- crtime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( inode. i_ctime as u64 ) ,
256
- kind : match inode. i_mode & 0xf000 {
257
- 0x8000 => fuser:: FileType :: RegularFile ,
258
- 0x4000 => fuser:: FileType :: Directory ,
259
- _ => fuser:: FileType :: RegularFile ,
260
- } ,
261
- perm : inode. i_mode & 0x0fff ,
262
- nlink : inode. i_links_count as u32 ,
263
- uid : inode. i_uid as u32 ,
264
- gid : inode. i_gid as u32 ,
265
- // 不熟这些 attr 先不实现
266
- rdev : 0 ,
267
- flags : 0 ,
268
- blksize : BLOCK_SIZE as u32 ,
269
- padding : 0 ,
270
- }
221
+ inode. get_file_attr ( inode_index as u64 )
271
222
}
272
223
273
224
pub fn bg_create ( & mut self , name : String , parent_inode : usize ) -> Option < fuser:: FileAttr > {
@@ -279,8 +230,7 @@ impl BlockGroup {
279
230
let inode_index = self . get_inode ( ) ; //分配一个inode
280
231
let mut dir = DirectoryEntry :: new ( name, FileType :: Directory , inode_index as u32 , 0 ) ;
281
232
let ( dir_data, dir_size) = dir. to_bytes ( ) ;
282
-
283
- for block_index in self
233
+ for & block_index in self
284
234
. inode_table
285
235
. get ( parent_inode - 1 )
286
236
. unwrap ( )
@@ -289,7 +239,7 @@ impl BlockGroup {
289
239
. take_while ( |x : & & Option < u32 > | x. is_some ( ) )
290
240
{
291
241
if let Some ( index) = block_index {
292
- let data_block = & mut self . data_block [ index. clone ( ) as usize ] ;
242
+ let data_block = & mut self . data_block [ index as usize ] ;
293
243
if data_block. count_free_bytes ( ) >= dir_size as u16 {
294
244
data_block. write (
295
245
& dir_data,
@@ -420,6 +370,33 @@ impl Inode {
420
370
}
421
371
}
422
372
373
+ pub fn get_file_attr ( & self , inode_index : u64 ) -> fuser:: FileAttr {
374
+ fuser:: FileAttr {
375
+ ino : inode_index as u64 ,
376
+ size : self . i_size as u64 ,
377
+ // todo
378
+ blocks : 0 ,
379
+ atime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( self . i_atime as u64 ) ,
380
+ mtime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( self . i_mtime as u64 ) ,
381
+ ctime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( self . i_ctime as u64 ) ,
382
+ crtime : SystemTime :: UNIX_EPOCH + std:: time:: Duration :: from_secs ( self . i_ctime as u64 ) ,
383
+ kind : match self . i_mode & 0xf000 {
384
+ 0x8000 => fuser:: FileType :: RegularFile ,
385
+ 0x4000 => fuser:: FileType :: Directory ,
386
+ _ => fuser:: FileType :: RegularFile ,
387
+ } ,
388
+ perm : self . i_mode & 0x0fff ,
389
+ nlink : self . i_links_count as u32 ,
390
+ uid : self . i_uid as u32 ,
391
+ gid : self . i_gid as u32 ,
392
+ // 不熟这些 attr 先不实现
393
+ rdev : 0 ,
394
+ flags : 0 ,
395
+ blksize : BLOCK_SIZE as u32 ,
396
+ padding : 0 ,
397
+ }
398
+ }
399
+
423
400
pub fn inode_update_size ( & mut self , size : u32 ) {
424
401
self . i_size += size + self . i_size ;
425
402
self . i_ctime = get_current_time ( ) ;
@@ -466,14 +443,16 @@ impl DataBlock {
466
443
let mut offset = 0 ;
467
444
let mut dir_vec: Vec < DirectoryEntry > = vec ! [ ] ;
468
445
while offset + 6 <= BLOCK_SIZE {
469
- dbg ! ( & self . data[ ..50 ] ) ;
470
- let file_size: u16 =
471
- bincode:: deserialize ( dbg ! ( & self . data[ 4 + offset..6 + offset] ) ) . unwrap ( ) ; //从第四个字节开始解析2个字节为文件的大小
446
+ // dbg!(&self.data[..50]);
447
+ let file_size= self . data [ offset +4 ] ;
448
+ //dbg!(file_size);
449
+ //bincode::deserialize(!(&self.data[4 + offset..6 + offset])).unwrap(); //从第四个字节开始解析2个字节为文件的大小
472
450
if file_size == 0 {
473
451
break ;
474
452
}
475
453
let dir: DirectoryEntry =
476
454
bincode:: deserialize ( & self . data [ offset..offset + file_size as usize ] ) . unwrap ( ) ;
455
+ //dbg!(&dir);
477
456
dir_vec. push ( dir) ;
478
457
offset += file_size as usize ;
479
458
}
0 commit comments