blob: e353a428a509986db99001fadbe591816e66a903 [file] [log] [blame]
// Copyright 2017 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 FS_TRANSACTION_TRANSACTION_HANDLER_H_
#define FS_TRANSACTION_TRANSACTION_HANDLER_H_
#include <zircon/assert.h>
#include <zircon/device/block.h>
#include <vector>
#include <fbl/algorithm.h>
#include <fbl/macros.h>
#include <fbl/vector.h>
#include <storage/buffer/block_buffer.h>
#include <storage/operation/operation.h>
namespace fs {
// Access the "blkno"-th block within data.
// "blkno = 0" corresponds to the first block within data.
inline void* GetBlock(uint64_t block_size, const void* data, uint64_t blkno) {
ZX_ASSERT(block_size <= (blkno + 1) * block_size); // Avoid overflow
return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(data) +
static_cast<uintptr_t>(block_size * blkno));
}
// TransactionHandler defines the interface that must be fulfilled
// for an entity to issue transactions to the underlying device.
class TransactionHandler {
public:
virtual ~TransactionHandler() = default;
// Translates a filesystem-level block number to a block-device-level block number.
virtual uint64_t BlockNumberToDevice(uint64_t block_num) const = 0;
// A convenience method for running a single operation. |buffer| provides access to the memory
// buffer that is referenced by |operation|. The values inside |operation| are expected to be
// filesystem-level block numbers. This method blocks until the operation completes, so it is
// suitable for host-based reads and writes and for simple Fuchsia-based reads. Regular Fuchsia IO
// is expected to be issued using the RunRequests method. A default implementation is provided.
virtual zx_status_t RunOperation(const storage::Operation& operation,
storage::BlockBuffer* buffer);
// Runs the provided operations against the backing block device.
// The values inside |operations| are expected to be filesystem-level block numbers.
// This method blocks until the operation completes, but the implementation for Fuchsia forwards
// the requests to the underlying BlockDevice so it is expected that this interface will be
// upgraded to be fully asynchronous at some point.
// The caller should use a BufferedOperationsBuilder to construct the request.
virtual zx_status_t RunRequests(const std::vector<storage::BufferedOperation>& operations) = 0;
virtual zx_status_t Flush() { return ZX_ERR_NOT_SUPPORTED; }
};
} // namespace fs
#endif // FS_TRANSACTION_TRANSACTION_HANDLER_H_