Add as_device method for file handle

This commit is contained in:
LI Qing
2023-08-10 11:52:01 +08:00
committed by Tate, Hongliang Tian
parent 576578baf4
commit 2edbe1f725
7 changed files with 29 additions and 2 deletions

View File

@ -119,8 +119,13 @@ impl Inode for Ptmx {
fn fs(&self) -> Arc<dyn FileSystem> {
self.devpts()
}
fn as_device(&self) -> Option<Arc<dyn Device>> {
Some(Arc::new(self.inner))
}
}
#[derive(Clone, Copy)]
struct Inner;
impl Device for Inner {

View File

@ -107,4 +107,8 @@ impl Inode for PtySlaveInode {
fn fs(&self) -> Arc<dyn FileSystem> {
self.fs.upgrade().unwrap()
}
fn as_device(&self) -> Option<Arc<dyn Device>> {
Some(self.device.clone())
}
}

View File

@ -1,7 +1,8 @@
//! Opend File Handle
use crate::events::{IoEvents, Observer};
use crate::fs::utils::{AccessMode, IoctlCmd, Metadata, SeekFrom, StatusFlags};
use crate::events::Observer;
use crate::fs::device::Device;
use crate::fs::utils::{AccessMode, IoEvents, IoctlCmd, Metadata, Poller, SeekFrom, StatusFlags};
use crate::net::socket::Socket;
use crate::prelude::*;
use crate::process::signal::Poller;
@ -73,6 +74,10 @@ pub trait FileLike: Send + Sync + Any {
fn as_socket(&self) -> Option<&dyn Socket> {
None
}
fn as_device(&self) -> Option<Arc<dyn Device>> {
None
}
}
impl dyn FileLike {

View File

@ -107,4 +107,8 @@ impl FileLike for InodeHandle<Rights> {
// Close does not guarantee that the data has been successfully saved to disk.
Ok(())
}
fn as_device(&self) -> Option<Arc<dyn Device>> {
self.dentry().vnode().as_device()
}
}

View File

@ -5,6 +5,7 @@ mod static_cap;
use core::sync::atomic::{AtomicU32, Ordering};
use crate::fs::device::Device;
use crate::fs::file_handle::FileLike;
use crate::fs::utils::{
AccessMode, Dentry, DirentVisitor, InodeType, IoctlCmd, Metadata, SeekFrom, StatusFlags,

View File

@ -574,6 +574,10 @@ impl Inode for RamInode {
Ok(device_inode)
}
fn as_device(&self) -> Option<Arc<dyn Device>> {
self.0.read().inner.as_device().cloned()
}
fn create(&self, name: &str, type_: InodeType, mode: InodeMode) -> Result<Arc<dyn Inode>> {
if self.0.read().metadata.type_ != InodeType::Dir {
return_errno_with_message!(Errno::ENOTDIR, "self is not dir");

View File

@ -285,6 +285,10 @@ pub trait Inode: Any + Sync + Send {
Err(Error::new(Errno::ENOTDIR))
}
fn as_device(&self) -> Option<Arc<dyn Device>> {
None
}
fn readdir_at(&self, offset: usize, visitor: &mut dyn DirentVisitor) -> Result<usize> {
Err(Error::new(Errno::ENOTDIR))
}