From 96a153dfc5fda6ac8652c1da149562037200939b Mon Sep 17 00:00:00 2001 From: Shaowei Song Date: Wed, 30 Oct 2024 03:42:01 +0000 Subject: [PATCH] Implement dummy `metadata()` for epoll and socket files --- kernel/src/fs/epoll/epoll_file.rs | 16 ++++++++++++++-- kernel/src/fs/file_handle.rs | 5 ++--- kernel/src/fs/pipe.rs | 4 ++++ kernel/src/net/socket/ip/datagram/mod.rs | 15 ++++++++++++++- kernel/src/net/socket/ip/stream/mod.rs | 15 ++++++++++++++- kernel/src/net/socket/unix/stream/socket.rs | 15 ++++++++++++++- kernel/src/net/socket/vsock/stream/socket.rs | 15 ++++++++++++++- kernel/src/syscall/eventfd.rs | 2 ++ 8 files changed, 78 insertions(+), 9 deletions(-) diff --git a/kernel/src/fs/epoll/epoll_file.rs b/kernel/src/fs/epoll/epoll_file.rs index e53c69e8..f391973c 100644 --- a/kernel/src/fs/epoll/epoll_file.rs +++ b/kernel/src/fs/epoll/epoll_file.rs @@ -12,7 +12,10 @@ use ostd::sync::LocalIrqDisabled; use super::*; use crate::{ events::Observer, - fs::{file_handle::FileLike, utils::IoctlCmd}, + fs::{ + file_handle::FileLike, + utils::{InodeMode, IoctlCmd, Metadata}, + }, process::signal::{Pollable, Pollee, Poller}, }; @@ -341,7 +344,6 @@ impl Pollable for EpollFile { } } -// Implement the common methods required by FileHandle impl FileLike for EpollFile { fn read(&self, _writer: &mut VmWriter) -> Result { return_errno_with_message!(Errno::EINVAL, "epoll files do not support read"); @@ -370,6 +372,16 @@ impl FileLike for EpollFile { ) -> Option>> { self.pollee.unregister_observer(observer) } + + fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "anonymous inode fs" and link `EpollFile` to it. + Metadata::new_file( + 0, + InodeMode::from_bits_truncate(0o600), + aster_block::BLOCK_SIZE, + ) + } } /// An epoll entry that is contained in an epoll file. diff --git a/kernel/src/fs/file_handle.rs b/kernel/src/fs/file_handle.rs index 79e7afe7..a67b8cae 100644 --- a/kernel/src/fs/file_handle.rs +++ b/kernel/src/fs/file_handle.rs @@ -54,9 +54,8 @@ pub trait FileLike: Pollable + Send + Sync + Any { return_errno_with_message!(Errno::EINVAL, "resize is not supported"); } - fn metadata(&self) -> Metadata { - panic!("metadata unsupported"); - } + /// Get the metadata that describes this file. + fn metadata(&self) -> Metadata; fn mode(&self) -> Result { return_errno_with_message!(Errno::EINVAL, "mode is not supported"); diff --git a/kernel/src/fs/pipe.rs b/kernel/src/fs/pipe.rs index 10503f80..0a82bd95 100644 --- a/kernel/src/fs/pipe.rs +++ b/kernel/src/fs/pipe.rs @@ -84,6 +84,8 @@ impl FileLike for PipeReader { } fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "PipeFS" and link `PipeReader` to it. let now = RealTimeCoarseClock::get().read_time(); Metadata { dev: 0, @@ -166,6 +168,8 @@ impl FileLike for PipeWriter { } fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "PipeFS" and link `PipeWriter` to it. let now = RealTimeCoarseClock::get().read_time(); Metadata { dev: 0, diff --git a/kernel/src/net/socket/ip/datagram/mod.rs b/kernel/src/net/socket/ip/datagram/mod.rs index b27634af..913db8dc 100644 --- a/kernel/src/net/socket/ip/datagram/mod.rs +++ b/kernel/src/net/socket/ip/datagram/mod.rs @@ -9,7 +9,10 @@ use self::{bound::BoundDatagram, unbound::UnboundDatagram}; use super::{common::get_ephemeral_endpoint, UNSPECIFIED_LOCAL_ENDPOINT}; use crate::{ events::{IoEvents, Observer}, - fs::{file_handle::FileLike, utils::StatusFlags}, + fs::{ + file_handle::FileLike, + utils::{InodeMode, Metadata, StatusFlags}, + }, match_sock_option_mut, net::{ iface::poll_ifaces, @@ -271,6 +274,16 @@ impl FileLike for DatagramSocket { ) -> Option>> { self.pollee.unregister_observer(observer) } + + fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "SockFS" and link `DatagramSocket` to it. + Metadata::new_socket( + 0, + InodeMode::from_bits_truncate(0o140777), + aster_block::BLOCK_SIZE, + ) + } } impl Socket for DatagramSocket { diff --git a/kernel/src/net/socket/ip/stream/mod.rs b/kernel/src/net/socket/ip/stream/mod.rs index b0dc1434..81257fa2 100644 --- a/kernel/src/net/socket/ip/stream/mod.rs +++ b/kernel/src/net/socket/ip/stream/mod.rs @@ -15,7 +15,10 @@ use util::TcpOptionSet; use super::UNSPECIFIED_LOCAL_ENDPOINT; use crate::{ events::{IoEvents, Observer}, - fs::{file_handle::FileLike, utils::StatusFlags}, + fs::{ + file_handle::FileLike, + utils::{InodeMode, Metadata, StatusFlags}, + }, match_sock_option_mut, match_sock_option_ref, net::{ iface::poll_ifaces, @@ -428,6 +431,16 @@ impl FileLike for StreamSocket { ) -> Option>> { self.pollee.unregister_observer(observer) } + + fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "SockFS" and link `StreamSocket` to it. + Metadata::new_socket( + 0, + InodeMode::from_bits_truncate(0o140777), + aster_block::BLOCK_SIZE, + ) + } } impl Socket for StreamSocket { diff --git a/kernel/src/net/socket/unix/stream/socket.rs b/kernel/src/net/socket/unix/stream/socket.rs index f94e1db5..39c88ada 100644 --- a/kernel/src/net/socket/unix/stream/socket.rs +++ b/kernel/src/net/socket/unix/stream/socket.rs @@ -11,7 +11,10 @@ use super::{ }; use crate::{ events::{IoEvents, Observer}, - fs::{file_handle::FileLike, utils::StatusFlags}, + fs::{ + file_handle::FileLike, + utils::{InodeMode, Metadata, StatusFlags}, + }, net::socket::{ unix::UnixSocketAddr, util::{send_recv_flags::SendRecvFlags, socket_addr::SocketAddr, MessageHeader}, @@ -213,6 +216,16 @@ impl FileLike for UnixStreamSocket { State::Connected(connected) => connected.unregister_observer(observer), } } + + fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "SockFS" and link `UnixStreamSocket` to it. + Metadata::new_socket( + 0, + InodeMode::from_bits_truncate(0o140777), + aster_block::BLOCK_SIZE, + ) + } } impl Socket for UnixStreamSocket { diff --git a/kernel/src/net/socket/vsock/stream/socket.rs b/kernel/src/net/socket/vsock/stream/socket.rs index 62b385e9..bee77838 100644 --- a/kernel/src/net/socket/vsock/stream/socket.rs +++ b/kernel/src/net/socket/vsock/stream/socket.rs @@ -5,7 +5,10 @@ use core::sync::atomic::{AtomicBool, Ordering}; use super::{connected::Connected, connecting::Connecting, init::Init, listen::Listen}; use crate::{ events::IoEvents, - fs::{file_handle::FileLike, utils::StatusFlags}, + fs::{ + file_handle::FileLike, + utils::{InodeMode, Metadata, StatusFlags}, + }, net::socket::{ vsock::{addr::VsockSocketAddr, VSOCK_GLOBAL}, MessageHeader, SendRecvFlags, SockShutdownCmd, Socket, SocketAddr, @@ -171,6 +174,16 @@ impl FileLike for VsockStreamSocket { } Ok(()) } + + fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "SockFS" and link `VsockStreamSocket` to it. + Metadata::new_socket( + 0, + InodeMode::from_bits_truncate(0o140777), + aster_block::BLOCK_SIZE, + ) + } } impl Socket for VsockStreamSocket { diff --git a/kernel/src/syscall/eventfd.rs b/kernel/src/syscall/eventfd.rs index e26628a0..c77b48e5 100644 --- a/kernel/src/syscall/eventfd.rs +++ b/kernel/src/syscall/eventfd.rs @@ -262,6 +262,8 @@ impl FileLike for EventFile { } fn metadata(&self) -> Metadata { + // This is a dummy implementation. + // TODO: Add "anonymous inode fs" and link `EventFile` to it. let now = RealTimeClock::get().read_time(); Metadata { dev: 0,