blob: 3332d1d15e03585fd84a8458d69d74883a30753f [file] [log] [blame]
// Copyright 2024 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/blobfs/blob_reader.h"
#include <fidl/fuchsia.fxfs/cpp/wire.h>
#include <lib/async/dispatcher.h>
#include <lib/fidl/cpp/wire/channel.h>
#include <lib/zx/result.h>
#include <lib/zx/vmo.h>
#include <zircon/errors.h>
#include <zircon/types.h>
#include <utility>
#include <fbl/ref_ptr.h>
#include "src/storage/blobfs/blob.h"
#include "src/storage/blobfs/blobfs.h"
#include "src/storage/blobfs/cache_node.h"
#include "src/storage/blobfs/format.h"
#include "src/storage/lib/vfs/cpp/service.h"
namespace blobfs {
namespace {
zx::result<zx::vmo> GetVmoImpl(Blobfs& blobfs, const Digest& digest) {
fbl::RefPtr<CacheNode> cache_node;
if (zx_status_t status = blobfs.GetCache().Lookup(digest, &cache_node); status != ZX_OK) {
return zx::error(status);
}
auto blob = fbl::RefPtr<Blob>::Downcast(std::move(cache_node));
return blob->GetVmoForBlobReader();
}
} // namespace
BlobReader::BlobReader(Blobfs& blobfs)
: fs::Service([this](fidl::ServerEnd<fuchsia_fxfs::BlobReader> server_end) {
bindings_.AddBinding(blobfs_.dispatcher(), std::move(server_end), this,
fidl::kIgnoreBindingClosure);
return ZX_OK;
}),
blobfs_(blobfs) {}
void BlobReader::GetVmo(fuchsia_fxfs::wire::BlobReaderGetVmoRequest* request,
GetVmoCompleter::Sync& completer) {
Digest digest(request->blob_hash.data_);
zx::result<zx::vmo> result = GetVmoImpl(blobfs_, digest);
if (result.is_error()) {
completer.ReplyError(result.error_value());
} else {
completer.ReplySuccess(std::move(result).value());
}
}
} // namespace blobfs