@@ -1006,7 +1006,7 @@ impl Partition for UsTar {
1006
1006
1007
1007
fn read ( & mut self , oft : & OpenFileTable , size : usize ) -> Result < Vec < u8 > , IoError > {
1008
1008
let mut path_name = String :: from ( "root" ) ;
1009
- if !oft. get_path ( ) . is_empty ( ) {
1009
+ if !oft. get_path ( ) . is_empty ( ) {
1010
1010
path_name. push ( '/' ) ;
1011
1011
}
1012
1012
path_name. push_str ( & oft. get_path ( ) . to ( ) ) ;
@@ -1184,85 +1184,82 @@ impl Partition for UsTar {
1184
1184
self . lba_table_global . write_to_disk ( self . port ) ;
1185
1185
( new_size - true_offset) as isize
1186
1186
} else if new_size <= 512 * SHORT_MODE_LIMIT {
1187
- debug ! ( "File longer but still short" ) ;
1188
-
1189
- let new_addresses = unsafe {
1190
- self . get_addresses (
1191
- new_blocks_number - file. header . blocks_number ,
1192
- )
1193
- } ;
1194
- for i in file. header . blocks_number ..new_blocks_number {
1195
- file. header . blocks [ i as usize ] =
1196
- new_addresses[ ( i - file. header . blocks_number + 1 ) as usize ] ;
1197
- }
1198
- if true_offset % 512 != 0 {
1199
- let b: [ u16 ; 256 ] = self
1200
- . read_from_disk :: < FileBlock > (
1201
- ( file. header . blocks [ block_offset as usize ] . lba * 512
1202
- + file. header . blocks [ block_offset as usize ] . block )
1203
- as u32 ,
1204
- )
1205
- . to_u16_array ( ) ;
1206
- for i in 0 ..( true_offset % 512 ) / 2 {
1207
- blocks_to_write[ 0 ] [ i as usize ] = b[ i as usize ] ;
1208
- }
1209
- if true_offset % 2 == 1 {
1210
- blocks_to_write[ 0 ] [ ( ( true_offset % 512 ) / 2 ) as usize ] |=
1211
- b[ ( ( true_offset % 512 ) / 2 ) as usize ] & 0xFF00 ;
1212
- }
1213
- }
1214
- for i in 0 ..number_blocks_to_write {
1215
- let file_block = FileBlock {
1216
- data : blocks_to_write[ i as usize ] ,
1217
- } ;
1218
- self . write_to_disk (
1219
- file_block,
1220
- ( file. header . blocks [ i + block_offset as usize ] . lba * 512
1221
- + file. header . blocks [ i + block_offset as usize ] . block )
1187
+ debug ! ( "File longer but still short" ) ;
1188
+
1189
+ let new_addresses = unsafe {
1190
+ self . get_addresses ( new_blocks_number - file. header . blocks_number )
1191
+ } ;
1192
+ for i in file. header . blocks_number ..new_blocks_number {
1193
+ file. header . blocks [ i as usize ] =
1194
+ new_addresses[ ( i - file. header . blocks_number + 1 ) as usize ] ;
1195
+ }
1196
+ if true_offset % 512 != 0 {
1197
+ let b: [ u16 ; 256 ] = self
1198
+ . read_from_disk :: < FileBlock > (
1199
+ ( file. header . blocks [ block_offset as usize ] . lba * 512
1200
+ + file. header . blocks [ block_offset as usize ] . block )
1222
1201
as u32 ,
1223
- ) ;
1202
+ )
1203
+ . to_u16_array ( ) ;
1204
+ for i in 0 ..( true_offset % 512 ) / 2 {
1205
+ blocks_to_write[ 0 ] [ i as usize ] = b[ i as usize ] ;
1224
1206
}
1225
- file. header . blocks_number = new_blocks_number;
1226
- file. header . length = new_size;
1227
- self . write_to_disk (
1228
- file. header ,
1229
- ( header_address. lba * 512 + header_address. block ) as u32 ,
1230
- ) ;
1231
- self . lba_table_global . write_to_disk ( self . port ) ;
1232
- ( new_size - true_offset) as isize
1233
- } else {
1234
- debug ! ( "File longer and becomes Long" ) ;
1235
- let old_header_addr_res = self . del_file ( oft) ;
1236
- let old_header_addr = match old_header_addr_res {
1237
- Err ( _) => return -1 ,
1238
- Ok ( x) => x,
1239
- } ;
1240
- let effective_data =
1241
- [ & file. data [ ..true_offset as usize ] , buffer] . concat ( ) ;
1242
- debug ! ( "New data: {:?}" , effective_data) ;
1243
- let exit_code = self . write ( oft, & effective_data) ;
1244
- if exit_code < 0 {
1245
- return exit_code;
1207
+ if true_offset % 2 == 1 {
1208
+ blocks_to_write[ 0 ] [ ( ( true_offset % 512 ) / 2 ) as usize ] |=
1209
+ b[ ( ( true_offset % 512 ) / 2 ) as usize ] & 0xFF00 ;
1246
1210
}
1247
- let new_header_addr_res = self . find_address ( & path_name ) ;
1248
- let new_header_addr = match new_header_addr_res {
1249
- Err ( _ ) => return - 1 ,
1250
- Ok ( x ) => x ,
1211
+ }
1212
+ for i in 0 ..number_blocks_to_write {
1213
+ let file_block = FileBlock {
1214
+ data : blocks_to_write [ i as usize ] ,
1251
1215
} ;
1252
- let new_header: Header = self . read_from_disk (
1253
- ( new_header_addr. lba * 512 + new_header_addr. block ) as u32 ,
1254
- ) ;
1255
1216
self . write_to_disk (
1256
- new_header,
1257
- ( old_header_addr. lba * 512 + old_header_addr. block ) as u32 ,
1258
- ) ;
1259
- self . lba_table_global . mark_available (
1260
- new_header_addr. lba as u32 ,
1261
- new_header_addr. block as u32 ,
1217
+ file_block,
1218
+ ( file. header . blocks [ i + block_offset as usize ] . lba * 512
1219
+ + file. header . blocks [ i + block_offset as usize ] . block )
1220
+ as u32 ,
1262
1221
) ;
1263
- exit_code
1264
1222
}
1265
-
1223
+ file. header . blocks_number = new_blocks_number;
1224
+ file. header . length = new_size;
1225
+ self . write_to_disk (
1226
+ file. header ,
1227
+ ( header_address. lba * 512 + header_address. block ) as u32 ,
1228
+ ) ;
1229
+ self . lba_table_global . write_to_disk ( self . port ) ;
1230
+ ( new_size - true_offset) as isize
1231
+ } else {
1232
+ debug ! ( "File longer and becomes Long" ) ;
1233
+ let old_header_addr_res = self . del_file ( oft) ;
1234
+ let old_header_addr = match old_header_addr_res {
1235
+ Err ( _) => return -1 ,
1236
+ Ok ( x) => x,
1237
+ } ;
1238
+ let effective_data =
1239
+ [ & file. data [ ..true_offset as usize ] , buffer] . concat ( ) ;
1240
+ debug ! ( "New data: {:?}" , effective_data) ;
1241
+ let exit_code = self . write ( oft, & effective_data) ;
1242
+ if exit_code < 0 {
1243
+ return exit_code;
1244
+ }
1245
+ let new_header_addr_res = self . find_address ( & path_name) ;
1246
+ let new_header_addr = match new_header_addr_res {
1247
+ Err ( _) => return -1 ,
1248
+ Ok ( x) => x,
1249
+ } ;
1250
+ let new_header: Header = self . read_from_disk (
1251
+ ( new_header_addr. lba * 512 + new_header_addr. block ) as u32 ,
1252
+ ) ;
1253
+ self . write_to_disk (
1254
+ new_header,
1255
+ ( old_header_addr. lba * 512 + old_header_addr. block ) as u32 ,
1256
+ ) ;
1257
+ self . lba_table_global . mark_available (
1258
+ new_header_addr. lba as u32 ,
1259
+ new_header_addr. block as u32 ,
1260
+ ) ;
1261
+ exit_code
1262
+ }
1266
1263
}
1267
1264
FileMode :: Long => {
1268
1265
debug ! ( "File was Long" ) ;
0 commit comments