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)?;