xref: /DragonOS/kernel/src/filesystem/kernfs/callback.rs (revision 1074eb34e784aa2adfc5b9e0d89fa4b7e6ea03ef)
16b4e7a29SLoGin use crate::{
26b4e7a29SLoGin     filesystem::{sysfs::SysFSKernPrivateData, vfs::PollStatus},
36b4e7a29SLoGin     libs::spinlock::SpinLockGuard,
46b4e7a29SLoGin };
56b4e7a29SLoGin use alloc::sync::Arc;
66b4e7a29SLoGin use core::fmt::Debug;
791e9d4abSLoGin use system_error::SystemError;
86b4e7a29SLoGin 
96b4e7a29SLoGin use super::KernFSInode;
106b4e7a29SLoGin 
116b4e7a29SLoGin /// KernFS文件的回调接口
126b4e7a29SLoGin ///
136b4e7a29SLoGin /// 当用户态程序打开、读取、写入、关闭文件时,kernfs会调用相应的回调函数。
146b4e7a29SLoGin pub trait KernFSCallback: Send + Sync + Debug {
open(&self, data: KernCallbackData) -> Result<(), SystemError>156b4e7a29SLoGin     fn open(&self, data: KernCallbackData) -> Result<(), SystemError>;
166b4e7a29SLoGin 
read( &self, data: KernCallbackData, buf: &mut [u8], offset: usize, ) -> Result<usize, SystemError>176b4e7a29SLoGin     fn read(
186b4e7a29SLoGin         &self,
196b4e7a29SLoGin         data: KernCallbackData,
206b4e7a29SLoGin         buf: &mut [u8],
216b4e7a29SLoGin         offset: usize,
226b4e7a29SLoGin     ) -> Result<usize, SystemError>;
236b4e7a29SLoGin 
write( &self, data: KernCallbackData, buf: &[u8], offset: usize, ) -> Result<usize, SystemError>246b4e7a29SLoGin     fn write(
256b4e7a29SLoGin         &self,
266b4e7a29SLoGin         data: KernCallbackData,
276b4e7a29SLoGin         buf: &[u8],
286b4e7a29SLoGin         offset: usize,
296b4e7a29SLoGin     ) -> Result<usize, SystemError>;
306b4e7a29SLoGin 
poll(&self, data: KernCallbackData) -> Result<PollStatus, SystemError>316b4e7a29SLoGin     fn poll(&self, data: KernCallbackData) -> Result<PollStatus, SystemError>;
326b4e7a29SLoGin }
336b4e7a29SLoGin 
346b4e7a29SLoGin /// KernFS文件的回调数据
356b4e7a29SLoGin #[derive(Debug)]
366b4e7a29SLoGin pub struct KernCallbackData<'a> {
376b4e7a29SLoGin     kern_inode: Arc<KernFSInode>,
386b4e7a29SLoGin     private_data: SpinLockGuard<'a, Option<KernInodePrivateData>>,
396b4e7a29SLoGin }
406b4e7a29SLoGin 
416b4e7a29SLoGin #[allow(dead_code)]
426b4e7a29SLoGin impl<'a> KernCallbackData<'a> {
new( kern_inode: Arc<KernFSInode>, private_data: SpinLockGuard<'a, Option<KernInodePrivateData>>, ) -> Self436b4e7a29SLoGin     pub fn new(
446b4e7a29SLoGin         kern_inode: Arc<KernFSInode>,
456b4e7a29SLoGin         private_data: SpinLockGuard<'a, Option<KernInodePrivateData>>,
466b4e7a29SLoGin     ) -> Self {
476b4e7a29SLoGin         Self {
486b4e7a29SLoGin             kern_inode,
496b4e7a29SLoGin             private_data,
506b4e7a29SLoGin         }
516b4e7a29SLoGin     }
526b4e7a29SLoGin 
536b4e7a29SLoGin     #[inline(always)]
kern_inode(&self) -> &Arc<KernFSInode>546b4e7a29SLoGin     pub fn kern_inode(&self) -> &Arc<KernFSInode> {
556b4e7a29SLoGin         return &self.kern_inode;
566b4e7a29SLoGin     }
576b4e7a29SLoGin 
586b4e7a29SLoGin     #[inline(always)]
private_data(&self) -> &Option<KernInodePrivateData>596b4e7a29SLoGin     pub fn private_data(&self) -> &Option<KernInodePrivateData> {
606b4e7a29SLoGin         return &self.private_data;
616b4e7a29SLoGin     }
626b4e7a29SLoGin 
636b4e7a29SLoGin     #[inline(always)]
private_data_mut(&mut self) -> &mut Option<KernInodePrivateData>646b4e7a29SLoGin     pub fn private_data_mut(&mut self) -> &mut Option<KernInodePrivateData> {
656b4e7a29SLoGin         return &mut self.private_data;
666b4e7a29SLoGin     }
6706d5e247SLoGin 
callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError>6806d5e247SLoGin     pub fn callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError> {
6906d5e247SLoGin         let private_data = self.private_data();
7006d5e247SLoGin         if let Some(private_data) = private_data {
7106d5e247SLoGin             return private_data.callback_read(buf, offset);
7206d5e247SLoGin         }
73*1074eb34SSamuel Dai         return Err(SystemError::ENOSYS);
7406d5e247SLoGin     }
7506d5e247SLoGin 
callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError>7606d5e247SLoGin     pub fn callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError> {
7706d5e247SLoGin         let private_data = self.private_data();
7806d5e247SLoGin         if let Some(private_data) = private_data {
7906d5e247SLoGin             return private_data.callback_write(buf, offset);
8006d5e247SLoGin         }
81*1074eb34SSamuel Dai         return Err(SystemError::ENOSYS);
8206d5e247SLoGin     }
836b4e7a29SLoGin }
846b4e7a29SLoGin 
856b4e7a29SLoGin #[allow(dead_code)]
866b4e7a29SLoGin #[derive(Debug)]
876b4e7a29SLoGin pub enum KernInodePrivateData {
886b4e7a29SLoGin     SysFS(SysFSKernPrivateData),
896b4e7a29SLoGin }
9006d5e247SLoGin 
9106d5e247SLoGin impl KernInodePrivateData {
9206d5e247SLoGin     #[inline(always)]
callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError>9306d5e247SLoGin     pub fn callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError> {
9406d5e247SLoGin         match self {
9506d5e247SLoGin             KernInodePrivateData::SysFS(private_data) => {
9606d5e247SLoGin                 return private_data.callback_read(buf, offset);
9706d5e247SLoGin             }
9806d5e247SLoGin         }
9906d5e247SLoGin     }
10006d5e247SLoGin 
10106d5e247SLoGin     #[inline(always)]
callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError>10206d5e247SLoGin     pub fn callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError> {
10306d5e247SLoGin         match self {
10406d5e247SLoGin             KernInodePrivateData::SysFS(private_data) => {
10506d5e247SLoGin                 return private_data.callback_write(buf, offset);
10606d5e247SLoGin             }
10706d5e247SLoGin         }
10806d5e247SLoGin     }
10906d5e247SLoGin }
110