blob: dc43d9718981e3c89c7fff6dd7dffa9193e5bfed [file] [log] [blame]
// Copyright 2020 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 "src/storage/testing/ram_disk.h"
#include <lib/fdio/directory.h>
#include <lib/syslog/cpp/macros.h>
#include <lib/zx/job.h>
#include <lib/zx/time.h>
#include <zircon/syscalls.h>
namespace storage {
zx::status<> WaitForRamctl(zx::duration time) {
auto status = zx::make_status(wait_for_device("/dev/sys/platform/00:00:2d/ramctl", time.get()));
if (status.is_error()) {
FX_LOGS(ERROR) << "Timed-out waiting for ramctl: " << status.status_string();
return status.take_error();
}
return zx::ok();
}
zx::status<RamDisk> RamDisk::Create(int block_size, uint64_t block_count,
const RamDisk::Options& options) {
auto status = WaitForRamctl();
if (status.is_error()) {
return status.take_error();
}
ramdisk_client_t* client;
if (options.type_guid) {
status = zx::make_status(ramdisk_create_with_guid(
block_size, block_count, options.type_guid->data(), options.type_guid->size(), &client));
} else {
status = zx::make_status(ramdisk_create(block_size, block_count, &client));
}
if (status.is_error()) {
FX_LOGS(ERROR) << "Could not create ramdisk for test: " << status.status_string();
return status.take_error();
}
return zx::ok(RamDisk(client));
}
zx::status<RamDisk> RamDisk::CreateWithVmo(zx::vmo vmo, uint64_t block_size) {
auto status = WaitForRamctl();
if (status.is_error()) {
return status.take_error();
}
ramdisk_client_t* client;
status =
zx::make_status(ramdisk_create_from_vmo_with_block_size(vmo.release(), block_size, &client));
if (status.is_error()) {
FX_LOGS(ERROR) << "Could not create ramdisk for test: " << status.status_string();
return status.take_error();
}
return zx::ok(RamDisk(client));
}
zx::status<zx::channel> RamDisk::channel() const {
zx::channel device, device_server;
zx_status_t status = zx::channel::create(0, &device, &device_server);
if (status != ZX_OK) {
return zx::error(status);
}
status = fdio_service_connect(path().c_str(), device_server.release());
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(device));
}
} // namespace storage