| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_STORAGE_VOLUME_IMAGE_FVM_FVM_DESCRIPTOR_H_ |
| #define SRC_STORAGE_VOLUME_IMAGE_FVM_FVM_DESCRIPTOR_H_ |
| |
| #include <lib/fit/result.h> |
| |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "src/storage/fvm/fvm.h" |
| #include "src/storage/volume_image/fvm/options.h" |
| #include "src/storage/volume_image/options.h" |
| #include "src/storage/volume_image/partition.h" |
| |
| namespace storage::volume_image { |
| namespace internal { |
| |
| // Creates an FVM header for the given options. |
| fvm::Header MakeHeader(const FvmOptions& options, uint64_t slice_count); |
| |
| } // namespace internal |
| |
| // A FVM descriptor represents a collection of partitions and constraints that should eventually be |
| // converted into an image. |
| class FvmDescriptor { |
| public: |
| // This class provides the mechanism for generating a valid FVM descriptor, so that constraints |
| // can be verified. |
| class Builder { |
| public: |
| Builder() = default; |
| explicit Builder(FvmDescriptor descriptor); |
| Builder(const Builder&) = delete; |
| Builder(Builder&&) = default; |
| Builder& operator=(const Builder&) = delete; |
| Builder& operator=(Builder&&) = default; |
| ~Builder() = default; |
| |
| // Adds partition to the image to be constructed. |
| Builder& AddPartition(Partition partition); |
| |
| // Sets the options for the image to be constructed. |
| Builder& SetOptions(const FvmOptions& options); |
| |
| // Verifies that constraints are met and returns an FvmDescriptor containing the data. |
| // |
| // This method will always consume all added partitions. On success the ownership is taken by |
| // the returned descriptor, and on error the partitions are destroyed. |
| fit::result<FvmDescriptor, std::string> Build(); |
| |
| private: |
| std::vector<Partition> partitions_; |
| std::optional<FvmOptions> options_; |
| uint64_t accumulated_slices_ = 0; |
| uint64_t metadata_allocated_size_ = 0; |
| }; |
| |
| FvmDescriptor() = default; |
| FvmDescriptor(const FvmDescriptor&) = delete; |
| FvmDescriptor(FvmDescriptor&&) = default; |
| FvmDescriptor& operator=(const FvmDescriptor&) = delete; |
| FvmDescriptor& operator=(FvmDescriptor&&) = default; |
| ~FvmDescriptor() = default; |
| |
| // Returns the partitions that belong to this fvm descriptor. |
| const std::set<Partition, Partition::LessThan>& partitions() const { return partitions_; } |
| |
| // Returns the options of this descriptor. |
| const FvmOptions& options() const { return options_; } |
| |
| // Returns the amount of slices required for the partitions of this descriptor, |
| // once a volume is formatted with it. |
| uint64_t slice_count() const { return slice_count_; } |
| |
| // Returns the amount of bytes required for this descriptor to format a volume. This accounts for |
| // both copies of the FVM metadata. |
| uint64_t metadata_required_size() const { return metadata_required_size_; } |
| |
| private: |
| // Set of partitions that belong to the fvm. |
| std::set<Partition, Partition::LessThan> partitions_; |
| |
| // Options used to construct and validate this descriptor. |
| FvmOptions options_; |
| |
| // Number of slices required for this fvm descriptor. |
| uint64_t slice_count_ = 0; |
| |
| // Size in bytes of the metadata required to generate this image. This accounts for both copies of |
| // the FVM metadata. |
| uint64_t metadata_required_size_ = 0; |
| }; |
| |
| } // namespace storage::volume_image |
| |
| #endif // SRC_STORAGE_VOLUME_IMAGE_FVM_FVM_DESCRIPTOR_H_ |