11use super :: { Device , DeviceId , Queue } ;
22use crate :: block:: Block as BlockDevice ;
33use crate :: { IrqPin , RuntimeContext } ;
4- use parking_lot:: Mutex ;
54use std:: sync:: Arc ;
65
76#[ allow( dead_code) ]
@@ -28,7 +27,7 @@ pub struct Block {
2827}
2928
3029struct Inner {
31- file : Mutex < Box < dyn BlockDevice + Send > > ,
30+ file : Box < dyn BlockDevice + Send + Sync > ,
3231 irq : Box < dyn IrqPin > ,
3332}
3433
@@ -37,13 +36,13 @@ impl Block {
3736 pub fn new (
3837 ctx : Arc < dyn RuntimeContext > ,
3938 irq : Box < dyn IrqPin > ,
40- file : Box < dyn BlockDevice + Send > ,
39+ file : Box < dyn BlockDevice + Send + Sync > ,
4140 ) -> Block {
4241 let len = file. len ( ) ;
4342 if len % 512 != 0 {
4443 panic ! ( "Size of block device must be multiple of 512 bytes" ) ;
4544 }
46- let inner = Arc :: new ( Inner { file : Mutex :: new ( file ) , irq } ) ;
45+ let inner = Arc :: new ( Inner { file, irq } ) ;
4746 Block { status : 0 , config : ( len / 512 ) . to_le_bytes ( ) , ctx, inner }
4847 }
4948
@@ -64,11 +63,8 @@ impl Block {
6463 let mut io_buffer = Vec :: with_capacity ( writer. len ( ) ) ;
6564 unsafe { io_buffer. set_len ( io_buffer. capacity ( ) - 1 ) } ;
6665
67- {
68- let mut file = inner. file . lock ( ) ;
69- ( * file) . read_exact_at ( & mut io_buffer, header. sector * 512 ) . unwrap ( ) ;
70- trace ! ( target: "VirtioBlk" , "read {} bytes from sector {:x}" , io_buffer. len( ) , header. sector) ;
71- }
66+ inner. file . read_exact_at ( & mut io_buffer, header. sector * 512 ) . unwrap ( ) ;
67+ trace ! ( target: "VirtioBlk" , "read {} bytes from sector {:x}" , io_buffer. len( ) , header. sector) ;
7268
7369 io_buffer. push ( 0 ) ;
7470 writer. write_all ( & io_buffer) . await . unwrap ( ) ;
@@ -78,13 +74,10 @@ impl Block {
7874 unsafe { io_buffer. set_len ( io_buffer. capacity ( ) ) } ;
7975 reader. read_exact ( & mut io_buffer) . await . unwrap ( ) ;
8076
81- {
82- let mut file = inner. file . lock ( ) ;
83- file. write_all_at ( & io_buffer, header. sector * 512 ) . unwrap ( ) ;
84- // We must make sure the data has been flushed into the disk before returning
85- file. flush ( ) . unwrap ( ) ;
86- trace ! ( target: "VirtioBlk" , "write {} bytes from sector {:x}" , io_buffer. len( ) , header. sector) ;
87- }
77+ inner. file . write_all_at ( & io_buffer, header. sector * 512 ) . unwrap ( ) ;
78+ // We must make sure the data has been flushed into the disk before returning
79+ inner. file . flush ( ) . unwrap ( ) ;
80+ trace ! ( target: "VirtioBlk" , "write {} bytes from sector {:x}" , io_buffer. len( ) , header. sector) ;
8881
8982 writer. write_all ( & [ 0 ] ) . await . unwrap ( ) ;
9083 }
0 commit comments