From 43de4ef22da3f49a82bd10f1e1899da1d1e4dd8b Mon Sep 17 00:00:00 2001 From: Ed Tsai Date: Fri, 19 Jan 2024 08:13:12 +0800 Subject: [PATCH] Support for striped in libdm Add dm stripe in dmctl framework to support stripe on two block devices. Bug: 321628121 Change-Id: I2f326f19f7ccff1ee03598743022fb702b3e8d6a Signed-off-by: Ed Tsai --- fs_mgr/libdm/dm_target.cpp | 4 ++++ fs_mgr/libdm/dm_test.cpp | 7 +++++++ fs_mgr/libdm/include/libdm/dm_target.h | 18 ++++++++++++++++++ fs_mgr/tools/dmctl.cpp | 15 +++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/fs_mgr/libdm/dm_target.cpp b/fs_mgr/libdm/dm_target.cpp index 90d91a00c..1f6bd1a21 100644 --- a/fs_mgr/libdm/dm_target.cpp +++ b/fs_mgr/libdm/dm_target.cpp @@ -61,6 +61,10 @@ std::string DmTargetLinear::GetParameterString() const { return block_device_ + " " + std::to_string(physical_sector_); } +std::string DmTargetStripe::GetParameterString() const { + return "2 " + std::to_string(chunksize) + " " + block_device0_ + " 0 " + block_device1_ + " 0"; +} + DmTargetVerity::DmTargetVerity(uint64_t start, uint64_t length, uint32_t version, const std::string& block_device, const std::string& hash_device, uint32_t data_block_size, uint32_t hash_block_size, diff --git a/fs_mgr/libdm/dm_test.cpp b/fs_mgr/libdm/dm_test.cpp index a0129c234..d043be63b 100644 --- a/fs_mgr/libdm/dm_test.cpp +++ b/fs_mgr/libdm/dm_test.cpp @@ -181,6 +181,13 @@ TEST_F(DmTest, DmSuspendResume) { ASSERT_EQ(dm.GetState(dev.name()), DmDeviceState::ACTIVE); } +TEST_F(DmTest, StripeArgs) { + DmTargetStripe target(0, 4096, 1024, "/dev/loop0", "/dev/loop1"); + ASSERT_EQ(target.name(), "striped"); + ASSERT_TRUE(target.Valid()); + ASSERT_EQ(target.GetParameterString(), "2 1024 /dev/loop0 0 /dev/loop1 0"); +} + TEST_F(DmTest, DmVerityArgsAvb2) { std::string device = "/dev/block/platform/soc/1da4000.ufshc/by-name/vendor_a"; std::string algorithm = "sha1"; diff --git a/fs_mgr/libdm/include/libdm/dm_target.h b/fs_mgr/libdm/include/libdm/dm_target.h index 09fe20012..97f3c134e 100644 --- a/fs_mgr/libdm/include/libdm/dm_target.h +++ b/fs_mgr/libdm/include/libdm/dm_target.h @@ -116,6 +116,24 @@ class DmTargetLinear final : public DmTarget { uint64_t physical_sector_; }; +class DmTargetStripe final : public DmTarget { + public: + DmTargetStripe(uint64_t start, uint64_t length, uint64_t chunksize, + const std::string& block_device0, const std::string& block_device1) + : DmTarget(start, length), + chunksize(chunksize), + block_device0_(block_device0), + block_device1_(block_device1) {} + + std::string name() const override { return "striped"; } + std::string GetParameterString() const override; + + private: + uint64_t chunksize; + std::string block_device0_; + std::string block_device1_; +}; + class DmTargetVerity final : public DmTarget { public: DmTargetVerity(uint64_t start, uint64_t length, uint32_t version, diff --git a/fs_mgr/tools/dmctl.cpp b/fs_mgr/tools/dmctl.cpp index 7273087b3..9dc8c2426 100644 --- a/fs_mgr/tools/dmctl.cpp +++ b/fs_mgr/tools/dmctl.cpp @@ -115,6 +115,21 @@ class TargetParser final { std::string block_device = NextArg(); return std::make_unique(start_sector, num_sectors, keyid, block_device); + } else if (target_type == "striped") { + if (!HasArgs(3)) { + std::cerr << "Expected \"striped\" " + << std::endl; + return nullptr; + } + std::string block_device0 = NextArg(); + std::string block_device1 = NextArg(); + uint64_t chunk_size; + if (!android::base::ParseUint(NextArg(), &chunk_size)) { + std::cerr << "Expected start sector, got: " << PreviousArg() << std::endl; + return nullptr; + } + return std::make_unique(start_sector, num_sectors, chunk_size, + block_device0, block_device1); } else if (target_type == "bow") { if (!HasArgs(1)) { std::cerr << "Expected \"bow\" " << std::endl;