Add more contextual error messages for better error reporting
Bug: 193612136
Test: m
Change-Id: If182768460a69c8a00c408e69e76e0240d0da8b8
diff --git a/apkdmverity/src/dm.rs b/apkdmverity/src/dm.rs
index 75a4366..2b44876 100644
--- a/apkdmverity/src/dm.rs
+++ b/apkdmverity/src/dm.rs
@@ -28,7 +28,7 @@
use crate::util::*;
-use anyhow::Result;
+use anyhow::{Context, Result};
use data_model::DataInit;
use std::fs::{File, OpenOptions};
use std::io::Write;
@@ -135,7 +135,11 @@
/// Constructs a new `DeviceMapper` entrypoint. This is essentially the same as opening
/// "/dev/mapper/control".
pub fn new() -> Result<DeviceMapper> {
- let f = OpenOptions::new().read(true).write(true).open(MAPPER_CONTROL)?;
+ let f = OpenOptions::new()
+ .read(true)
+ .write(true)
+ .open(MAPPER_CONTROL)
+ .context(format!("failed to open {}", MAPPER_CONTROL))?;
Ok(DeviceMapper(f))
}
@@ -145,7 +149,8 @@
// Step 1: create an empty device
let mut data = DmIoctl::new(&name)?;
data.set_uuid(&uuid()?)?;
- dm_dev_create(&self, &mut data)?;
+ dm_dev_create(&self, &mut data)
+ .context(format!("failed to create an empty device with name {}", &name))?;
// Step 2: load table onto the device
let payload_size = size_of::<DmIoctl>() + target.as_slice().len();
@@ -159,12 +164,13 @@
let mut payload = Vec::with_capacity(payload_size);
payload.extend_from_slice(data.as_slice());
payload.extend_from_slice(target.as_slice());
- dm_table_load(&self, payload.as_mut_ptr() as *mut DmIoctl)?;
+ dm_table_load(&self, payload.as_mut_ptr() as *mut DmIoctl)
+ .context("failed to load table")?;
// Step 3: activate the device (note: the term 'suspend' might be misleading, but it
// actually activates the table. See include/uapi/linux/dm-ioctl.h
let mut data = DmIoctl::new(&name)?;
- dm_dev_suspend(&self, &mut data)?;
+ dm_dev_suspend(&self, &mut data).context("failed to activate")?;
// Step 4: wait unti the device is created and return the device path
let path = Path::new(MAPPER_DEV_ROOT).join(&name);
@@ -177,7 +183,8 @@
pub fn delete_device_deferred(&self, name: &str) -> Result<()> {
let mut data = DmIoctl::new(&name)?;
data.flags |= Flag::DM_DEFERRED_REMOVE;
- dm_dev_remove(&self, &mut data)?;
+ dm_dev_remove(&self, &mut data)
+ .context(format!("failed to remove device with name {}", &name))?;
Ok(())
}
}
diff --git a/apkdmverity/src/main.rs b/apkdmverity/src/main.rs
index 54d5def..321f79a 100644
--- a/apkdmverity/src/main.rs
+++ b/apkdmverity/src/main.rs
@@ -98,7 +98,9 @@
// Parse the idsig file to locate the merkle tree in it, then attach the file to a loop device
// with the offset so that the start of the merkle tree becomes the beginning of the loop
// device.
- let sig = V4Signature::from(File::open(&idsig)?)?;
+ let sig = V4Signature::from(
+ File::open(&idsig).context(format!("Failed to open idsig file {:?}", &idsig))?,
+ )?;
let offset = sig.merkle_tree_offset;
let size = sig.merkle_tree_size as u64;
let hash_device = loopdevice::attach(&idsig, offset, size)?;