diff options
Diffstat (limited to 'fs_mgr')
-rw-r--r-- | fs_mgr/fs_mgr.cpp | 38 | ||||
-rw-r--r-- | fs_mgr/include/fs_mgr.h | 4 | ||||
-rw-r--r-- | fs_mgr/tools/dmctl.cpp | 2 |
3 files changed, 35 insertions, 9 deletions
diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index d26f2d519..ba6b9eb14 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -1602,6 +1602,14 @@ bool fs_mgr_load_verity_state(int* mode) { return true; } +std::string fs_mgr_get_verity_device_name(const FstabEntry& entry) { + if (entry.mount_point == "/") { + // In AVB, the dm device name is vroot instead of system. + return entry.fs_mgr_flags.avb ? "vroot" : "system"; + } + return Basename(entry.mount_point); +} + bool fs_mgr_is_verity_enabled(const FstabEntry& entry) { if (!entry.fs_mgr_flags.verify && !entry.fs_mgr_flags.avb) { return false; @@ -1609,14 +1617,7 @@ bool fs_mgr_is_verity_enabled(const FstabEntry& entry) { DeviceMapper& dm = DeviceMapper::Instance(); - std::string mount_point; - if (entry.mount_point == "/") { - // In AVB, the dm device name is vroot instead of system. - mount_point = entry.fs_mgr_flags.avb ? "vroot" : "system"; - } else { - mount_point = Basename(entry.mount_point); - } - + std::string mount_point = fs_mgr_get_verity_device_name(entry); if (dm.GetState(mount_point) == DmDeviceState::INVALID) { return false; } @@ -1639,6 +1640,27 @@ bool fs_mgr_is_verity_enabled(const FstabEntry& entry) { return false; } +bool fs_mgr_verity_is_check_at_most_once(const android::fs_mgr::FstabEntry& entry) { + if (!entry.fs_mgr_flags.verify && !entry.fs_mgr_flags.avb) { + return false; + } + + DeviceMapper& dm = DeviceMapper::Instance(); + std::string device = fs_mgr_get_verity_device_name(entry); + + std::vector<DeviceMapper::TargetInfo> table; + if (dm.GetState(device) == DmDeviceState::INVALID || !dm.GetTableInfo(device, &table)) { + return false; + } + for (const auto& target : table) { + if (strcmp(target.spec.target_type, "verity") == 0 && + target.data.find("check_at_most_once") != std::string::npos) { + return true; + } + } + return false; +} + std::string fs_mgr_get_super_partition_name(int slot) { // Devices upgrading to dynamic partitions are allowed to specify a super // partition name, assumed to be A/B (non-A/B retrofit is not supported). diff --git a/fs_mgr/include/fs_mgr.h b/fs_mgr/include/fs_mgr.h index a3bb85215..8abe609a5 100644 --- a/fs_mgr/include/fs_mgr.h +++ b/fs_mgr/include/fs_mgr.h @@ -77,6 +77,10 @@ bool fs_mgr_is_verity_enabled(const android::fs_mgr::FstabEntry& entry); bool fs_mgr_swapon_all(const android::fs_mgr::Fstab& fstab); bool fs_mgr_update_logical_partition(android::fs_mgr::FstabEntry* entry); +// Returns true if the given fstab entry has verity enabled, *and* the verity +// device is in "check_at_most_once" mode. +bool fs_mgr_verity_is_check_at_most_once(const android::fs_mgr::FstabEntry& entry); + int fs_mgr_do_format(const android::fs_mgr::FstabEntry& entry, bool reserve_footer); #define FS_MGR_SETUP_VERITY_SKIPPED (-3) diff --git a/fs_mgr/tools/dmctl.cpp b/fs_mgr/tools/dmctl.cpp index 63661f0aa..9309aadf8 100644 --- a/fs_mgr/tools/dmctl.cpp +++ b/fs_mgr/tools/dmctl.cpp @@ -316,7 +316,7 @@ static int TableCmdHandler(int argc, char** argv) { DeviceMapper& dm = DeviceMapper::Instance(); std::vector<DeviceMapper::TargetInfo> table; - if (!dm.GetTableStatus(argv[0], &table)) { + if (!dm.GetTableInfo(argv[0], &table)) { std::cerr << "Could not query table status of device \"" << argv[0] << "\"." << std::endl; return -EINVAL; } |