xref: /DragonOS/kernel/src/filesystem/kernfs/callback.rs (revision 06d5e247267cb65b84a80f219853ccd0f384b16e)
16b4e7a29SLoGin use crate::{
26b4e7a29SLoGin     filesystem::{sysfs::SysFSKernPrivateData, vfs::PollStatus},
36b4e7a29SLoGin     libs::spinlock::SpinLockGuard,
46b4e7a29SLoGin     syscall::SystemError,
56b4e7a29SLoGin };
66b4e7a29SLoGin use alloc::sync::Arc;
76b4e7a29SLoGin use core::fmt::Debug;
86b4e7a29SLoGin 
96b4e7a29SLoGin use super::KernFSInode;
106b4e7a29SLoGin 
116b4e7a29SLoGin /// KernFS文件的回调接口
126b4e7a29SLoGin ///
136b4e7a29SLoGin /// 当用户态程序打开、读取、写入、关闭文件时,kernfs会调用相应的回调函数。
146b4e7a29SLoGin pub trait KernFSCallback: Send + Sync + Debug {
156b4e7a29SLoGin     fn open(&self, data: KernCallbackData) -> Result<(), SystemError>;
166b4e7a29SLoGin 
176b4e7a29SLoGin     fn read(
186b4e7a29SLoGin         &self,
196b4e7a29SLoGin         data: KernCallbackData,
206b4e7a29SLoGin         buf: &mut [u8],
216b4e7a29SLoGin         offset: usize,
226b4e7a29SLoGin     ) -> Result<usize, SystemError>;
236b4e7a29SLoGin 
246b4e7a29SLoGin     fn write(
256b4e7a29SLoGin         &self,
266b4e7a29SLoGin         data: KernCallbackData,
276b4e7a29SLoGin         buf: &[u8],
286b4e7a29SLoGin         offset: usize,
296b4e7a29SLoGin     ) -> Result<usize, SystemError>;
306b4e7a29SLoGin 
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> {
436b4e7a29SLoGin     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)]
546b4e7a29SLoGin     pub fn kern_inode(&self) -> &Arc<KernFSInode> {
556b4e7a29SLoGin         return &self.kern_inode;
566b4e7a29SLoGin     }
576b4e7a29SLoGin 
586b4e7a29SLoGin     #[inline(always)]
596b4e7a29SLoGin     pub fn private_data(&self) -> &Option<KernInodePrivateData> {
606b4e7a29SLoGin         return &self.private_data;
616b4e7a29SLoGin     }
626b4e7a29SLoGin 
636b4e7a29SLoGin     #[inline(always)]
646b4e7a29SLoGin     pub fn private_data_mut(&mut self) -> &mut Option<KernInodePrivateData> {
656b4e7a29SLoGin         return &mut self.private_data;
666b4e7a29SLoGin     }
67*06d5e247SLoGin 
68*06d5e247SLoGin     pub fn callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError> {
69*06d5e247SLoGin         let private_data = self.private_data();
70*06d5e247SLoGin         if let Some(private_data) = private_data {
71*06d5e247SLoGin             return private_data.callback_read(buf, offset);
72*06d5e247SLoGin         }
73*06d5e247SLoGin         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
74*06d5e247SLoGin     }
75*06d5e247SLoGin 
76*06d5e247SLoGin     pub fn callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError> {
77*06d5e247SLoGin         let private_data = self.private_data();
78*06d5e247SLoGin         if let Some(private_data) = private_data {
79*06d5e247SLoGin             return private_data.callback_write(buf, offset);
80*06d5e247SLoGin         }
81*06d5e247SLoGin         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
82*06d5e247SLoGin     }
836b4e7a29SLoGin }
846b4e7a29SLoGin 
856b4e7a29SLoGin #[allow(dead_code)]
866b4e7a29SLoGin #[derive(Debug)]
876b4e7a29SLoGin pub enum KernInodePrivateData {
886b4e7a29SLoGin     SysFS(SysFSKernPrivateData),
896b4e7a29SLoGin }
90*06d5e247SLoGin 
91*06d5e247SLoGin impl KernInodePrivateData {
92*06d5e247SLoGin     #[inline(always)]
93*06d5e247SLoGin     pub fn callback_read(&self, buf: &mut [u8], offset: usize) -> Result<usize, SystemError> {
94*06d5e247SLoGin         match self {
95*06d5e247SLoGin             KernInodePrivateData::SysFS(private_data) => {
96*06d5e247SLoGin                 return private_data.callback_read(buf, offset);
97*06d5e247SLoGin             }
98*06d5e247SLoGin         }
99*06d5e247SLoGin     }
100*06d5e247SLoGin 
101*06d5e247SLoGin     #[inline(always)]
102*06d5e247SLoGin     pub fn callback_write(&self, buf: &[u8], offset: usize) -> Result<usize, SystemError> {
103*06d5e247SLoGin         match self {
104*06d5e247SLoGin             KernInodePrivateData::SysFS(private_data) => {
105*06d5e247SLoGin                 return private_data.callback_write(buf, offset);
106*06d5e247SLoGin             }
107*06d5e247SLoGin         }
108*06d5e247SLoGin     }
109*06d5e247SLoGin }
110