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

#ifndef __Fuchsia__
#error Fuchsia-only Header
#endif

#include <utility>

#include <blobfs/transaction-manager.h>
#include <blobfs/operation.h>
#include <blobfs/unbuffered-operations-builder.h>
#include <blobfs/writeback-work.h>
#include <fbl/ref_ptr.h>
#include <lib/zx/vmo.h>

namespace blobfs {

// An object compatible with the WritebackWork interface, which contains a single blob reference.
// When the writeback is completed, this reference will go out of scope.
//
// This class helps WritebackWork avoid concurrent writes and reads to blobs: if a BlobWork
// is alive, the impacted Blob is still alive.
class BlobWork : public WritebackWork {
public:
    BlobWork(TransactionManager* transaction_manager, fbl::RefPtr<Blob> vnode)
        : WritebackWork(transaction_manager), vnode_(std::move(vnode)) {}

private:
    fbl::RefPtr<Blob> vnode_;
};

// A wrapper around "Enqueue" for content which risks being larger
// than the writeback buffer.
//
// For content which is smaller than 3/4 the size of the writeback buffer: the
// content is enqueued to |work| without flushing.
//
// For content which is larger than 3/4 the size of the writeback buffer: flush
// the data by enqueueing it to the writeback thread in chunks until the
// remainder is small enough to comfortably fit within the writeback buffer.
zx_status_t EnqueuePaginated(std::unique_ptr<WritebackWork>* work,
                             TransactionManager* transaction_manager, Blob* vn,
                             const zx::vmo& vmo, uint64_t relative_block, uint64_t absolute_block,
                             uint64_t nblocks);

// Flushes |operations| to persistent storage using a transaction created by |transaction_manager|,
// sending through the disk-registered |vmoid| object.
zx_status_t FlushWriteRequests(TransactionManager* transaction_manager,
                               const fbl::Vector<BufferedOperation>& operations);

} // namespace blobfs
