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