diff --git a/kernel/src/fs/VFS.h b/kernel/src/fs/VFS.h index ef4a1ed2..0b5410a7 100644 --- a/kernel/src/fs/VFS.h +++ b/kernel/src/fs/VFS.h @@ -32,6 +32,8 @@ namespace VFS virtual Result truncate(usize size) = 0; + virtual bool blocking() const = 0; + // Metadata accessors virtual usize size() = 0; @@ -73,6 +75,11 @@ namespace VFS return err(ENOTDIR); } + bool blocking() const override + { + return false; + } + InodeType type() const override { return InodeType::RegularFile; diff --git a/kernel/src/fs/devices/ConsoleDevice.cpp b/kernel/src/fs/devices/ConsoleDevice.cpp index 571446ad..310dceb8 100644 --- a/kernel/src/fs/devices/ConsoleDevice.cpp +++ b/kernel/src/fs/devices/ConsoleDevice.cpp @@ -17,3 +17,8 @@ Result ConsoleDevice::write(const u8* buf, usize, usize length) TextConsole::write((const char*)buf, length); return length; } + +bool ConsoleDevice::blocking() const +{ + return false; +} diff --git a/kernel/src/fs/devices/ConsoleDevice.h b/kernel/src/fs/devices/ConsoleDevice.h index 1d1bb970..e242f7c2 100644 --- a/kernel/src/fs/devices/ConsoleDevice.h +++ b/kernel/src/fs/devices/ConsoleDevice.h @@ -11,5 +11,7 @@ class ConsoleDevice : public Device Result write(const u8*, usize, usize) override; + bool blocking() const override; + virtual ~ConsoleDevice() = default; }; diff --git a/kernel/src/fs/devices/Device.h b/kernel/src/fs/devices/Device.h index ea8d8c21..dbf9bd28 100644 --- a/kernel/src/fs/devices/Device.h +++ b/kernel/src/fs/devices/Device.h @@ -8,5 +8,7 @@ class Device virtual Result write(const u8* buf, usize offset, usize length) = 0; + virtual bool blocking() const = 0; + virtual ~Device() = default; }; diff --git a/kernel/src/fs/devices/NullDevice.h b/kernel/src/fs/devices/NullDevice.h index 8461dbe3..358b46c2 100644 --- a/kernel/src/fs/devices/NullDevice.h +++ b/kernel/src/fs/devices/NullDevice.h @@ -17,5 +17,10 @@ class NullDevice : public Device return 0; } + bool blocking() const override + { + return false; + } + virtual ~NullDevice() = default; }; diff --git a/kernel/src/fs/tmpfs/FileSystem.h b/kernel/src/fs/tmpfs/FileSystem.h index 94efe12d..e1f26eac 100644 --- a/kernel/src/fs/tmpfs/FileSystem.h +++ b/kernel/src/fs/tmpfs/FileSystem.h @@ -134,6 +134,11 @@ namespace TmpFS return err(EINVAL); } + bool blocking() const override + { + return m_device->blocking(); + } + usize size() override { return 0; @@ -196,6 +201,11 @@ namespace TmpFS return err(EISDIR); } + bool blocking() const override + { + return false; + } + usize size() override { return 0; diff --git a/kernel/src/sys/file.cpp b/kernel/src/sys/file.cpp index e95e2932..eda1c035 100644 --- a/kernel/src/sys/file.cpp +++ b/kernel/src/sys/file.cpp @@ -21,6 +21,8 @@ Result sys_read(Registers*, SyscallArgs args) if (!descriptor.is_readable()) return err(EBADF); + while (descriptor.inode->blocking()) { kernel_sleep(10); } + usize nread = TRY(descriptor.inode->read(buf, descriptor.offset, size)); descriptor.offset += nread;