blob: b62295e3962ff5f63610023eb9b1e91af855afa9 [file] [log] [blame]
// 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.
#include "disk_inspector/inspector_transaction_handler.h"
#include <fcntl.h>
#include <lib/fdio/fdio.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/assert.h>
#include <zircon/errors.h>
#include <block-client/cpp/remote-block-device.h>
#include <safemath/checked_math.h>
#include <storage/buffer/vmo_buffer.h>
namespace disk_inspector {
zx_status_t InspectorTransactionHandler::Create(std::unique_ptr<block_client::BlockDevice> device,
uint32_t block_size,
std::unique_ptr<InspectorTransactionHandler>* out) {
fuchsia_hardware_block_BlockInfo info;
zx_status_t status = device->BlockGetInfo(&info);
if (status != ZX_OK) {
FX_LOGS(ERROR) << "Cannot get block device information: " << status;
return status;
}
if (info.block_size == 0 || block_size % info.block_size != 0) {
FX_LOGS(ERROR) << "fs block size: " << block_size
<< " not multiple of underlying block size: " << info.block_size;
return ZX_ERR_NOT_SUPPORTED;
}
out->reset(new InspectorTransactionHandler(std::move(device), info, block_size));
return ZX_OK;
}
uint64_t InspectorTransactionHandler::BlockNumberToDevice(uint64_t block_num) const {
return block_num * FsBlockSize() / DeviceBlockSize();
}
zx_status_t InspectorTransactionHandler::BlockAttachVmo(const zx::vmo& vmo, storage::Vmoid* out) {
zx_status_t status = device_->BlockAttachVmo(vmo, out);
return status;
}
zx_status_t InspectorTransactionHandler::BlockDetachVmo(storage::Vmoid vmoid) {
return device_->BlockDetachVmo(std::move(vmoid));
}
} // namespace disk_inspector