blob: 137bd727386dd69f104597ada5364920a93e67da [file] [log] [blame]
// Copyright 2021 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.
// This file contains the data types representing structured data which filesystems must expose.
#ifndef SRC_STORAGE_LIB_VFS_CPP_INSPECT_INSPECT_DATA_H_
#define SRC_STORAGE_LIB_VFS_CPP_INSPECT_INSPECT_DATA_H_
#ifndef __Fuchsia__
#error "Fuchsia-only header"
#endif
#include <lib/inspect/cpp/inspect.h>
#include <lib/zx/result.h>
#include <cstdint>
#include <optional>
#include <string>
#include "src/storage/lib/block_client/cpp/block_device.h"
namespace fs_inspect {
// fs.info properties
struct InfoData {
uint64_t id;
uint64_t type;
std::string name;
uint64_t version_major;
uint64_t version_minor;
uint64_t block_size;
uint64_t max_filename_length;
std::optional<std::string> oldest_version = std::nullopt;
// Create an oldest_version string from integral version identifiers. Due to data collection
// limitations, oldest_version must be stored as a string.
static std::string OldestVersion(uint32_t oldest_major, uint32_t oldest_minor);
// Inspect Property Names
static constexpr char kPropId[] = "id";
static constexpr char kPropType[] = "type";
static constexpr char kPropName[] = "name";
static constexpr char kPropVersionMajor[] = "version_major";
static constexpr char kPropVersionMinor[] = "version_minor";
static constexpr char kPropBlockSize[] = "block_size";
static constexpr char kPropMaxFilenameLength[] = "max_filename_length";
static constexpr char kPropOldestVersion[] = "oldest_version";
};
// fs.usage properties
struct UsageData {
uint64_t total_bytes;
uint64_t used_bytes;
uint64_t total_nodes;
uint64_t used_nodes;
// Inspect Property Names
static constexpr char kPropTotalBytes[] = "total_bytes";
static constexpr char kPropUsedBytes[] = "used_bytes";
static constexpr char kPropTotalNodes[] = "total_nodes";
static constexpr char kPropUsedNodes[] = "used_nodes";
};
// fs.fvm properties (supported only for FVM-enabled filesystems)
struct FvmData {
struct SizeInfo {
// Current size of the volume that FVM has allocated for the filesystem.
uint64_t size_bytes;
// Size limit set on the volume, if any. If unset, value will be 0.
uint64_t size_limit_bytes;
// Amount of space the volume can be extended by. Based on the volume byte limit, if set,
// otherwise the maximum amount of available slices.
uint64_t available_space_bytes;
} size_info;
// Amount of times extending the volume failed when more space was required.
uint64_t out_of_space_events;
// Helper function to create a `SizeInfo` using the Fvm protocol from a block device.
static zx::result<SizeInfo> GetSizeInfoFromDevice(const block_client::BlockDevice& device);
// Inspect Property Names
static constexpr char kPropSizeBytes[] = "size_bytes";
static constexpr char kPropSizeLimitBytes[] = "size_limit_bytes";
static constexpr char kPropAvailableSpaceBytes[] = "available_space_bytes";
static constexpr char kPropOutOfSpaceEvents[] = "out_of_space_events";
};
// fs.volumes/{name} properties (supported only for multi-volume filesystems)
struct VolumeData {
uint64_t used_bytes;
std::optional<uint64_t> bytes_limit;
uint64_t used_nodes;
bool encrypted;
// Inspect Property Names
static constexpr char kPropVolumeUsedBytes[] = "used_bytes";
static constexpr char kPropVolumeBytesLimit[] = "bytes_limit";
static constexpr char kPropVolumeUsedNodes[] = "used_nodes";
static constexpr char kPropVolumeEncrypted[] = "encrypted";
};
namespace detail {
// Attach the values from the given InfoData object as properties to the inspector's root node.
void Attach(inspect::Inspector& insp, const InfoData& info);
// Attach the values from the given UsageData object as properties to the inspector's root node.
void Attach(inspect::Inspector& insp, const UsageData& usage);
// Attach the values from the given FvmData object as properties to the inspector's root node.
void Attach(inspect::Inspector& insp, const FvmData& volume);
} // namespace detail
} // namespace fs_inspect
#endif // SRC_STORAGE_LIB_VFS_CPP_INSPECT_INSPECT_DATA_H_