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