blob: b332d4bea6cecd016683e6f699bed1fa172951e0 [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 <lib/ftl-mtd/ftl-volume-wrapper.h>
namespace ftl_mtd {
zx_status_t FtlVolumeWrapper::Init(std::unique_ptr<ftl::NdmDriver> driver) {
if (volume_->Init(std::move(driver)) != nullptr) {
return ZX_ERR_IO;
}
return ZX_OK;
}
bool FtlVolumeWrapper::OnVolumeAdded(uint32_t page_size, uint32_t num_pages) {
page_size_ = page_size;
num_pages_ = num_pages;
return true;
}
ssize_t FtlVolumeWrapper::Read(void* buffer, size_t count) {
if (page_ >= num_pages_) {
return 0;
}
if (count % page_size_ != 0) {
return ZX_ERR_INVALID_ARGS;
}
uint32_t page_count = static_cast<uint32_t>(count / page_size_);
zx_status_t status = volume_->Read(page_, page_count, buffer);
if (status != ZX_OK) {
return status;
}
page_ += page_count;
return count;
}
ssize_t FtlVolumeWrapper::Write(void* buffer, size_t count) {
if (page_ >= num_pages_) {
return 0;
}
if (count % page_size_ != 0) {
return ZX_ERR_INVALID_ARGS;
}
uint32_t page_count = static_cast<uint32_t>(count / page_size_);
zx_status_t status = volume_->Write(page_, page_count, buffer);
if (status != ZX_OK) {
return status;
}
page_ += page_count;
return count;
}
ssize_t FtlVolumeWrapper::Seek(off_t offset, int whence) {
if (offset % page_size_ != 0) {
return ZX_ERR_INVALID_ARGS;
}
off_t page_delta = static_cast<off_t>(offset / page_size_);
off_t page;
if (whence == SEEK_SET) {
page = page_delta;
} else if (whence == SEEK_END) {
page = static_cast<off_t>(num_pages_) - page_delta;
} else if (whence == SEEK_CUR) {
page = static_cast<off_t>(page_) + page_delta;
} else {
return ZX_ERR_INVALID_ARGS;
}
uint32_t page_u32 = static_cast<uint32_t>(page);
if (page != page_u32) {
return ZX_ERR_OUT_OF_RANGE;
}
page_ = page_u32;
return Tell();
}
ssize_t FtlVolumeWrapper::Size() {
return page_size_ * num_pages_;
}
ssize_t FtlVolumeWrapper::Tell() {
return page_size_ * page_;
}
zx_status_t FtlVolumeWrapper::Truncate(size_t size) {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t FtlVolumeWrapper::Sync() {
return volume_->Flush();
}
zx_status_t FtlVolumeWrapper::Format() {
return volume_->Format();
}
} // namespace ftl_mtd