FileSystem

Struct FileSystem 

Source
pub struct FileSystem {
    pub kernel: Weak<Kernel>,
    pub options: FileSystemOptions,
    pub dev_id: DeviceType,
    pub rename_mutex: Mutex<()>,
    pub security_state: FileSystemState,
    /* private fields */
}
Expand description

A file system that can be mounted in a namespace.

Fields§

§kernel: Weak<Kernel>§options: FileSystemOptions

The options specified when mounting the filesystem. Saved here for display in /proc/[pid]/mountinfo.

§dev_id: DeviceType

The device ID of this filesystem. Returned in the st_dev field when stating an inode in this filesystem.

§rename_mutex: Mutex<()>

A file-system global mutex to serialize rename operations.

This mutex is useful because the invariants enforced during a rename operation involve many DirEntry objects. In the future, we might be able to remove this mutex, but we will need to think carefully about how rename operations can interleave.

See DirEntry::rename.

§security_state: FileSystemState

Holds security state for this file system, which is created and used by the Linux Security Modules subsystem hooks.

Implementations§

Source§

impl FileSystem

Source

pub fn new<L>( locked: &mut Locked<L>, kernel: &Kernel, cache_mode: CacheMode, ops: impl FileSystemOps, options: FileSystemOptions, ) -> Result<FileSystemHandle, Errno>

Create a new filesystem.

Source

pub fn has_permanent_entries(&self) -> bool

Source

pub fn root(&self) -> &DirEntryHandle

The root directory entry of this file system.

Panics if this file system does not have a root directory.

Source

pub fn maybe_root(&self) -> Option<&DirEntryHandle>

The root directory entry of this FileSystem, if it has one.

Source

pub fn get_or_create_node<F>( &self, node_key: ino_t, create_fn: F, ) -> Result<FsNodeHandle, Errno>
where F: FnOnce() -> Result<FsNodeHandle, Errno>,

Source

pub fn get_and_validate_or_create_node<V, C>( &self, node_key: ino_t, validate_fn: V, create_fn: C, ) -> Result<FsNodeHandle, Errno>

Get a node that is validated with the callback, or create an FsNode for this file system.

If node_id is Some, then this function checks the node cache to determine whether this node is already open. If so, the function returns the existing FsNode if it passes the validation check. If no node exists, or a node does but fails the validation check, the function calls the given create_fn function to create the FsNode.

If node_id is None, then this function assigns a new identifier number and calls the given create_fn function to create the FsNode with the assigned number.

Returns Err only if create_fn returns Err.

Source

pub fn create_node( self: &Arc<Self>, ino: ino_t, ops: impl Into<Box<dyn FsNodeOps>>, info: FsNodeInfo, ) -> FsNodeHandle

File systems that produce their own IDs for nodes should invoke this function. The ones who leave to this object to assign the IDs should call |create_node_and_allocate_node_id|.

Source

pub fn create_node_and_allocate_node_id( self: &Arc<Self>, ops: impl Into<Box<dyn FsNodeOps>>, info: FsNodeInfo, ) -> FsNodeHandle

Source

pub fn create_detached_node( self: &Arc<Self>, ino: ino_t, ops: impl Into<Box<dyn FsNodeOps>>, info: FsNodeInfo, ) -> FsNodeHandle

Create a node for a directory that has no parent.

Source

pub fn create_root( self: &Arc<Self>, ino: ino_t, ops: impl Into<Box<dyn FsNodeOps>>, )

Create a root node for the filesystem.

This is a convenience function that creates a root node with the default directory mode and root credentials.

Source

pub fn create_root_with_info( self: &Arc<Self>, ino: ino_t, ops: impl Into<Box<dyn FsNodeOps>>, info: FsNodeInfo, )

Source

pub fn remove_node(&self, node: &FsNode)

Remove the given FsNode from the node cache.

Called from the Release trait of FsNode.

Source

pub fn allocate_ino(&self) -> ino_t

Source

pub fn allocate_ino_range(&self, size: usize) -> Range<ino_t>

Allocate a contiguous block of node ids.

Source

pub fn rename<L>( &self, locked: &mut Locked<L>, current_task: &CurrentTask, old_parent: &FsNodeHandle, old_name: &FsStr, new_parent: &FsNodeHandle, new_name: &FsStr, renamed: &FsNodeHandle, replaced: Option<&FsNodeHandle>, ) -> Result<(), Errno>

Move |renamed| that is at |old_name| in |old_parent| to |new_name| in |new_parent| replacing |replaced|. If |replaced| exists and is a directory, this function must check that |renamed| is n directory and that |replaced| is empty.

Source

pub fn exchange( &self, current_task: &CurrentTask, node1: &FsNodeHandle, parent1: &FsNodeHandle, name1: &FsStr, node2: &FsNodeHandle, parent2: &FsNodeHandle, name2: &FsStr, ) -> Result<(), Errno>

Exchanges node1 and node2. Parent directory node and the corresponding names for the two exchanged nodes are passed as parent1, name1, parent2, name2.

Source

pub fn force_unmount_ops(&self)

Forces a FileSystem unmount.

Source

pub fn statfs<L>( &self, locked: &mut Locked<L>, current_task: &CurrentTask, ) -> Result<statfs, Errno>

Returns the statfs for this filesystem.

Each FileSystemOps impl is expected to override this to return the specific statfs for the filesystem.

Returns ENOSYS if the FileSystemOps don’t implement stat.

Source

pub fn did_create_dir_entry(&self, entry: &DirEntryHandle)

Source

pub fn will_destroy_dir_entry(&self, entry: &DirEntryHandle)

Source

pub fn did_access_dir_entry(&self, entry: &DirEntryHandle)

Informs the cache that the entry was used.

Source

pub fn purge_old_entries(&self)

Purges old entries from the cache. This is done as a separate step to avoid potential deadlocks that could occur if done at admission time (where locks might be held that are required when dropping old entries). This should be called after any new entries are admitted with no locks held that might be required for dropping entries.

Source

pub fn downcast_ops<T: 'static>(&self) -> Option<&T>

Returns the FileSystem’s FileSystemOps as a &T, or None if the downcast fails.

Source

pub fn name(&self) -> &'static FsStr

Source

pub fn manages_timestamps(&self) -> bool

Source

pub fn crypt_service(&self) -> Option<Arc<CryptService>>

Returns the crypt service associated with this filesystem, if any. The crypt service implements the fuchsia.fxfs.Crypt protocol and maintains an internal structure that maps each encryption key id to the actual key.

Trait Implementations§

Source§

impl Debug for FileSystem

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for FileSystem

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<'a> From<&'a FileSystem> for Auditable<'a>

Source§

fn from(value: &'a FileSystem) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn type_name(&self) -> &'static str

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T, D> Encode<Ambiguous1, D> for T
where D: ResourceDialect,

Source§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<T, D> Encode<Ambiguous2, D> for T
where D: ResourceDialect,

Source§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> InstanceFromServiceTransport<T> for T

§

fn from_service_transport(handle: T) -> T

Converts the given service transport handle of type T to [Self]
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> Into32<U> for T
where U: MultiArchFrom<T>,

Source§

fn into_32(self) -> U

Source§

impl<T, U> Into64<U> for T
where U: MultiArchFrom<T>,

Source§

fn into_64(self) -> U

Source§

impl<T> IntoAny for T
where T: 'static + Send + Sync,

Source§

fn into_any(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Cast the given object into a dyn std::any::Any.
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T, U> IntoExt<U> for T
where U: FromExt<T>,

§

fn into_ext(self) -> U

Performs the conversion.
Source§

impl<T, U> IntoFidl<U> for T
where U: FromFidl<T>,

Source§

fn into_fidl(self) -> U

Source§

impl<T, U> MultiArchFrom<T> for U
where U: From<T>,

Source§

fn from_64(value: T) -> U

Source§

fn from_32(value: T) -> U

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T, U> TryIntoExt<U> for T
where U: TryFromExt<T>,

§

type Error = <U as TryFromExt<T>>::Error

§

fn try_into_ext(self) -> Result<U, <T as TryIntoExt<U>>::Error>

Tries to perform the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<St> WithTag for St

§

fn tagged<T>(self, tag: T) -> Tagged<T, St>

Produce a new stream from this one which yields item tupled with a constant tag
Source§

impl<B, A> LockBefore<B> for A
where B: LockAfter<A>,

Source§

impl<B, A> LockEqualOrBefore<B> for A
where A: LockBefore<B>,

§

impl<E> RunsTransport<Mpsc> for E

§

impl<E> RunsTransport<Mpsc> for E
where E: RunsTransport<Mpsc>,