blob: 61c21a849dba88e89e2d28b09886ebeddcc6e5f5 [file] [log] [blame]
// Copyright 2018 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.
library fuchsia.hardware.block.volume;
using zx;
/// VolumeManagerInfo describes the properties of the volume manager and not each individual volume.
@for_deprecated_c_bindings
type VolumeManagerInfo = struct {
/// Size of a single slice, in bytes.
slice_size uint64;
/// Number of slices the volume manager is able use right now. This counts the
/// allocated_slice_count plus the number of available slices.
slice_count uint64;
/// Number of slices currently assigned to partitions.
assigned_slice_count uint64;
/// The maximum capacity which the Volume Manager could grow to utilize if the partition
/// containing the Volume Manager itself expands (i.e., the Volume Manager is initialized on a
/// GPT partition that has extended beyond the originally allocated capacity). This value is
/// the number of entries reserved in the volume manager header and is not related to the size
/// of the physical device (which may be larger or smaller).
maximum_slice_count uint64;
/// Largest value that can be used for a virtual slice number.
max_virtual_slice uint64;
};
@for_deprecated_c_bindings
type VolumeInfo = struct {
/// Number of slices allocated to the volume.
partition_slice_count uint64;
/// Limit on the maximum slices assigned to this partition, if there is one. If the size of the
/// partition is not limited, this value will be 0. Partitions can grow into free slices
/// available in the volume manager as long as their slices are less than or equal to this
/// value.
///
/// See `VolumeManager.GetPartitionLimit()`
slice_limit uint64;
};
/// Describes an region within a Volume. Both units are in "slices".
type SliceExtent = struct {
offset uint64;
length uint64;
};
const MAX_SLICE_QUERY_REQUESTS uint32 = 16;
/// Information about an extent of virtual slices.
type SliceRegion = struct {
/// True if the virtual slices are allocated, false otherwise.
allocated bool;
/// The number of contiguous virtual slices.
count uint64;
};
@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol BlockVolume {
/// Attempts to extend a virtual partition.
Extend(struct {
extent SliceExtent;
}) -> (struct {
status zx.status;
});
/// Shrinks a virtual Partition.
Shrink(struct {
extent SliceExtent;
}) -> (struct {
status zx.status;
});
// Returns the information about the volume manager
GetInfo() -> (struct {
status zx.status;
manager VolumeManagerInfo;
volume VolumeInfo;
});
/// Returns the number of contiguous slices from a collection
/// of start offsets.
QuerySlices(struct {
start vector<uint64>:MAX_SLICE_QUERY_REQUESTS;
}) -> (struct {
status zx.status;
responses vector<SliceRegion>:MAX_SLICE_QUERY_REQUESTS;
});
/// Destroys the current partition, removing it from the Volume Manager, and
/// freeing all underlying storage.
Destroy() -> (struct {
status zx.status;
});
};