From 729c612cc8769b9f7fcc4705e8fb66d15375b20e Mon Sep 17 00:00:00 2001 From: John Baublitz Date: Thu, 31 Oct 2019 13:40:44 -0400 Subject: [PATCH 1/4] Changes corresponding to u128 changes to Bytes --- Cargo.lock | 7 +-- Cargo.toml | 2 +- .../blockdev/fetch_properties_2_0/methods.rs | 30 ++++----- src/dbus_api/pool/shared.rs | 7 +-- src/engine/shared.rs | 2 +- src/engine/sim_engine/blockdev.rs | 2 +- .../strat_engine/backstore/blockdevmgr.rs | 2 +- src/engine/strat_engine/backstore/devices.rs | 2 +- src/engine/strat_engine/device.rs | 2 +- src/engine/strat_engine/metadata/bda.rs | 8 +-- src/engine/strat_engine/metadata/mda.rs | 62 +++++++++++-------- src/engine/strat_engine/metadata/sizes.rs | 2 +- .../strat_engine/metadata/static_header.rs | 4 +- src/engine/strat_engine/pool.rs | 12 ++-- src/engine/strat_engine/tests/loopbacked.rs | 8 ++- src/engine/strat_engine/tests/real.rs | 16 ++++- .../strat_engine/thinpool/filesystem.rs | 4 +- src/engine/strat_engine/thinpool/thinpool.rs | 10 +-- src/engine/strat_engine/writing.rs | 4 +- 19 files changed, 103 insertions(+), 83 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd9b37f84d..01e6a0d456 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -244,14 +244,13 @@ dependencies = [ [[package]] name = "devicemapper" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c41333e34258e919c0811c25c9340a157667fc53d63c2b6047e13a6bf27de37" +version = "0.28.0" +source = "git+https://github.com/jbaublitz/devicemapper-rs?branch=u128-bytes#aca885e6cf578c9c5568ea4d61568c75b7a4ff09" dependencies = [ "bitflags", "error-chain", "libc", - "nix 0.18.0", + "nix 0.14.0", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index c16ce1d876..629ccb64bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ required-features = ["extras"] [dependencies] clap = "2" nix = "0.18" -devicemapper = "0.28" +devicemapper = { git = "https://github.com/jbaublitz/devicemapper-rs", branch = "u128-bytes" } crc = "1" byteorder = "1" chrono = "0.4" diff --git a/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs b/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs index 9e0438c0c7..eadc35abf4 100644 --- a/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs +++ b/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs @@ -26,24 +26,20 @@ fn get_properties_shared( let return_message = message.method_return(); - let return_value: HashMap>)> = - properties - .unique() - .filter_map(|prop| match prop.as_str() { - consts::BLOCKDEV_TOTAL_SIZE_PROP => Some(( - prop, - result_to_tuple(blockdev_operation( - m.tree, - object_path.get_name(), - |_, bd| { - Ok((u128::from(*bd.size()) * devicemapper::SECTOR_SIZE as u128) - .to_string()) - }, - )), + let return_value: HashMap>)> = properties + .unique() + .filter_map(|prop| match prop.as_str() { + consts::BLOCKDEV_TOTAL_SIZE_PROP => Some(( + prop, + result_to_tuple(blockdev_operation( + m.tree, + object_path.get_name(), + |_, bd| Ok((*bd.size()).to_string()), )), - _ => None, - }) - .collect(); + )), + _ => None, + }) + .collect(); Ok(vec![return_message.append1(return_value)]) } diff --git a/src/dbus_api/pool/shared.rs b/src/dbus_api/pool/shared.rs index bcffb8130b..7e8a9cc288 100644 --- a/src/dbus_api/pool/shared.rs +++ b/src/dbus_api/pool/shared.rs @@ -76,10 +76,7 @@ pub fn get_pool_has_cache(m: &MethodInfo, TData>) -> Result, TData>) -> Result { pool_operation(m.tree, m.path.get_name(), |(_, _, pool)| { - Ok( - (u128::from(*pool.total_physical_size()) * devicemapper::SECTOR_SIZE as u128) - .to_string(), - ) + Ok((*pool.total_physical_size().bytes()).to_string()) }) } @@ -87,7 +84,7 @@ pub fn get_pool_total_used(m: &MethodInfo, TData>) -> Result StratisResult { ErrorEnum::Invalid, format!( "Provided key exceeded maximum allow length of {}", - Bytes(MAX_STRATIS_PASS_SIZE as u64) + Bytes(MAX_STRATIS_PASS_SIZE as u128) ), )); } diff --git a/src/engine/sim_engine/blockdev.rs b/src/engine/sim_engine/blockdev.rs index a46c482e03..3acaca3a89 100644 --- a/src/engine/sim_engine/blockdev.rs +++ b/src/engine/sim_engine/blockdev.rs @@ -51,7 +51,7 @@ impl BlockDev for SimDev { } fn size(&self) -> Sectors { - Bytes(IEC::Gi).sectors() + Bytes(u128::from(IEC::Gi)).sectors() } fn set_dbus_path(&mut self, path: MaybeDbusPath) { diff --git a/src/engine/strat_engine/backstore/blockdevmgr.rs b/src/engine/strat_engine/backstore/blockdevmgr.rs index 1dffc45a48..534e59bb32 100644 --- a/src/engine/strat_engine/backstore/blockdevmgr.rs +++ b/src/engine/strat_engine/backstore/blockdevmgr.rs @@ -345,7 +345,7 @@ impl BlockDevMgr { current_time }; - let data_size = Bytes(metadata.len() as u64); + let data_size = Bytes(metadata.len() as u128); let candidates = self .block_devs .iter_mut() diff --git a/src/engine/strat_engine/backstore/devices.rs b/src/engine/strat_engine/backstore/devices.rs index 8308ea99d6..cf2444024e 100644 --- a/src/engine/strat_engine/backstore/devices.rs +++ b/src/engine/strat_engine/backstore/devices.rs @@ -38,7 +38,7 @@ use crate::{ stratis::{ErrorEnum, StratisError, StratisResult}, }; -const MIN_DEV_SIZE: Bytes = Bytes(IEC::Gi); +const MIN_DEV_SIZE: Bytes = Bytes(IEC::Gi as u128); // Get information that can be obtained from udev for the block device // identified by devnode. Return an error if there was an error finding the diff --git a/src/engine/strat_engine/device.rs b/src/engine/strat_engine/device.rs index c064129243..0bc275c217 100644 --- a/src/engine/strat_engine/device.rs +++ b/src/engine/strat_engine/device.rs @@ -28,6 +28,6 @@ pub fn blkdev_size(file: &File) -> StratisResult { match unsafe { blkgetsize64(file.as_raw_fd(), &mut val) } { Err(x) => Err(StratisError::Nix(x)), - Ok(_) => Ok(Bytes(val)), + Ok(_) => Ok(Bytes(u128::from(val))), } } diff --git a/src/engine/strat_engine/metadata/bda.rs b/src/engine/strat_engine/metadata/bda.rs index d8378e3ac3..21eb38e9fc 100644 --- a/src/engine/strat_engine/metadata/bda.rs +++ b/src/engine/strat_engine/metadata/bda.rs @@ -155,7 +155,7 @@ mod tests { /// Initialize a BDA. /// Verify that the last update time is None. fn empty_bda(ref sh in static_header_strategy()) { - let buf_size = convert_test!(*sh.mda_size.bda_size().sectors().bytes(), u64, usize); + let buf_size = convert_test!(*sh.mda_size.bda_size().sectors().bytes(), u128, usize); let mut buf = Cursor::new(vec![0; buf_size]); let bda = BDA::initialize( &mut buf, @@ -181,7 +181,7 @@ mod tests { 0; convert_test!( *sh.blkdev_size.sectors().bytes(), - u64, + u128, usize ) ]); @@ -202,7 +202,7 @@ mod tests { 0; convert_test!( *sh.blkdev_size.sectors().bytes(), - u64, + u128, usize ) ]); @@ -234,7 +234,7 @@ mod tests { ref state in vec(num::u8::ANY, 1..100), ref next_state in vec(num::u8::ANY, 1..100) ) { - let buf_size = convert_test!(*sh.mda_size.bda_size().sectors().bytes(), u64, usize); + let buf_size = convert_test!(*sh.mda_size.bda_size().sectors().bytes(), u128, usize); let mut buf = Cursor::new(vec![0; buf_size]); let mut bda = BDA::initialize( &mut buf, diff --git a/src/engine/strat_engine/metadata/mda.rs b/src/engine/strat_engine/metadata/mda.rs index 4aee1f3981..bf3df15b99 100644 --- a/src/engine/strat_engine/metadata/mda.rs +++ b/src/engine/strat_engine/metadata/mda.rs @@ -4,7 +4,9 @@ use std::{ cmp::Ordering, + convert::TryInto, io::{Read, Seek, SeekFrom}, + num::TryFromIntError, }; use byteorder::{ByteOrder, LittleEndian}; @@ -43,7 +45,7 @@ pub struct MDARegions { impl MDARegions { /// Calculate the offset from start of device for an MDARegion. - fn mda_offset(header_size: Bytes, index: usize, per_region_size: Bytes) -> u64 { + fn mda_offset(header_size: Bytes, index: usize, per_region_size: Bytes) -> u128 { *(header_size + per_region_size * index) } @@ -71,11 +73,11 @@ impl MDARegions { let region_size = mda_size.region_size(); let region_size_bytes = region_size.sectors().bytes(); for region in 0..mda_size::NUM_MDA_REGIONS { - f.seek(SeekFrom::Start(MDARegions::mda_offset( - header_size, - region, - region_size_bytes, - )))?; + f.seek(SeekFrom::Start( + MDARegions::mda_offset(header_size, region, region_size_bytes) + .try_into() + .map_err(|e: TryFromIntError| StratisError::Error(e.to_string()))?, + ))?; f.write_all(&hdr_buf)?; } @@ -111,11 +113,11 @@ impl MDARegions { // been corrupted, return an error. let mut load_a_region = |index: usize| -> StratisResult> { let mut hdr_buf = [0u8; mda_size::_MDA_REGION_HDR_SIZE]; - f.seek(SeekFrom::Start(MDARegions::mda_offset( - header_size, - index, - region_size_bytes, - )))?; + f.seek(SeekFrom::Start( + MDARegions::mda_offset(header_size, index, region_size_bytes) + .try_into() + .map_err(|e: TryFromIntError| StratisError::Error(e.to_string()))?, + ))?; f.read_exact(&mut hdr_buf)?; Ok(MDAHeader::from_buf(&hdr_buf)?) }; @@ -158,7 +160,7 @@ impl MDARegions { )); } - let used = Bytes(data.len() as u64); + let used = Bytes(data.len() as u128); let max_available = self.max_data_size().bytes(); if used > max_available { let err_msg = format!( @@ -178,11 +180,11 @@ impl MDARegions { // Write data to a region specified by index. let region_size = self.region_size.sectors().bytes(); let mut save_region = |index: usize| -> StratisResult<()> { - f.seek(SeekFrom::Start(MDARegions::mda_offset( - header_size, - index, - region_size, - )))?; + f.seek(SeekFrom::Start( + MDARegions::mda_offset(header_size, index, region_size) + .try_into() + .map_err(|e: TryFromIntError| StratisError::Error(e.to_string()))?, + ))?; f.write_all(&hdr_buf)?; f.write_all(data)?; f.sync_all()?; @@ -220,8 +222,10 @@ impl MDARegions { // It is an error if the metadata can not be found. let mut load_region = |index: usize| -> StratisResult> { let offset = MDARegions::mda_offset(header_size, index, region_size) - + mda_size::_MDA_REGION_HDR_SIZE as u64; - f.seek(SeekFrom::Start(offset))?; + + mda_size::_MDA_REGION_HDR_SIZE as u128; + f.seek(SeekFrom::Start(offset.try_into().map_err( + |e: TryFromIntError| StratisError::Error(e.to_string()), + )?))?; mda.load_region(f) }; @@ -334,7 +338,7 @@ impl MDAHeader { assert!(secs <= std::i64::MAX as u64); Some(MDAHeader { - used: MetaDataSize::new(Bytes(used)), + used: MetaDataSize::new(Bytes(u128::from(used))), last_updated: Utc.timestamp(secs as i64, LittleEndian::read_u32(&buf[24..28])), data_crc: LittleEndian::read_u32(&buf[4..8]), }) @@ -382,7 +386,10 @@ impl MDAHeader { let mut buf = [0u8; mda_size::_MDA_REGION_HDR_SIZE]; LittleEndian::write_u32(&mut buf[4..8], self.data_crc); - LittleEndian::write_u64(&mut buf[8..16], *self.used.bytes() as u64); + LittleEndian::write_u64( + &mut buf[8..16], + convert_int!(*self.used.bytes(), u128, u64).expect("Size must fit into metadata"), + ); LittleEndian::write_u64(&mut buf[16..24], self.last_updated.timestamp() as u64); LittleEndian::write_u32(&mut buf[24..28], self.last_updated.timestamp_subsec_nanos()); buf[28] = STRAT_REGION_HDR_VERSION; @@ -402,7 +409,7 @@ impl MDAHeader { where F: Read, { - let mut data_buf = vec![0u8; convert_int!(*self.used.bytes(), u64, usize)?]; + let mut data_buf = vec![0u8; convert_int!(*self.used.bytes(), u128, usize)?]; f.read_exact(&mut data_buf)?; @@ -448,8 +455,11 @@ mod tests { /// initialized. fn test_reading_mda_regions() { let offset = Bytes(100); - let buf_length = - convert_test!(*(offset + MDASize::default().sectors().bytes()), u64, usize); + let buf_length = convert_test!( + *(offset + MDASize::default().sectors().bytes()), + u128, + usize + ); let mut buf = Cursor::new(vec![0; buf_length]); assert_matches!( MDARegions::load(offset, MDASize::default(), &mut buf), @@ -476,7 +486,7 @@ mod tests { let header = MDAHeader { last_updated: Utc.timestamp(sec, nsec), - used: MetaDataSize::new(Bytes(data.len() as u64)), + used: MetaDataSize::new(Bytes(data.len() as u128)), data_crc: crc32::checksum_castagnoli(data), }; let buf = header.to_buf(); @@ -498,7 +508,7 @@ mod tests { let header = MDAHeader { last_updated: Utc::now(), - used: MetaDataSize::new(Bytes(data.len() as u64)), + used: MetaDataSize::new(Bytes(data.len() as u128)), data_crc: crc32::checksum_castagnoli(&data), }; let mut buf = header.to_buf(); diff --git a/src/engine/strat_engine/metadata/sizes.rs b/src/engine/strat_engine/metadata/sizes.rs index 754f2db35b..24652cd450 100644 --- a/src/engine/strat_engine/metadata/sizes.rs +++ b/src/engine/strat_engine/metadata/sizes.rs @@ -48,7 +48,7 @@ pub mod mda_size { use devicemapper::{Bytes, Sectors}; pub const _MDA_REGION_HDR_SIZE: usize = 32; - const MDA_REGION_HDR_SIZE: Bytes = Bytes(_MDA_REGION_HDR_SIZE as u64); + const MDA_REGION_HDR_SIZE: Bytes = Bytes(_MDA_REGION_HDR_SIZE as u128); // The minimum size allocated for variable length metadata pub const MIN_MDA_DATA_REGION_SIZE: Bytes = Bytes(260_064); diff --git a/src/engine/strat_engine/metadata/static_header.rs b/src/engine/strat_engine/metadata/static_header.rs index 9d05f6299c..24b2a8a61f 100644 --- a/src/engine/strat_engine/metadata/static_header.rs +++ b/src/engine/strat_engine/metadata/static_header.rs @@ -503,11 +503,11 @@ pub mod tests { let pool_uuid = Uuid::new_v4(); let dev_uuid = Uuid::new_v4(); let mda_size = MDADataSize::new( - MDADataSize::default().bytes() + Bytes(u64::from(mda_size_factor * 4)), + MDADataSize::default().bytes() + Bytes(u128::from(mda_size_factor * 4)), ) .region_size() .mda_size(); - let blkdev_size = (Bytes(IEC::Mi) + Sectors(blkdev_size).bytes()).sectors(); + let blkdev_size = (Bytes(u128::from(IEC::Mi)) + Sectors(blkdev_size).bytes()).sectors(); StaticHeader::new( StratisIdentifiers::new(pool_uuid, dev_uuid), mda_size, diff --git a/src/engine/strat_engine/pool.rs b/src/engine/strat_engine/pool.rs index 9a4d75fd42..0848deb9da 100644 --- a/src/engine/strat_engine/pool.rs +++ b/src/engine/strat_engine/pool.rs @@ -789,7 +789,7 @@ mod tests { let buf = &[1u8; SECTOR_SIZE]; let mut amount_written = Sectors(0); - let buffer_length = Bytes(buffer_length).sectors(); + let buffer_length = Bytes(u128::from(buffer_length)).sectors(); while match pool.thin_pool.state() { Some(ThinPoolStatus::Working(working)) => { working.summary == ThinPoolStatusSummary::Good @@ -823,7 +823,11 @@ mod tests { #[test] fn loop_test_add_datadevs() { loopbacked::test_with_spec( - &loopbacked::DeviceLimits::Range(2, 3, Some((4u64 * Bytes(IEC::Gi)).sectors())), + &loopbacked::DeviceLimits::Range( + 2, + 3, + Some((4u64 * Bytes(u128::from(IEC::Gi))).sectors()), + ), test_add_datadevs, ); } @@ -833,8 +837,8 @@ mod tests { real::test_with_spec( &real::DeviceLimits::AtLeast( 2, - Some((2u64 * Bytes(IEC::Gi)).sectors()), - Some((4u64 * Bytes(IEC::Gi)).sectors()), + Some((2u64 * Bytes(u128::from(IEC::Gi))).sectors()), + Some((4u64 * Bytes(u128::from(IEC::Gi))).sectors()), ), test_add_datadevs, ); diff --git a/src/engine/strat_engine/tests/loopbacked.rs b/src/engine/strat_engine/tests/loopbacked.rs index a2020a365a..451d3996d0 100644 --- a/src/engine/strat_engine/tests/loopbacked.rs +++ b/src/engine/strat_engine/tests/loopbacked.rs @@ -37,7 +37,7 @@ impl LoopTestDev { /// Create its backing store of specified size. The file is sparse but /// will appear to be zeroed. pub fn new(lc: &LoopControl, path: &Path, size: Option) -> LoopTestDev { - let size = size.unwrap_or_else(|| Bytes(IEC::Gi).sectors()); + let size = size.unwrap_or_else(|| Bytes(u128::from(IEC::Gi)).sectors()); let f = OpenOptions::new() .read(true) @@ -46,7 +46,11 @@ impl LoopTestDev { .open(&path) .unwrap(); - nix::unistd::ftruncate(f.as_raw_fd(), *size.bytes() as nix::libc::off_t).unwrap(); + nix::unistd::ftruncate( + f.as_raw_fd(), + convert_test!(*size.bytes(), u128, nix::libc::off_t), + ) + .unwrap(); f.sync_all().unwrap(); let ld = lc.next_free().unwrap(); diff --git a/src/engine/strat_engine/tests/real.rs b/src/engine/strat_engine/tests/real.rs index 4516f8689f..e78778566e 100644 --- a/src/engine/strat_engine/tests/real.rs +++ b/src/engine/strat_engine/tests/real.rs @@ -34,7 +34,12 @@ impl RealTestDev { /// Wipe initial MiB to clear metadata. pub fn new(dev: Either) -> RealTestDev { let test_dev = RealTestDev { dev }; - wipe_sectors(test_dev.as_path(), Sectors(0), Bytes(IEC::Mi).sectors()).unwrap(); + wipe_sectors( + test_dev.as_path(), + Sectors(0), + Bytes(u128::from(IEC::Mi)).sectors(), + ) + .unwrap(); test_dev } @@ -45,7 +50,12 @@ impl RealTestDev { /// Teardown a real test dev fn teardown(self) { - wipe_sectors(&self.as_path(), Sectors(0), Bytes(IEC::Mi).sectors()).unwrap(); + wipe_sectors( + &self.as_path(), + Sectors(0), + Bytes(u128::from(IEC::Mi)).sectors(), + ) + .unwrap(); if let Some(mut ld) = self.dev.right() { ld.teardown(get_dm()).unwrap(); } @@ -89,7 +99,7 @@ fn get_device_runs<'a>( } }; - let min_size = min_size.unwrap_or_else(|| Bytes(IEC::Gi).sectors()); + let min_size = min_size.unwrap_or_else(|| Bytes(u128::from(IEC::Gi)).sectors()); assert!(max_size.is_none() || Some(min_size) <= max_size); diff --git a/src/engine/strat_engine/thinpool/filesystem.rs b/src/engine/strat_engine/thinpool/filesystem.rs index dadf21b932..034e4efb28 100644 --- a/src/engine/strat_engine/thinpool/filesystem.rs +++ b/src/engine/strat_engine/thinpool/filesystem.rs @@ -345,7 +345,7 @@ pub fn fs_usage(mount_point: &Path) -> StratisResult<(Bytes, Bytes)> { stat.blocks_free() as u64, ); Ok(( - Bytes(block_size * blocks), - Bytes(block_size * (blocks - blocks_free)), + Bytes(u128::from(block_size * blocks)), + Bytes(u128::from(block_size * (blocks - blocks_free))), )) } diff --git a/src/engine/strat_engine/thinpool/thinpool.rs b/src/engine/strat_engine/thinpool/thinpool.rs index 2ccaf6fcb8..562f0a820e 100644 --- a/src/engine/strat_engine/thinpool/thinpool.rs +++ b/src/engine/strat_engine/thinpool/thinpool.rs @@ -1341,7 +1341,7 @@ mod tests { #[test] fn loop_test_full_pool() { loopbacked::test_with_spec( - &loopbacked::DeviceLimits::Exactly(2, Some(Bytes(IEC::Gi).sectors())), + &loopbacked::DeviceLimits::Exactly(2, Some(Bytes(u128::from(IEC::Gi)).sectors())), test_full_pool, ); } @@ -1351,8 +1351,8 @@ mod tests { real::test_with_spec( &real::DeviceLimits::Exactly( 2, - Some(Bytes(IEC::Gi).sectors()), - Some(Bytes(IEC::Gi * 4).sectors()), + Some(Bytes(u128::from(IEC::Gi)).sectors()), + Some(Bytes(u128::from(IEC::Gi) * 4).sectors()), ), test_full_pool, ); @@ -1641,7 +1641,7 @@ mod tests { // Create a filesystem as small as possible. Allocate 1 MiB bigger than // the low water mark. - let fs_size = FILESYSTEM_LOWATER + Bytes(IEC::Mi).sectors(); + let fs_size = FILESYSTEM_LOWATER + Bytes(u128::from(IEC::Mi)).sectors(); let fs_name = "stratis_test_filesystem"; let fs_uuid = pool @@ -1668,7 +1668,7 @@ mod tests { } // Write 2 MiB of data. The filesystem's free space is now 1 MiB // below FILESYSTEM_LOWATER. - let write_size = Bytes(IEC::Mi * 2).sectors(); + let write_size = Bytes(u128::from(IEC::Mi) * 2).sectors(); let buf = &[1u8; SECTOR_SIZE]; for i in 0..*write_size { let file_path = tmp_dir.path().join(format!("stratis_test{}.txt", i)); diff --git a/src/engine/strat_engine/writing.rs b/src/engine/strat_engine/writing.rs index ce97532c95..eef0494e4a 100644 --- a/src/engine/strat_engine/writing.rs +++ b/src/engine/strat_engine/writing.rs @@ -60,11 +60,11 @@ fn write_sectors>( buf: &[u8; SECTOR_SIZE], ) -> StratisResult<()> { let mut f = BufWriter::with_capacity( - convert_const!(min(IEC::Mi, *(length.bytes())), u64, usize), + convert_const!(min(u128::from(IEC::Mi), *(length.bytes())), u128, usize), OpenOptions::new().write(true).open(path)?, ); - f.seek(SeekFrom::Start(*offset.bytes()))?; + f.seek(SeekFrom::Start(convert_int!(*offset.bytes(), u128, u64)?))?; for _ in 0..*length { f.write_all(buf)?; } From 05bbf4a0abcde18e9b6a533f733122defba79958 Mon Sep 17 00:00:00 2001 From: John Baublitz Date: Fri, 20 Nov 2020 09:14:48 -0500 Subject: [PATCH 2/4] Fix Cargo.lock --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01e6a0d456..036ee16a36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -244,13 +244,13 @@ dependencies = [ [[package]] name = "devicemapper" -version = "0.28.0" -source = "git+https://github.com/jbaublitz/devicemapper-rs?branch=u128-bytes#aca885e6cf578c9c5568ea4d61568c75b7a4ff09" +version = "0.28.1" +source = "git+https://github.com/jbaublitz/devicemapper-rs?branch=u128-bytes#0900f2c2780e1df866346e88f93c6b941b72d574" dependencies = [ "bitflags", "error-chain", "libc", - "nix 0.14.0", + "nix 0.18.0", "serde", ] From 35efcdef4a35163a51060e58bc9fb48e82bfad11 Mon Sep 17 00:00:00 2001 From: John Baublitz Date: Thu, 7 Jan 2021 13:23:07 -0500 Subject: [PATCH 3/4] One last clean up commit --- src/engine/strat_engine/metadata/mda.rs | 36 +++++++++++-------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/engine/strat_engine/metadata/mda.rs b/src/engine/strat_engine/metadata/mda.rs index bf3df15b99..a613081de7 100644 --- a/src/engine/strat_engine/metadata/mda.rs +++ b/src/engine/strat_engine/metadata/mda.rs @@ -4,9 +4,7 @@ use std::{ cmp::Ordering, - convert::TryInto, io::{Read, Seek, SeekFrom}, - num::TryFromIntError, }; use byteorder::{ByteOrder, LittleEndian}; @@ -73,11 +71,11 @@ impl MDARegions { let region_size = mda_size.region_size(); let region_size_bytes = region_size.sectors().bytes(); for region in 0..mda_size::NUM_MDA_REGIONS { - f.seek(SeekFrom::Start( - MDARegions::mda_offset(header_size, region, region_size_bytes) - .try_into() - .map_err(|e: TryFromIntError| StratisError::Error(e.to_string()))?, - ))?; + f.seek(SeekFrom::Start(convert_int!( + MDARegions::mda_offset(header_size, region, region_size_bytes), + u128, + u64 + )?))?; f.write_all(&hdr_buf)?; } @@ -113,11 +111,11 @@ impl MDARegions { // been corrupted, return an error. let mut load_a_region = |index: usize| -> StratisResult> { let mut hdr_buf = [0u8; mda_size::_MDA_REGION_HDR_SIZE]; - f.seek(SeekFrom::Start( - MDARegions::mda_offset(header_size, index, region_size_bytes) - .try_into() - .map_err(|e: TryFromIntError| StratisError::Error(e.to_string()))?, - ))?; + f.seek(SeekFrom::Start(convert_int!( + MDARegions::mda_offset(header_size, index, region_size_bytes), + u128, + u64 + )?))?; f.read_exact(&mut hdr_buf)?; Ok(MDAHeader::from_buf(&hdr_buf)?) }; @@ -180,11 +178,11 @@ impl MDARegions { // Write data to a region specified by index. let region_size = self.region_size.sectors().bytes(); let mut save_region = |index: usize| -> StratisResult<()> { - f.seek(SeekFrom::Start( - MDARegions::mda_offset(header_size, index, region_size) - .try_into() - .map_err(|e: TryFromIntError| StratisError::Error(e.to_string()))?, - ))?; + f.seek(SeekFrom::Start(convert_int!( + MDARegions::mda_offset(header_size, index, region_size), + u128, + u64 + )?))?; f.write_all(&hdr_buf)?; f.write_all(data)?; f.sync_all()?; @@ -223,9 +221,7 @@ impl MDARegions { let mut load_region = |index: usize| -> StratisResult> { let offset = MDARegions::mda_offset(header_size, index, region_size) + mda_size::_MDA_REGION_HDR_SIZE as u128; - f.seek(SeekFrom::Start(offset.try_into().map_err( - |e: TryFromIntError| StratisError::Error(e.to_string()), - )?))?; + f.seek(SeekFrom::Start(convert_int!(offset, u128, u64)?))?; mda.load_region(f) }; From 518962fb7340b3d60792637ac3813466bc58c601 Mon Sep 17 00:00:00 2001 From: John Baublitz Date: Fri, 8 Jan 2021 09:29:42 -0500 Subject: [PATCH 4/4] PR revisions --- Cargo.lock | 2 +- .../blockdev/fetch_properties_2_0/methods.rs | 2 +- src/engine/shared.rs | 2 +- src/engine/sim_engine/blockdev.rs | 2 +- src/engine/strat_engine/backstore/blockdevmgr.rs | 2 +- src/engine/strat_engine/device.rs | 2 +- src/engine/strat_engine/metadata/mda.rs | 8 ++++---- src/engine/strat_engine/metadata/static_header.rs | 11 +++++------ src/engine/strat_engine/pool.rs | 12 ++++-------- src/engine/strat_engine/tests/loopbacked.rs | 2 +- src/engine/strat_engine/tests/real.rs | 11 +++-------- src/engine/strat_engine/thinpool/filesystem.rs | 4 ++-- src/engine/strat_engine/thinpool/thinpool.rs | 10 +++++----- 13 files changed, 30 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 036ee16a36..28a9146669 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -245,7 +245,7 @@ dependencies = [ [[package]] name = "devicemapper" version = "0.28.1" -source = "git+https://github.com/jbaublitz/devicemapper-rs?branch=u128-bytes#0900f2c2780e1df866346e88f93c6b941b72d574" +source = "git+https://github.com/jbaublitz/devicemapper-rs?branch=u128-bytes#4fb3306025cb1168358a491e956b58bf7512f971" dependencies = [ "bitflags", "error-chain", diff --git a/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs b/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs index eadc35abf4..d208b6df9c 100644 --- a/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs +++ b/src/dbus_api/blockdev/fetch_properties_2_0/methods.rs @@ -34,7 +34,7 @@ fn get_properties_shared( result_to_tuple(blockdev_operation( m.tree, object_path.get_name(), - |_, bd| Ok((*bd.size()).to_string()), + |_, bd| Ok((*bd.size().bytes()).to_string()), )), )), _ => None, diff --git a/src/engine/shared.rs b/src/engine/shared.rs index ab81e24148..7211720349 100644 --- a/src/engine/shared.rs +++ b/src/engine/shared.rs @@ -113,7 +113,7 @@ pub fn set_key_shared(key_fd: RawFd) -> StratisResult { ErrorEnum::Invalid, format!( "Provided key exceeded maximum allow length of {}", - Bytes(MAX_STRATIS_PASS_SIZE as u128) + Bytes::from(MAX_STRATIS_PASS_SIZE) ), )); } diff --git a/src/engine/sim_engine/blockdev.rs b/src/engine/sim_engine/blockdev.rs index 3acaca3a89..194af243ea 100644 --- a/src/engine/sim_engine/blockdev.rs +++ b/src/engine/sim_engine/blockdev.rs @@ -51,7 +51,7 @@ impl BlockDev for SimDev { } fn size(&self) -> Sectors { - Bytes(u128::from(IEC::Gi)).sectors() + Bytes::from(IEC::Gi).sectors() } fn set_dbus_path(&mut self, path: MaybeDbusPath) { diff --git a/src/engine/strat_engine/backstore/blockdevmgr.rs b/src/engine/strat_engine/backstore/blockdevmgr.rs index 534e59bb32..59982d5f25 100644 --- a/src/engine/strat_engine/backstore/blockdevmgr.rs +++ b/src/engine/strat_engine/backstore/blockdevmgr.rs @@ -345,7 +345,7 @@ impl BlockDevMgr { current_time }; - let data_size = Bytes(metadata.len() as u128); + let data_size = Bytes::from(metadata.len()); let candidates = self .block_devs .iter_mut() diff --git a/src/engine/strat_engine/device.rs b/src/engine/strat_engine/device.rs index 0bc275c217..5d044a5b47 100644 --- a/src/engine/strat_engine/device.rs +++ b/src/engine/strat_engine/device.rs @@ -28,6 +28,6 @@ pub fn blkdev_size(file: &File) -> StratisResult { match unsafe { blkgetsize64(file.as_raw_fd(), &mut val) } { Err(x) => Err(StratisError::Nix(x)), - Ok(_) => Ok(Bytes(u128::from(val))), + Ok(_) => Ok(Bytes::from(val)), } } diff --git a/src/engine/strat_engine/metadata/mda.rs b/src/engine/strat_engine/metadata/mda.rs index a613081de7..97a386f435 100644 --- a/src/engine/strat_engine/metadata/mda.rs +++ b/src/engine/strat_engine/metadata/mda.rs @@ -158,7 +158,7 @@ impl MDARegions { )); } - let used = Bytes(data.len() as u128); + let used = Bytes::from(data.len()); let max_available = self.max_data_size().bytes(); if used > max_available { let err_msg = format!( @@ -334,7 +334,7 @@ impl MDAHeader { assert!(secs <= std::i64::MAX as u64); Some(MDAHeader { - used: MetaDataSize::new(Bytes(u128::from(used))), + used: MetaDataSize::new(Bytes::from(used)), last_updated: Utc.timestamp(secs as i64, LittleEndian::read_u32(&buf[24..28])), data_crc: LittleEndian::read_u32(&buf[4..8]), }) @@ -482,7 +482,7 @@ mod tests { let header = MDAHeader { last_updated: Utc.timestamp(sec, nsec), - used: MetaDataSize::new(Bytes(data.len() as u128)), + used: MetaDataSize::new(Bytes::from(data.len())), data_crc: crc32::checksum_castagnoli(data), }; let buf = header.to_buf(); @@ -504,7 +504,7 @@ mod tests { let header = MDAHeader { last_updated: Utc::now(), - used: MetaDataSize::new(Bytes(data.len() as u128)), + used: MetaDataSize::new(Bytes::from(data.len())), data_crc: crc32::checksum_castagnoli(&data), }; let mut buf = header.to_buf(); diff --git a/src/engine/strat_engine/metadata/static_header.rs b/src/engine/strat_engine/metadata/static_header.rs index 24b2a8a61f..2aab05bcb9 100644 --- a/src/engine/strat_engine/metadata/static_header.rs +++ b/src/engine/strat_engine/metadata/static_header.rs @@ -502,12 +502,11 @@ pub mod tests { pub fn random_static_header(blkdev_size: u64, mda_size_factor: u32) -> StaticHeader { let pool_uuid = Uuid::new_v4(); let dev_uuid = Uuid::new_v4(); - let mda_size = MDADataSize::new( - MDADataSize::default().bytes() + Bytes(u128::from(mda_size_factor * 4)), - ) - .region_size() - .mda_size(); - let blkdev_size = (Bytes(u128::from(IEC::Mi)) + Sectors(blkdev_size).bytes()).sectors(); + let mda_size = + MDADataSize::new(MDADataSize::default().bytes() + Bytes::from(mda_size_factor * 4)) + .region_size() + .mda_size(); + let blkdev_size = (Bytes::from(IEC::Mi) + Sectors(blkdev_size).bytes()).sectors(); StaticHeader::new( StratisIdentifiers::new(pool_uuid, dev_uuid), mda_size, diff --git a/src/engine/strat_engine/pool.rs b/src/engine/strat_engine/pool.rs index 0848deb9da..80d2927c4d 100644 --- a/src/engine/strat_engine/pool.rs +++ b/src/engine/strat_engine/pool.rs @@ -789,7 +789,7 @@ mod tests { let buf = &[1u8; SECTOR_SIZE]; let mut amount_written = Sectors(0); - let buffer_length = Bytes(u128::from(buffer_length)).sectors(); + let buffer_length = Bytes::from(buffer_length).sectors(); while match pool.thin_pool.state() { Some(ThinPoolStatus::Working(working)) => { working.summary == ThinPoolStatusSummary::Good @@ -823,11 +823,7 @@ mod tests { #[test] fn loop_test_add_datadevs() { loopbacked::test_with_spec( - &loopbacked::DeviceLimits::Range( - 2, - 3, - Some((4u64 * Bytes(u128::from(IEC::Gi))).sectors()), - ), + &loopbacked::DeviceLimits::Range(2, 3, Some(Bytes::from(IEC::Gi * 4).sectors())), test_add_datadevs, ); } @@ -837,8 +833,8 @@ mod tests { real::test_with_spec( &real::DeviceLimits::AtLeast( 2, - Some((2u64 * Bytes(u128::from(IEC::Gi))).sectors()), - Some((4u64 * Bytes(u128::from(IEC::Gi))).sectors()), + Some(Bytes::from(IEC::Gi * 2).sectors()), + Some(Bytes::from(IEC::Gi * 4).sectors()), ), test_add_datadevs, ); diff --git a/src/engine/strat_engine/tests/loopbacked.rs b/src/engine/strat_engine/tests/loopbacked.rs index 451d3996d0..ccc098f88c 100644 --- a/src/engine/strat_engine/tests/loopbacked.rs +++ b/src/engine/strat_engine/tests/loopbacked.rs @@ -37,7 +37,7 @@ impl LoopTestDev { /// Create its backing store of specified size. The file is sparse but /// will appear to be zeroed. pub fn new(lc: &LoopControl, path: &Path, size: Option) -> LoopTestDev { - let size = size.unwrap_or_else(|| Bytes(u128::from(IEC::Gi)).sectors()); + let size = size.unwrap_or_else(|| Bytes::from(IEC::Gi).sectors()); let f = OpenOptions::new() .read(true) diff --git a/src/engine/strat_engine/tests/real.rs b/src/engine/strat_engine/tests/real.rs index e78778566e..8d553b3294 100644 --- a/src/engine/strat_engine/tests/real.rs +++ b/src/engine/strat_engine/tests/real.rs @@ -37,7 +37,7 @@ impl RealTestDev { wipe_sectors( test_dev.as_path(), Sectors(0), - Bytes(u128::from(IEC::Mi)).sectors(), + Bytes::from(IEC::Mi).sectors(), ) .unwrap(); test_dev @@ -50,12 +50,7 @@ impl RealTestDev { /// Teardown a real test dev fn teardown(self) { - wipe_sectors( - &self.as_path(), - Sectors(0), - Bytes(u128::from(IEC::Mi)).sectors(), - ) - .unwrap(); + wipe_sectors(&self.as_path(), Sectors(0), Bytes::from(IEC::Mi).sectors()).unwrap(); if let Some(mut ld) = self.dev.right() { ld.teardown(get_dm()).unwrap(); } @@ -99,7 +94,7 @@ fn get_device_runs<'a>( } }; - let min_size = min_size.unwrap_or_else(|| Bytes(u128::from(IEC::Gi)).sectors()); + let min_size = min_size.unwrap_or_else(|| Bytes::from(IEC::Gi).sectors()); assert!(max_size.is_none() || Some(min_size) <= max_size); diff --git a/src/engine/strat_engine/thinpool/filesystem.rs b/src/engine/strat_engine/thinpool/filesystem.rs index 034e4efb28..a5cab2680e 100644 --- a/src/engine/strat_engine/thinpool/filesystem.rs +++ b/src/engine/strat_engine/thinpool/filesystem.rs @@ -345,7 +345,7 @@ pub fn fs_usage(mount_point: &Path) -> StratisResult<(Bytes, Bytes)> { stat.blocks_free() as u64, ); Ok(( - Bytes(u128::from(block_size * blocks)), - Bytes(u128::from(block_size * (blocks - blocks_free))), + Bytes::from(block_size * blocks), + Bytes::from(block_size * (blocks - blocks_free)), )) } diff --git a/src/engine/strat_engine/thinpool/thinpool.rs b/src/engine/strat_engine/thinpool/thinpool.rs index 562f0a820e..a8159661c2 100644 --- a/src/engine/strat_engine/thinpool/thinpool.rs +++ b/src/engine/strat_engine/thinpool/thinpool.rs @@ -1341,7 +1341,7 @@ mod tests { #[test] fn loop_test_full_pool() { loopbacked::test_with_spec( - &loopbacked::DeviceLimits::Exactly(2, Some(Bytes(u128::from(IEC::Gi)).sectors())), + &loopbacked::DeviceLimits::Exactly(2, Some(Bytes::from(IEC::Gi).sectors())), test_full_pool, ); } @@ -1351,8 +1351,8 @@ mod tests { real::test_with_spec( &real::DeviceLimits::Exactly( 2, - Some(Bytes(u128::from(IEC::Gi)).sectors()), - Some(Bytes(u128::from(IEC::Gi) * 4).sectors()), + Some(Bytes::from(IEC::Gi).sectors()), + Some(Bytes::from(IEC::Gi * 4).sectors()), ), test_full_pool, ); @@ -1641,7 +1641,7 @@ mod tests { // Create a filesystem as small as possible. Allocate 1 MiB bigger than // the low water mark. - let fs_size = FILESYSTEM_LOWATER + Bytes(u128::from(IEC::Mi)).sectors(); + let fs_size = FILESYSTEM_LOWATER + Bytes::from(IEC::Mi).sectors(); let fs_name = "stratis_test_filesystem"; let fs_uuid = pool @@ -1668,7 +1668,7 @@ mod tests { } // Write 2 MiB of data. The filesystem's free space is now 1 MiB // below FILESYSTEM_LOWATER. - let write_size = Bytes(u128::from(IEC::Mi) * 2).sectors(); + let write_size = Bytes::from(IEC::Mi * 2).sectors(); let buf = &[1u8; SECTOR_SIZE]; for i in 0..*write_size { let file_path = tmp_dir.path().join(format!("stratis_test{}.txt", i));