blob: fec7394ab82e37eeb75e383f577e7e17ca7b6546 [file] [log] [blame]
// 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_FVM_FVM_H_
#define SRC_STORAGE_FVM_FVM_H_
#include <zircon/types.h>
#include <optional>
#include "src/storage/fvm/format.h"
namespace fvm {
// Update's the metadata's hash field to accurately reflect the contents of metadata.
void UpdateHash(void* metadata, size_t metadata_size);
// Validate the FVM header.
//
// TODO(jfsulliv): Remove this once all uses are ported to Metadata.
bool ValidateHeader(const void* metadata, size_t metadata_size);
// Validate the FVM header information, and identify which copy of metadata (primary or backup)
// should be used for initial reading, if either.
//
// The two copies of the metadata block from the beginning of the device is passed in, along with
// their length (they should be the same size). These blocks should include both primary and
// secondary copies of the metadata.
//
// The disk_size and disk_block_size are passed in to sanity check that the header values are
// compatible with the current underlying device. See fvm::Header::IsValid() for more. The variant
// that omits these does not validate the header matches these values.
//
// On success, the superblock type which is valid is returned. If both copies are invalid, a null
// optional is returned.
//
// TODO(jfsulliv): Stop exposing this as a separate function once all code uses the Metadata class.
std::optional<SuperblockType> PickValidHeader(const void* primary_metadata,
const void* secondary_metadata, size_t metadata_size);
std::optional<SuperblockType> PickValidHeader(uint64_t disk_size, uint64_t disk_block_size,
const void* primary_metadata,
const void* secondary_metadata, size_t metadata_size);
} // namespace fvm
#endif // SRC_STORAGE_FVM_FVM_H_