diff options
author | Florian Klink <flokli@flokli.de> | 2024-04-15T12·03+0300 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2024-04-15T13·59+0000 |
commit | bccb4c92c357202e8be0f37345c0a933bd9c2cc0 (patch) | |
tree | 20a40d17203c8e9807da62b348b5ee4bb076cf9b /tvix/castore/src/fs/inodes.rs | |
parent | 50065afd36e9dbe685fada65a0c65a520918ec1d (diff) |
refactor(tvix/castore/fs): add InodeData::as_fuse_{entry,file_attr} r/7921
Remove the now unused gen_file_attr (which had a wrong docstring). Change-Id: Ie86b14d1ad798e6233bc44c43ace3f8b95c67ea9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11430 Tested-by: BuildkiteCI Autosubmit: flokli <flokli@flokli.de> Reviewed-by: Connor Brewster <cbrewster@hey.com>
Diffstat (limited to 'tvix/castore/src/fs/inodes.rs')
-rw-r--r-- | tvix/castore/src/fs/inodes.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tvix/castore/src/fs/inodes.rs b/tvix/castore/src/fs/inodes.rs index 9131b703bae0..69a75acb6b0d 100644 --- a/tvix/castore/src/fs/inodes.rs +++ b/tvix/castore/src/fs/inodes.rs @@ -1,5 +1,7 @@ //! This module contains all the data structures used to track information //! about inodes, which present tvix-castore nodes in a filesystem. +use std::time::Duration; + use crate::proto as castorepb; use crate::B3Digest; @@ -10,6 +12,41 @@ pub enum InodeData { Directory(DirectoryInodeData), // either [DirectoryInodeData:Sparse] or [DirectoryInodeData:Populated] } +impl InodeData { + pub fn as_fuse_file_attr(&self, inode: u64) -> fuse_backend_rs::abi::fuse_abi::Attr { + fuse_backend_rs::abi::fuse_abi::Attr { + ino: inode, + // FUTUREWORK: play with this numbers, as it affects read sizes for client applications. + blocks: 1024, + size: match self { + InodeData::Regular(_, size, _) => *size, + InodeData::Symlink(target) => target.len() as u64, + InodeData::Directory(DirectoryInodeData::Sparse(_, size)) => *size, + InodeData::Directory(DirectoryInodeData::Populated(_, ref children)) => { + children.len() as u64 + } + }, + mode: match self { + InodeData::Regular(_, _, false) => libc::S_IFREG | 0o444, // no-executable files + InodeData::Regular(_, _, true) => libc::S_IFREG | 0o555, // executable files + InodeData::Symlink(_) => libc::S_IFLNK | 0o444, + InodeData::Directory(_) => libc::S_IFDIR | 0o555, + }, + ..Default::default() + } + } + + pub fn as_fuse_entry(&self, inode: u64) -> fuse_backend_rs::api::filesystem::Entry { + fuse_backend_rs::api::filesystem::Entry { + inode, + attr: self.as_fuse_file_attr(inode).into(), + attr_timeout: Duration::MAX, + entry_timeout: Duration::MAX, + ..Default::default() + } + } +} + /// This encodes the two different states of [InodeData::Directory]. /// Either the data still is sparse (we only saw a [castorepb::DirectoryNode], /// but didn't fetch the [castorepb::Directory] struct yet, or we processed a |