| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "cryptohome/storage/encrypted_container/logical_volume_backing_device.h" |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include <base/files/file_path.h> |
| #include <base/values.h> |
| #include <base/strings/string_number_conversions.h> |
| #include <brillo/blkdev_utils/lvm.h> |
| #include <brillo/blkdev_utils/lvm_device.h> |
| |
| #include "cryptohome/storage/encrypted_container/backing_device.h" |
| |
| namespace cryptohome { |
| |
| LogicalVolumeBackingDevice::LogicalVolumeBackingDevice( |
| const BackingDeviceConfig& config, |
| std::unique_ptr<brillo::LogicalVolumeManager> lvm) |
| : name_(config.name), |
| size_(config.size), |
| physical_volume_(config.logical_volume.physical_volume), |
| thinpool_name_(config.logical_volume.thinpool_name), |
| lvm_(std::move(lvm)) {} |
| |
| LogicalVolumeBackingDevice::LogicalVolumeBackingDevice( |
| const BackingDeviceConfig& config) |
| : LogicalVolumeBackingDevice( |
| config, std::make_unique<brillo::LogicalVolumeManager>()) {} |
| |
| base::Optional<brillo::LogicalVolume> |
| LogicalVolumeBackingDevice::GetLogicalVolume() { |
| base::Optional<brillo::PhysicalVolume> pv = |
| lvm_->GetPhysicalVolume(physical_volume_); |
| |
| if (!pv || !pv->IsValid()) { |
| return base::nullopt; |
| } |
| |
| base::Optional<brillo::VolumeGroup> vg = lvm_->GetVolumeGroup(*pv); |
| |
| if (!vg || !vg->IsValid()) { |
| return base::nullopt; |
| } |
| |
| return lvm_->GetLogicalVolume(*vg, name_); |
| } |
| |
| bool LogicalVolumeBackingDevice::Purge() { |
| base::Optional<brillo::LogicalVolume> lv = GetLogicalVolume(); |
| |
| if (lv && lv->IsValid()) { |
| return lv->Remove(); |
| } |
| |
| return false; |
| } |
| |
| bool LogicalVolumeBackingDevice::Create() { |
| base::Optional<brillo::PhysicalVolume> pv = |
| lvm_->GetPhysicalVolume(physical_volume_); |
| |
| if (!pv || !pv->IsValid()) { |
| return false; |
| } |
| |
| base::Optional<brillo::VolumeGroup> vg = lvm_->GetVolumeGroup(*pv); |
| |
| if (!vg || !vg->IsValid()) { |
| return false; |
| } |
| |
| base::Optional<brillo::Thinpool> thinpool = |
| lvm_->GetThinpool(*vg, thinpool_name_); |
| if (!thinpool || !thinpool->IsValid()) { |
| return false; |
| } |
| |
| base::DictionaryValue lv_config; |
| lv_config.SetString("name", name_); |
| lv_config.SetString("size", base::NumberToString(size_)); |
| |
| base::Optional<brillo::LogicalVolume> lv = |
| lvm_->CreateLogicalVolume(*vg, *thinpool, lv_config); |
| if (!lv || !lv->IsValid()) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| bool LogicalVolumeBackingDevice::Setup() { |
| base::Optional<brillo::LogicalVolume> lv = GetLogicalVolume(); |
| |
| if (!lv || !lv->IsValid()) { |
| LOG(ERROR) << "Failed to set up logical volume."; |
| return false; |
| } |
| |
| return lv->Activate(); |
| } |
| |
| bool LogicalVolumeBackingDevice::Teardown() { |
| base::Optional<brillo::LogicalVolume> lv = GetLogicalVolume(); |
| |
| if (!lv || !lv->IsValid()) { |
| LOG(ERROR) << "Invalid logical volume"; |
| return false; |
| } |
| |
| return lv->Deactivate(); |
| } |
| |
| base::Optional<base::FilePath> LogicalVolumeBackingDevice::GetPath() { |
| base::Optional<brillo::LogicalVolume> lv = GetLogicalVolume(); |
| |
| if (!lv || !lv->IsValid()) { |
| LOG(ERROR) << "Invalid logical volume"; |
| return base::nullopt; |
| } |
| |
| return lv->GetPath(); |
| } |
| |
| } // namespace cryptohome |