LoGin 6b4e7a2972
增加kernfs (#386)
* 增加kernfs

* kernfs文档
2023-09-19 19:46:59 +08:00

74 lines
1.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use crate::{
filesystem::{sysfs::SysFSKernPrivateData, vfs::PollStatus},
libs::spinlock::SpinLockGuard,
syscall::SystemError,
};
use alloc::sync::Arc;
use core::fmt::Debug;
use super::KernFSInode;
/// KernFS文件的回调接口
///
/// 当用户态程序打开、读取、写入、关闭文件时kernfs会调用相应的回调函数。
pub trait KernFSCallback: Send + Sync + Debug {
fn open(&self, data: KernCallbackData) -> Result<(), SystemError>;
fn read(
&self,
data: KernCallbackData,
buf: &mut [u8],
offset: usize,
) -> Result<usize, SystemError>;
fn write(
&self,
data: KernCallbackData,
buf: &[u8],
offset: usize,
) -> Result<usize, SystemError>;
fn poll(&self, data: KernCallbackData) -> Result<PollStatus, SystemError>;
}
/// KernFS文件的回调数据
#[derive(Debug)]
pub struct KernCallbackData<'a> {
kern_inode: Arc<KernFSInode>,
private_data: SpinLockGuard<'a, Option<KernInodePrivateData>>,
}
#[allow(dead_code)]
impl<'a> KernCallbackData<'a> {
pub fn new(
kern_inode: Arc<KernFSInode>,
private_data: SpinLockGuard<'a, Option<KernInodePrivateData>>,
) -> Self {
Self {
kern_inode,
private_data,
}
}
#[inline(always)]
pub fn kern_inode(&self) -> &Arc<KernFSInode> {
return &self.kern_inode;
}
#[inline(always)]
pub fn private_data(&self) -> &Option<KernInodePrivateData> {
return &self.private_data;
}
#[inline(always)]
pub fn private_data_mut(&mut self) -> &mut Option<KernInodePrivateData> {
return &mut self.private_data;
}
}
#[allow(dead_code)]
#[derive(Debug)]
pub enum KernInodePrivateData {
SysFS(SysFSKernPrivateData),
}