libdm: dm-user target creation takes an additional argument

Rather than using some implicit naming scheme, we've decided to just let
userspace pick whatever control device naming scheme it wants.  This requires
an additional argument to be passed to the kernel.

Test: cow_snapuserd_test
Bug: 168259959
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
Change-Id: Ibf7f378b67abb6ca7457a9fdc9b8739e3d31bee3
Signed-off-by: Akilesh Kailash <akailash@google.com>
This commit is contained in:
Palmer Dabbelt 2020-10-02 18:13:29 -07:00 committed by Akilesh Kailash
parent 219b3487f8
commit eef49c9e3c
3 changed files with 13 additions and 2 deletions

View File

@ -284,6 +284,7 @@ std::string DmTargetUser::GetParameterString() const {
std::vector<std::string> argv;
argv.push_back(std::to_string(start()));
argv.push_back(std::to_string(size()));
argv.push_back(control_device());
return android::base::Join(argv, " ");
}

View File

@ -311,10 +311,15 @@ class DmTargetDefaultKey final : public DmTarget {
class DmTargetUser final : public DmTarget {
public:
DmTargetUser(uint64_t start, uint64_t length) : DmTarget(start, length) {}
DmTargetUser(uint64_t start, uint64_t length, std::string control_device)
: DmTarget(start, length), control_device_(control_device) {}
std::string name() const override { return "user"; }
std::string control_device() const { return control_device_; }
std::string GetParameterString() const override;
private:
std::string control_device_;
};
} // namespace dm

View File

@ -177,7 +177,12 @@ class TargetParser final {
return std::make_unique<DmTargetSnapshot>(start_sector, num_sectors, base_device,
cow_device, mode, chunk_size);
} else if (target_type == "user") {
return std::make_unique<DmTargetUser>(start_sector, num_sectors);
if (!HasArgs(1)) {
std::cerr << "Expected \"user\" <control_device_name>" << std::endl;
return nullptr;
}
std::string control_device = NextArg();
return std::make_unique<DmTargetUser>(start_sector, num_sectors, control_device);
} else {
std::cerr << "Unrecognized target type: " << target_type << std::endl;
return nullptr;