erofs_component/
volume.rs1use 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
14pub struct ErofsVolume {
16 fs: ErofsFilesystem,
18 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 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 pub fn fs(&self) -> &ErofsFilesystem {
48 &self.fs
49 }
50
51 pub fn pager(&self) -> &ErofsPager {
53 &self.pager
54 }
55}