// 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_
