// Copyright 2019 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

#ifdef __Fuchsia__
#include "vnode-allocation.h"
#endif

#include <fbl/algorithm.h>
#include <fbl/ref_ptr.h>
#include <fbl/unique_ptr.h>
#include <fs/block-txn.h>
#include <fs/trace.h>
#include <fs/vnode.h>
#include <lib/zircon-internal/fnv1hash.h>
#include <minfs/format.h>
#include <minfs/minfs.h>
#include <minfs/superblock.h>
#include <minfs/transaction-limits.h>
#include <minfs/writeback.h>

#include "vnode.h"

namespace minfs {

// A specialization of the Minfs Vnode which implements a regular file interface.
class File final : public VnodeMinfs,
                   public fbl::Recyclable<File> {
public:
    File(Minfs* fs);
    ~File();

    // fbl::Recyclable interface.
    void fbl_recycle() final {
        VnodeMinfs::fbl_recycle();
    }

private:
    bool IsDirectory() const final { return false; }
    zx_status_t CanUnlink() const final;

    // minfs::Vnode interface.
    blk_t GetBlockCount() const final;
    uint64_t GetSize() const final;
    void SetSize(uint32_t new_size) final;
    void AcquireWritableBlock(Transaction* transaction, blk_t local_bno,
                              blk_t old_bno, blk_t* out_bno) final;
    void DeleteBlock(Transaction* transaction, blk_t local_bno, blk_t old_bno) final;
#ifdef __Fuchsia__
    void IssueWriteback(Transaction* transaction, blk_t vmo_offset, blk_t dev_offset,
                        blk_t count) final;
    bool HasPendingAllocation(blk_t vmo_offset) final;
    void CancelPendingWriteback() final;
#endif

    // fs::Vnode interface.
    zx_status_t ValidateFlags(uint32_t flags) final;
    zx_status_t Read(void* data, size_t len, size_t off, size_t* out_actual) final;
    zx_status_t Write(const void* data, size_t len, size_t offset,
                      size_t* out_actual) final;
    zx_status_t Append(const void* data, size_t len, size_t* out_end,
                       size_t* out_actual) final;
    zx_status_t Truncate(size_t len) final;

#ifdef __Fuchsia__
    // Allocate all data blocks pending in |allocation_state_|.
    void AllocateData();

    // For all data blocks in the range |start| to |start + count|, reserve specific blocks in
    // the allocator to be swapped in at the time the old blocks are swapped out. Metadata blocks
    // are expected to have been allocated previously.
    zx_status_t BlocksSwap(Transaction* state, blk_t start, blk_t count, blk_t* bno);

    // Describes pending allocation data for the vnode. This should only be accessed while a valid
    // Transaction object is held, as it may be modified asynchronously by the DataBlockAssigner
    // thread.
    PendingAllocationData allocation_state_;
#endif
};

} // namespace minfs
