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
14const EROFS_INFO_NAME_FIDL: [i8; 32] = [
17 0x65, 0x72, 0x6f, 0x66, 0x73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18 0, 0, 0, 0, 0,
19];
20
21pub struct ErofsVolume {
23 fs: ErofsFilesystem,
25 pager: Arc<ErofsPager>,
27 fs_id: u64,
29}
30
31impl ErofsVolume {
32 pub fn new(backing_vmo: zx::Vmo, pager: Arc<ErofsPager>) -> Result<Self, anyhow::Error> {
33 let fs_id = zx::Event::create().koid().context("Failed to get event koid")?.raw_koid();
34 let reader =
35 Arc::new(VmoReader::new(Arc::new(backing_vmo)).context("Failed to create VmoReader")?);
36 let fs = ErofsFilesystem::new(reader).context("Failed to create ErofsFilesystem")?;
37 Ok(Self { fs, pager, fs_id })
38 }
39
40 pub fn serve(
42 backing_vmo: zx::Vmo,
43 pager: Arc<ErofsPager>,
44 flags: fio::Flags,
45 root: fidl::endpoints::ServerEnd<fio::DirectoryMarker>,
46 ) -> Result<(), anyhow::Error> {
47 storage_trace::duration!("storage", "ErofsVolume::serve");
48 let scope = ExecutionScope::new();
49 let volume = Arc::new(Self::new(backing_vmo, pager)?);
50 let root_node = volume.fs().root_node();
51 let root_dir = Arc::new(ErofsDirectory::new(volume, root_node));
52
53 vfs::directory::serve_on(root_dir, flags, scope, root);
54 Ok(())
55 }
56
57 pub fn fs(&self) -> &ErofsFilesystem {
59 &self.fs
60 }
61
62 pub fn pager(&self) -> &ErofsPager {
64 &self.pager
65 }
66
67 pub fn query_filesystem(&self) -> Result<fio::FilesystemInfo, zx::Status> {
68 let total_bytes = self.fs.total_bytes();
69 let total_inodes = self.fs.total_inodes();
70 let block_size = self.fs.block_size() as u32;
71
72 Ok(fio::FilesystemInfo {
73 total_bytes,
74 used_bytes: total_bytes,
75 total_nodes: total_inodes,
76 used_nodes: total_inodes,
77 free_shared_pool_bytes: 0,
78 fs_id: self.fs_id,
79 block_size,
80 max_filename_size: 255,
81 fs_type: fidl_fuchsia_fs::VfsType::Erofs.into_primitive(),
82 padding: 0,
83 name: EROFS_INFO_NAME_FIDL,
84 })
85 }
86}