Skip to main content

erofs_component/
volume.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::directory::ErofsDirectory;
6use crate::pager::ErofsPager;
7use anyhow::Context as _;
8use erofs::ErofsFilesystem;
9use erofs::readers::VmoReader;
10use fidl_fuchsia_io as fio;
11use std::sync::Arc;
12use vfs::execution_scope::ExecutionScope;
13
14/// Holds the volume-level state for an active EROFS instance.
15pub struct ErofsVolume {
16    /// The filesystem for this EROFS volume.
17    fs: ErofsFilesystem,
18    /// Reference to the unified pager.
19    pager: Arc<ErofsPager>,
20}
21
22impl ErofsVolume {
23    pub fn new(backing_vmo: zx::Vmo, pager: Arc<ErofsPager>) -> Result<Self, anyhow::Error> {
24        let reader =
25            Arc::new(VmoReader::new(Arc::new(backing_vmo)).context("Failed to create VmoReader")?);
26        let fs = ErofsFilesystem::new(reader).context("Failed to create ErofsFilesystem")?;
27        Ok(Self { fs, pager })
28    }
29
30    /// Sets up and serves an EROFS volume from a backing VMO.
31    pub fn serve(
32        backing_vmo: zx::Vmo,
33        pager: Arc<ErofsPager>,
34        flags: fio::Flags,
35        root: fidl::endpoints::ServerEnd<fio::DirectoryMarker>,
36    ) -> Result<(), anyhow::Error> {
37        let scope = ExecutionScope::new();
38        let volume = Arc::new(Self::new(backing_vmo, pager)?);
39        let root_node = volume.fs().root_node();
40        let root_dir = Arc::new(ErofsDirectory::new(volume, root_node));
41
42        vfs::directory::serve_on(root_dir, flags, scope, root);
43        Ok(())
44    }
45
46    /// Returns a reference to the filesystem.
47    pub fn fs(&self) -> &ErofsFilesystem {
48        &self.fs
49    }
50
51    /// Returns a reference to the pager.
52    pub fn pager(&self) -> &ErofsPager {
53        &self.pager
54    }
55}