| // Copyright 2019 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_FSHOST_BLOCK_DEVICE_H_ |
| #define SRC_STORAGE_FSHOST_BLOCK_DEVICE_H_ |
| |
| #include <lib/zx/status.h> |
| #include <zircon/types.h> |
| |
| #include <memory> |
| #include <optional> |
| #include <string_view> |
| |
| #include <fbl/algorithm.h> |
| #include <fbl/string_buffer.h> |
| #include <fs-management/mount.h> |
| |
| #include "src/storage/fshost/block-device-interface.h" |
| #include "src/storage/fshost/config.h" |
| #include "src/storage/fshost/filesystem-mounter.h" |
| |
| namespace devmgr { |
| |
| // A concrete implementation of the block device interface. |
| // |
| // Used by fshost to attach either drivers or filesystems to |
| // incoming block devices. |
| class BlockDevice final : public BlockDeviceInterface { |
| public: |
| BlockDevice(FilesystemMounter* mounter, fbl::unique_fd fd, |
| const Config* device_config); |
| BlockDevice(const BlockDevice&) = delete; |
| BlockDevice& operator=(const BlockDevice&) = delete; |
| |
| disk_format_t GetFormat() final; |
| void SetFormat(disk_format_t format) final; |
| zx_status_t GetInfo(fuchsia_hardware_block_BlockInfo* out_info) const final; |
| const fuchsia_hardware_block_partition_GUID& GetInstanceGuid() const final; |
| const fuchsia_hardware_block_partition_GUID& GetTypeGuid() const final; |
| zx_status_t AttachDriver(const std::string_view& driver) final; |
| zx_status_t UnsealZxcrypt() final; |
| zx_status_t FormatZxcrypt() final; |
| bool ShouldCheckFilesystems() final; |
| zx_status_t CheckFilesystem() final; |
| zx_status_t FormatFilesystem() final; |
| zx_status_t MountFilesystem() final; |
| zx::status<std::string> VeritySeal() final; |
| zx_status_t OpenBlockVerityForVerifiedRead(std::string seal_hex) final; |
| bool ShouldAllowAuthoringFactory() final; |
| zx_status_t SetPartitionMaxSize(const std::string& fvm_path, uint64_t max_size) override; |
| |
| disk_format_t content_format() const final; |
| const std::string& topological_path() const final { return topological_path_; } |
| const std::string& partition_name() const final; |
| |
| private: |
| FilesystemMounter* mounter_ = nullptr; |
| fbl::unique_fd fd_; |
| const Config* device_config_; |
| mutable std::optional<fuchsia_hardware_block_BlockInfo> info_ = {}; |
| mutable std::optional<disk_format_t> content_format_; |
| disk_format_t format_ = DISK_FORMAT_UNKNOWN; |
| std::string topological_path_; |
| mutable std::string partition_name_; |
| mutable std::optional<fuchsia_hardware_block_partition_GUID> instance_guid_; |
| mutable std::optional<fuchsia_hardware_block_partition_GUID> type_guid_; |
| }; |
| |
| } // namespace devmgr |
| |
| #endif // SRC_STORAGE_FSHOST_BLOCK_DEVICE_H_ |