From 8a9c294f3781320e093357f054561a3fd7d8685f Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Thu, 30 Aug 2018 11:09:17 -0700 Subject: [PATCH 1/2] Adding bow dm-target Test: Can load with dm-ctl Change-Id: I0c6a750340fa6babcfa0f72b66c18a0b3eacd9d8 --- fs_mgr/libdm/include/libdm/dm_target.h | 12 ++++++++++++ fs_mgr/tools/dmctl.cpp | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/fs_mgr/libdm/include/libdm/dm_target.h b/fs_mgr/libdm/include/libdm/dm_target.h index aab89e5f0..3fde95a4a 100644 --- a/fs_mgr/libdm/include/libdm/dm_target.h +++ b/fs_mgr/libdm/include/libdm/dm_target.h @@ -156,6 +156,18 @@ class DmTargetVerityString final : public DmTarget { std::string target_string_; }; +class DmTargetBow final : public DmTarget { + public: + DmTargetBow(uint64_t start, uint64_t length, const std::string& target_string) + : DmTarget(start, length), target_string_(target_string) {} + + std::string name() const override { return "bow"; } + std::string GetParameterString() const override { return target_string_; } + + private: + std::string target_string_; +}; + } // namespace dm } // namespace android diff --git a/fs_mgr/tools/dmctl.cpp b/fs_mgr/tools/dmctl.cpp index 879ba2101..f78093bdf 100644 --- a/fs_mgr/tools/dmctl.cpp +++ b/fs_mgr/tools/dmctl.cpp @@ -42,6 +42,7 @@ using DmTarget = ::android::dm::DmTarget; using DmTargetLinear = ::android::dm::DmTargetLinear; using DmTargetZero = ::android::dm::DmTargetZero; using DmTargetAndroidVerity = ::android::dm::DmTargetAndroidVerity; +using DmTargetBow = ::android::dm::DmTargetBow; using DmTargetTypeInfo = ::android::dm::DmTargetTypeInfo; using DmBlockDevice = ::android::dm::DeviceMapper::DmBlockDevice; @@ -108,6 +109,13 @@ class TargetParser final { std::string block_device = NextArg(); return std::make_unique(start_sector, num_sectors, keyid, block_device); + } else if (target_type == "bow") { + if (!HasArgs(1)) { + std::cerr << "Expected \"bow\" " << std::endl; + return nullptr; + } + std::string block_device = NextArg(); + return std::make_unique(start_sector, num_sectors, block_device); } else { std::cerr << "Unrecognized target type: " << target_type << std::endl; return nullptr; From 786d0b27a2ed38682a58445505a4b34dc8a4ebdb Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Fri, 21 Sep 2018 10:49:38 -0700 Subject: [PATCH 2/2] make checkpointing work on ext4 Test: Test script passes Change-Id: Iafa337947f2fd456aa692ecb112ccc56638f7947 --- fs_mgr/fs_mgr.cpp | 41 +++++++++++++++++++++++--- fs_mgr/libdm/include/libdm/dm_target.h | 2 ++ rootdir/init.rc | 1 + 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp index d29ccf438..c89a541e8 100644 --- a/fs_mgr/fs_mgr.cpp +++ b/fs_mgr/fs_mgr.cpp @@ -840,7 +840,7 @@ bool fs_mgr_update_logical_partition(struct fstab_rec* rec) { } bool fs_mgr_update_checkpoint_partition(struct fstab_rec* rec) { - if (fs_mgr_is_checkpoint(rec)) { + if (fs_mgr_is_checkpoint_fs(rec)) { if (!strcmp(rec->fs_type, "f2fs")) { std::string opts(rec->fs_options); @@ -850,9 +850,42 @@ bool fs_mgr_update_checkpoint_partition(struct fstab_rec* rec) { } else { LERROR << rec->fs_type << " does not implement checkpoints."; } - } else if (rec->fs_mgr_flags & MF_CHECKPOINT_BLK) { - LERROR << "Block based checkpoint not implemented."; - return false; + } else if (fs_mgr_is_checkpoint_blk(rec)) { + call_vdc({"checkpoint", "restoreCheckpoint", rec->blk_device}); + + android::base::unique_fd fd( + TEMP_FAILURE_RETRY(open(rec->blk_device, O_RDONLY | O_CLOEXEC))); + if (!fd) { + PERROR << "Cannot open device " << rec->blk_device; + return false; + } + + uint64_t size = get_block_device_size(fd) / 512; + if (!size) { + PERROR << "Cannot get device size"; + return false; + } + + android::dm::DmTable table; + if (!table.AddTarget( + std::make_unique(0, size, rec->blk_device))) { + LERROR << "Failed to add Bow target"; + return false; + } + + DeviceMapper& dm = DeviceMapper::Instance(); + if (!dm.CreateDevice("bow", table)) { + PERROR << "Failed to create bow device"; + return false; + } + + std::string name; + if (!dm.GetDmDevicePathByName("bow", &name)) { + PERROR << "Failed to get bow device name"; + return false; + } + + rec->blk_device = strdup(name.c_str()); } return true; } diff --git a/fs_mgr/libdm/include/libdm/dm_target.h b/fs_mgr/libdm/include/libdm/dm_target.h index 3fde95a4a..175b0f05c 100644 --- a/fs_mgr/libdm/include/libdm/dm_target.h +++ b/fs_mgr/libdm/include/libdm/dm_target.h @@ -156,6 +156,8 @@ class DmTargetVerityString final : public DmTarget { std::string target_string_; }; +// dm-bow is the backup on write target that can provide checkpoint capability +// for file systems that do not support checkpoints natively class DmTargetBow final : public DmTarget { public: DmTargetBow(uint64_t start, uint64_t length, const std::string& target_string) diff --git a/rootdir/init.rc b/rootdir/init.rc index f39ea7c09..2a70a4aee 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -400,6 +400,7 @@ on post-fs-data # Make sure we have the device encryption key. start vold + exec - system system -- /system/bin/vdc checkpoint prepareDriveForCheckpoint /data installkey /data # Start bootcharting as soon as possible after the data partition is