[libdm_rust] Enable writable loopdevice
Add option in loopdevice module to create a block device in writable
mode as well. This is required for unit-testing dm-crypt device.
Also, add test: attach_loop_device_with_dio_writable
Test: atest libdm_rust.test
Test: atest apkdmverity.test
Bug: 250880499
Change-Id: I793ca247ec3cb3258d16a6d9bb25aae31c127ede
diff --git a/apkdmverity/src/main.rs b/apkdmverity/src/main.rs
index 23457c4..a69b583 100644
--- a/apkdmverity/src/main.rs
+++ b/apkdmverity/src/main.rs
@@ -93,7 +93,7 @@
bail!("The size of {:?} is not multiple of {}.", &apk, BLOCK_SIZE)
}
(
- loopdevice::attach(&apk, 0, apk_size, /*direct_io*/ true)
+ loopdevice::attach(&apk, 0, apk_size, /*direct_io*/ true, /*writable*/ false)
.context("Failed to attach APK to a loop device")?,
apk_size,
)
@@ -108,8 +108,9 @@
// Due to unknown reason(b/191344832), we can't enable "direct IO" for the IDSIG file (backing
// the hash). For now we don't use "direct IO" but it seems OK since the IDSIG file is very
// small and the benefit of direct-IO would be negliable.
- let hash_device = loopdevice::attach(&idsig, offset, size, /*direct_io*/ false)
- .context("Failed to attach idsig to a loop device")?;
+ let hash_device =
+ loopdevice::attach(&idsig, offset, size, /*direct_io*/ false, /*writable*/ false)
+ .context("Failed to attach idsig to a loop device")?;
// Build a dm-verity target spec from the information from the idsig file. The apk and the
// idsig files are used as the data device and the hash device, respectively.
@@ -324,9 +325,19 @@
// already a block device, `enable_verity` uses the block device as it is. The detatching
// of the data device is done in the scopeguard for the return value of `enable_verity`
// below. Only the idsig_loop_device needs detatching.
- let apk_loop_device = loopdevice::attach(&apk_path, 0, apk_size, true).unwrap();
+ let apk_loop_device = loopdevice::attach(
+ &apk_path, 0, apk_size, /*direct_io*/ true, /*writable*/ false,
+ )
+ .unwrap();
let idsig_loop_device = scopeguard::guard(
- loopdevice::attach(&idsig_path, 0, idsig_size, false).unwrap(),
+ loopdevice::attach(
+ &idsig_path,
+ 0,
+ idsig_size,
+ /*direct_io*/ false,
+ /*writable*/ false,
+ )
+ .unwrap(),
|dev| loopdevice::detach(dev).unwrap(),
);