diff --git a/kernel/src/fs/inode_handle/mod.rs b/kernel/src/fs/inode_handle/mod.rs index b10dce460..f4bd07e2f 100644 --- a/kernel/src/fs/inode_handle/mod.rs +++ b/kernel/src/fs/inode_handle/mod.rs @@ -48,6 +48,10 @@ impl InodeHandle_ { return file_io.read(writer); } + if !self.dentry.inode().is_seekable() { + return self.read_at(0, writer); + } + let mut offset = self.offset.lock(); let len = self.read_at(*offset, writer)?; @@ -61,6 +65,10 @@ impl InodeHandle_ { return file_io.write(reader); } + if !self.dentry.inode().is_seekable() { + return self.write_at(0, reader); + } + let mut offset = self.offset.lock(); if self.status_flags().contains(StatusFlags::O_APPEND) { diff --git a/kernel/src/fs/ramfs/fs.rs b/kernel/src/fs/ramfs/fs.rs index 3ca754a83..d626d9b08 100644 --- a/kernel/src/fs/ramfs/fs.rs +++ b/kernel/src/fs/ramfs/fs.rs @@ -1189,6 +1189,13 @@ impl Inode for RamInode { return_errno_with_message!(Errno::EINVAL, "ioctl is not supported"); } + fn is_seekable(&self) -> bool { + !matches!( + self.typ, + InodeType::NamedPipe | InodeType::CharDevice | InodeType::Dir | InodeType::Socket + ) + } + fn extension(&self) -> Option<&Extension> { Some(&self.extension) } diff --git a/kernel/src/fs/utils/inode.rs b/kernel/src/fs/utils/inode.rs index 7a01cdbb0..249e9fe53 100644 --- a/kernel/src/fs/utils/inode.rs +++ b/kernel/src/fs/utils/inode.rs @@ -426,6 +426,10 @@ pub trait Inode: Any + Sync + Send { true } + fn is_seekable(&self) -> bool { + true + } + /// Get the extension of this inode fn extension(&self) -> Option<&Extension> { None