5
5
use std:: {
6
6
self ,
7
7
cmp:: Ordering ,
8
+ convert:: TryInto ,
8
9
io:: { Read , Seek , SeekFrom } ,
10
+ num:: TryFromIntError ,
9
11
} ;
10
12
11
13
use byteorder:: { ByteOrder , LittleEndian } ;
@@ -44,7 +46,7 @@ pub struct MDARegions {
44
46
45
47
impl MDARegions {
46
48
/// Calculate the offset from start of device for an MDARegion.
47
- fn mda_offset ( header_size : Bytes , index : usize , per_region_size : Bytes ) -> u64 {
49
+ fn mda_offset ( header_size : Bytes , index : usize , per_region_size : Bytes ) -> u128 {
48
50
* ( header_size + per_region_size * index)
49
51
}
50
52
@@ -72,11 +74,11 @@ impl MDARegions {
72
74
let region_size = mda_size. region_size ( ) ;
73
75
let region_size_bytes = region_size. sectors ( ) . bytes ( ) ;
74
76
for region in 0 ..mda_size:: NUM_MDA_REGIONS {
75
- f. seek ( SeekFrom :: Start ( MDARegions :: mda_offset (
76
- header_size,
77
- region ,
78
- region_size_bytes ,
79
- ) ) ) ?;
77
+ f. seek ( SeekFrom :: Start (
78
+ MDARegions :: mda_offset ( header_size, region , region_size_bytes )
79
+ . try_into ( )
80
+ . map_err ( | e : TryFromIntError | StratisError :: Error ( e . to_string ( ) ) ) ? ,
81
+ ) ) ?;
80
82
f. write_all ( & hdr_buf) ?;
81
83
}
82
84
@@ -112,11 +114,11 @@ impl MDARegions {
112
114
// been corrupted, return an error.
113
115
let mut load_a_region = |index : usize | -> StratisResult < Option < MDAHeader > > {
114
116
let mut hdr_buf = [ 0u8 ; mda_size:: _MDA_REGION_HDR_SIZE] ;
115
- f. seek ( SeekFrom :: Start ( MDARegions :: mda_offset (
116
- header_size,
117
- index ,
118
- region_size_bytes ,
119
- ) ) ) ?;
117
+ f. seek ( SeekFrom :: Start (
118
+ MDARegions :: mda_offset ( header_size, index , region_size_bytes )
119
+ . try_into ( )
120
+ . map_err ( | e : TryFromIntError | StratisError :: Error ( e . to_string ( ) ) ) ? ,
121
+ ) ) ?;
120
122
f. read_exact ( & mut hdr_buf) ?;
121
123
Ok ( MDAHeader :: from_buf ( & hdr_buf) ?)
122
124
} ;
@@ -159,7 +161,7 @@ impl MDARegions {
159
161
) ) ;
160
162
}
161
163
162
- let used = Bytes ( data. len ( ) as u64 ) ;
164
+ let used = Bytes ( data. len ( ) as u128 ) ;
163
165
let max_available = self . max_data_size ( ) . bytes ( ) ;
164
166
if used > max_available {
165
167
let err_msg = format ! (
@@ -179,11 +181,11 @@ impl MDARegions {
179
181
// Write data to a region specified by index.
180
182
let region_size = self . region_size . sectors ( ) . bytes ( ) ;
181
183
let mut save_region = |index : usize | -> StratisResult < ( ) > {
182
- f. seek ( SeekFrom :: Start ( MDARegions :: mda_offset (
183
- header_size,
184
- index ,
185
- region_size ,
186
- ) ) ) ?;
184
+ f. seek ( SeekFrom :: Start (
185
+ MDARegions :: mda_offset ( header_size, index , region_size )
186
+ . try_into ( )
187
+ . map_err ( | e : TryFromIntError | StratisError :: Error ( e . to_string ( ) ) ) ? ,
188
+ ) ) ?;
187
189
f. write_all ( & hdr_buf) ?;
188
190
f. write_all ( data) ?;
189
191
f. sync_all ( ) ?;
@@ -221,8 +223,10 @@ impl MDARegions {
221
223
// It is an error if the metadata can not be found.
222
224
let mut load_region = |index : usize | -> StratisResult < Vec < u8 > > {
223
225
let offset = MDARegions :: mda_offset ( header_size, index, region_size)
224
- + mda_size:: _MDA_REGION_HDR_SIZE as u64 ;
225
- f. seek ( SeekFrom :: Start ( offset) ) ?;
226
+ + mda_size:: _MDA_REGION_HDR_SIZE as u128 ;
227
+ f. seek ( SeekFrom :: Start ( offset. try_into ( ) . map_err (
228
+ |e : TryFromIntError | StratisError :: Error ( e. to_string ( ) ) ,
229
+ ) ?) ) ?;
226
230
mda. load_region ( f)
227
231
} ;
228
232
@@ -335,7 +339,7 @@ impl MDAHeader {
335
339
assert ! ( secs <= std:: i64 :: MAX as u64 ) ;
336
340
337
341
Some ( MDAHeader {
338
- used : MetaDataSize :: new ( Bytes ( used) ) ,
342
+ used : MetaDataSize :: new ( Bytes ( u128 :: from ( used) ) ) ,
339
343
last_updated : Utc . timestamp ( secs as i64 , LittleEndian :: read_u32 ( & buf[ 24 ..28 ] ) ) ,
340
344
data_crc : LittleEndian :: read_u32 ( & buf[ 4 ..8 ] ) ,
341
345
} )
@@ -485,7 +489,7 @@ mod tests {
485
489
486
490
let header = MDAHeader {
487
491
last_updated: Utc . timestamp( sec, nsec) ,
488
- used: MetaDataSize :: new( Bytes ( data. len( ) as u64 ) ) ,
492
+ used: MetaDataSize :: new( Bytes ( data. len( ) as u128 ) ) ,
489
493
data_crc: crc32:: checksum_castagnoli( data) ,
490
494
} ;
491
495
let buf = header. to_buf( ) ;
@@ -507,7 +511,7 @@ mod tests {
507
511
508
512
let header = MDAHeader {
509
513
last_updated : Utc :: now ( ) ,
510
- used : MetaDataSize :: new ( Bytes ( data. len ( ) as u64 ) ) ,
514
+ used : MetaDataSize :: new ( Bytes ( data. len ( ) as u128 ) ) ,
511
515
data_crc : crc32:: checksum_castagnoli ( & data) ,
512
516
} ;
513
517
let mut buf = header. to_buf ( ) ;
0 commit comments