@@ -15,13 +15,13 @@ use crate::devices::virtio::block::virtio::device::DiskProperties;
1515use crate :: devices:: virtio:: block:: virtio:: metrics:: BlockDeviceMetrics ;
1616pub use crate :: devices:: virtio:: generated:: virtio_blk:: {
1717 VIRTIO_BLK_ID_BYTES , VIRTIO_BLK_S_IOERR , VIRTIO_BLK_S_OK , VIRTIO_BLK_S_UNSUPP ,
18- VIRTIO_BLK_T_FLUSH , VIRTIO_BLK_T_GET_ID , VIRTIO_BLK_T_IN , VIRTIO_BLK_T_OUT ,
19- VIRTIO_BLK_T_DISCARD
18+ VIRTIO_BLK_T_DISCARD , VIRTIO_BLK_T_FLUSH , VIRTIO_BLK_T_GET_ID , VIRTIO_BLK_T_IN ,
19+ VIRTIO_BLK_T_OUT ,
2020} ;
2121use crate :: devices:: virtio:: queue:: DescriptorChain ;
2222use crate :: logger:: { IncMetric , error} ;
2323use crate :: rate_limiter:: { RateLimiter , TokenType } ;
24- use crate :: vstate:: memory:: { ByteValued , Bytes , GuestAddress , GuestMemoryMmap , Address } ;
24+ use crate :: vstate:: memory:: { Address , ByteValued , Bytes , GuestAddress , GuestMemoryMmap } ;
2525
2626#[ derive( Debug , derive_more:: From ) ]
2727pub enum IoErr {
@@ -249,6 +249,8 @@ pub struct DiscardSegment {
249249 num_sectors : u32 ,
250250 flags : u32 ,
251251}
252+ // SAFETY: Safe because `DiscardSegment` only contains plain data (POD) with no padding-dependent
253+ // invariants.
252254unsafe impl ByteValued for DiscardSegment { }
253255
254256#[ derive( Debug , PartialEq , Eq ) ]
@@ -279,7 +281,7 @@ impl Request {
279281 data_addr : GuestAddress ( 0 ) ,
280282 data_len : 0 ,
281283 status_addr : GuestAddress ( 0 ) ,
282- discard_segments : None
284+ discard_segments : None ,
283285 } ;
284286
285287 let data_desc;
@@ -341,27 +343,30 @@ impl Request {
341343 }
342344 RequestType :: Discard => {
343345 // Validate data length
344- let segment_size = std:: mem:: size_of :: < DiscardSegment > ( ) as u32 ;
345- if data_desc. len % segment_size != 0 {
346+ let segment_size = std:: mem:: size_of :: < DiscardSegment > ( ) ;
347+ if ( data_desc. len as usize ) % segment_size != 0 {
346348 return Err ( VirtioBlockError :: InvalidDataLength ) ;
347349 }
348350
349351 // Calculate number of segments
350- let num_segments = data_desc. len / segment_size;
352+ let num_segments = ( data_desc. len as usize ) / segment_size;
351353 if num_segments == 0 {
352354 return Err ( VirtioBlockError :: InvalidDiscardRequest ) ;
353355 }
354- let mut segments = Vec :: with_capacity ( num_segments as usize ) ;
356+ let mut segments = Vec :: with_capacity ( num_segments) ;
355357
356358 // Populate DiscardSegments vector
357359 for i in 0 ..num_segments {
358360 let offset = i * segment_size;
359- let segment: DiscardSegment = mem. read_obj ( data_desc. addr . unchecked_add ( offset as u64 ) )
361+ let segment: DiscardSegment = mem
362+ . read_obj ( data_desc. addr . unchecked_add ( offset as u64 ) )
360363 . map_err ( VirtioBlockError :: GuestMemory ) ?;
361364 if segment. flags & !0x1 != 0 {
362365 return Err ( VirtioBlockError :: InvalidDiscardFlags ) ;
363366 }
364- let end_sector = segment. sector . checked_add ( segment. num_sectors as u64 )
367+ let end_sector = segment
368+ . sector
369+ . checked_add ( segment. num_sectors as u64 )
365370 . ok_or ( VirtioBlockError :: SectorOverflow ) ?;
366371 if end_sector > num_disk_sectors {
367372 return Err ( VirtioBlockError :: BeyondDiskSize ) ;
@@ -372,7 +377,8 @@ impl Request {
372377 // Assign to req.discard_segments
373378 req. discard_segments = Some ( segments) ;
374379 req. data_len = data_desc. len ;
375- status_desc = data_desc. next_descriptor ( )
380+ status_desc = data_desc
381+ . next_descriptor ( )
376382 . ok_or ( VirtioBlockError :: DescriptorChainTooShort ) ?;
377383 if !status_desc. is_write_only ( ) {
378384 return Err ( VirtioBlockError :: UnexpectedReadOnlyDescriptor ) ;
0 commit comments