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

#pragma once

#include <fbl/macros.h>
#include <fbl/unique_ptr.h>
#include <fs/block-txn.h>

#ifdef __Fuchsia__
#include <lib/fzl/owned-vmo-mapper.h>
#include <lib/zx/vmo.h>
#endif

#include <minfs/format.h>
#include <minfs/fsck.h>
#include <minfs/block-txn.h>
#include <minfs/minfs.h>

namespace minfs {

// SuperblockManager contains all filesystem-global metadata.
//
// It also contains mechanisms for updating this information
// on persistent storage. Although these fields may be
// updated from multiple threads (and |Write| may be invoked
// to push a snapshot of the superblock to persistent storage),
// caution should be taken to avoid Writing a snapshot of the
// superblock to disk while another thread has only partially
// updated the superblock.
class SuperblockManager {
public:
    SuperblockManager() = delete;
    ~SuperblockManager();
    DISALLOW_COPY_ASSIGN_AND_MOVE(SuperblockManager);

    static zx_status_t Create(Bcache* bc, const Superblock* info,
                              fbl::unique_ptr<SuperblockManager>* out,
                              IntegrityCheck checks);

    const Superblock& Info() const {
#ifdef __Fuchsia__
        return *reinterpret_cast<const Superblock*>(mapping_.start());
#else
        return *reinterpret_cast<const Superblock*>(&info_blk_[0]);
#endif
    }

    // Acquire a pointer to the superblock, such that any
    // modifications will be carried out to persistent storage
    // the next time "Write" is invoked.
    Superblock* MutableInfo() {
#ifdef __Fuchsia__
        return reinterpret_cast<Superblock*>(mapping_.start());
#else
        return reinterpret_cast<Superblock*>(&info_blk_[0]);
#endif
    }

    // Write the superblock back to persistent storage.
    void Write(WriteTxn* txn);

private:
#ifdef __Fuchsia__
    SuperblockManager(const Superblock* info, fzl::OwnedVmoMapper mapper);
#else
    SuperblockManager(const Superblock* info);
#endif

#ifdef __Fuchsia__
    fzl::OwnedVmoMapper mapping_;
#else
    uint8_t info_blk_[kMinfsBlockSize];
#endif
};

} // namespace minfs
