Skip to content

Commit

Permalink
Kernel: Make File::write() and File::read() return KResultOr<size_t>
Browse files Browse the repository at this point in the history
Instead of returning a ssize_t where negative values mean error,
we now return KResultOr<size_t> and use the error state to report
errors exclusively.
  • Loading branch information
awesomekling committed Aug 4, 2020
1 parent 58feebe commit 7a3ab6c
Show file tree
Hide file tree
Showing 58 changed files with 223 additions and 229 deletions.
6 changes: 3 additions & 3 deletions Kernel/Console.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,18 @@ bool Console::can_read(const Kernel::FileDescription&, size_t) const
return false;
}

ssize_t Console::read(Kernel::FileDescription&, size_t, u8*, ssize_t)
Kernel::KResultOr<size_t> Console::read(Kernel::FileDescription&, size_t, u8*, size_t)
{
// FIXME: Implement reading from the console.
// Maybe we could use a ring buffer for this device?
return 0;
}

ssize_t Console::write(Kernel::FileDescription&, size_t, const u8* data, ssize_t size)
Kernel::KResultOr<size_t> Console::write(Kernel::FileDescription&, size_t, const u8* data, size_t size)
{
if (!size)
return 0;
for (ssize_t i = 0; i < size; ++i)
for (size_t i = 0; i < size; ++i)
put_char(data[i]);
return size;
}
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Console.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ class Console final : public Kernel::CharacterDevice {
// ^CharacterDevice
virtual bool can_read(const Kernel::FileDescription&, size_t) const override;
virtual bool can_write(const Kernel::FileDescription&, size_t) const override { return true; }
virtual ssize_t read(Kernel::FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(Kernel::FileDescription&, size_t, const u8*, ssize_t) override;
virtual Kernel::KResultOr<size_t> read(Kernel::FileDescription&, size_t, u8*, size_t) override;
virtual Kernel::KResultOr<size_t> write(Kernel::FileDescription&, size_t, const u8*, size_t) override;
virtual const char* class_name() const override { return "Console"; }

void put_char(char);
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/BXVGADevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ class BXVGADevice final : public BlockDevice {
virtual const char* class_name() const override { return "BXVGA"; }
virtual bool can_read(const FileDescription&, size_t) const override { return true; }
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override { return -EINVAL; }
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override { return -EINVAL; }
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override { return -EINVAL; }
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override { return -EINVAL; }
virtual bool read_blocks(unsigned, u16, u8*) override { return false; }
virtual bool write_blocks(unsigned, u16, const u8*) override { return false; }

Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/DiskPartition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ DiskPartition::~DiskPartition()
{
}

ssize_t DiskPartition::read(FileDescription& fd, size_t offset, u8* outbuf, ssize_t len)
KResultOr<size_t> DiskPartition::read(FileDescription& fd, size_t offset, u8* outbuf, size_t len)
{
unsigned adjust = m_block_offset * block_size();

Expand All @@ -70,7 +70,7 @@ bool DiskPartition::can_read(const FileDescription& fd, size_t offset) const
return m_device->can_read(fd, offset + adjust);
}

ssize_t DiskPartition::write(FileDescription& fd, size_t offset, const u8* inbuf, ssize_t len)
KResultOr<size_t> DiskPartition::write(FileDescription& fd, size_t offset, const u8* inbuf, size_t len)
{
unsigned adjust = m_block_offset * block_size();

Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/DiskPartition.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ class DiskPartition final : public BlockDevice {
virtual bool write_blocks(unsigned index, u16 count, const u8*) override;

// ^BlockDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;

private:
Expand Down
10 changes: 5 additions & 5 deletions Kernel/Devices/FullDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,18 +46,18 @@ bool FullDevice::can_read(const FileDescription&, size_t) const
return true;
}

ssize_t FullDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> FullDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ssize_t count = min(static_cast<ssize_t>(PAGE_SIZE), size);
memset(buffer, 0, (size_t)count);
ssize_t count = min(static_cast<size_t>(PAGE_SIZE), size);
memset(buffer, 0, count);
return count;
}

ssize_t FullDevice::write(FileDescription&, size_t, const u8*, ssize_t size)
KResultOr<size_t> FullDevice::write(FileDescription&, size_t, const u8*, size_t size)
{
if (size == 0)
return 0;
return -ENOSPC;
return KResult(-ENOSPC);
}

}
4 changes: 2 additions & 2 deletions Kernel/Devices/FullDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ class FullDevice final : public CharacterDevice {

private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual const char* class_name() const override { return "FullDevice"; }
Expand Down
6 changes: 3 additions & 3 deletions Kernel/Devices/KeyboardDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -366,9 +366,9 @@ bool KeyboardDevice::can_read(const FileDescription&, size_t) const
return !m_queue.is_empty();
}

ssize_t KeyboardDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> KeyboardDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ssize_t nread = 0;
size_t nread = 0;
while (nread < size) {
if (m_queue.is_empty())
break;
Expand All @@ -382,7 +382,7 @@ ssize_t KeyboardDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
return nread;
}

ssize_t KeyboardDevice::write(FileDescription&, size_t, const u8*, ssize_t)
KResultOr<size_t> KeyboardDevice::write(FileDescription&, size_t, const u8*, size_t)
{
return 0;
}
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/KeyboardDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ class KeyboardDevice final : public IRQHandler
void set_maps(Keyboard::CharacterMapData character_map);

// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8* buffer, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8* buffer, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }

virtual const char* purpose() const override { return class_name(); }
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/MBVGADevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ class MBVGADevice final : public BlockDevice {
virtual const char* class_name() const override { return "MBVGA"; }
virtual bool can_read(const FileDescription&, size_t) const override { return true; }
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override { return -EINVAL; }
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override { return -EINVAL; }
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override { return -EINVAL; }
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override { return -EINVAL; }
virtual bool read_blocks(unsigned, u16, u8*) override { return false; }
virtual bool write_blocks(unsigned, u16, const u8*) override { return false; }

Expand Down
6 changes: 3 additions & 3 deletions Kernel/Devices/NullDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,14 @@ bool NullDevice::can_read(const FileDescription&, size_t) const
return true;
}

ssize_t NullDevice::read(FileDescription&, size_t, u8*, ssize_t)
KResultOr<size_t> NullDevice::read(FileDescription&, size_t, u8*, size_t)
{
return 0;
}

ssize_t NullDevice::write(FileDescription&, size_t, const u8*, ssize_t buffer_size)
KResultOr<size_t> NullDevice::write(FileDescription&, size_t, const u8*, size_t buffer_size)
{
return min(static_cast<ssize_t>(PAGE_SIZE), buffer_size);
return min(static_cast<size_t>(PAGE_SIZE), buffer_size);
}

}
4 changes: 2 additions & 2 deletions Kernel/Devices/NullDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ class NullDevice final : public CharacterDevice {

private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual bool can_read(const FileDescription&, size_t) const override;
virtual const char* class_name() const override { return "NullDevice"; }
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/PATADiskDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ void PATADiskDevice::set_drive_geometry(u16 cyls, u16 heads, u16 spt)
m_sectors_per_track = spt;
}

ssize_t PATADiskDevice::read(FileDescription&, size_t offset, u8* outbuf, ssize_t len)
KResultOr<size_t> PATADiskDevice::read(FileDescription&, size_t offset, u8* outbuf, size_t len)
{
unsigned index = offset / block_size();
u16 whole_blocks = len / block_size();
Expand Down Expand Up @@ -121,7 +121,7 @@ bool PATADiskDevice::can_read(const FileDescription&, size_t offset) const
return offset < (m_cylinders * m_heads * m_sectors_per_track * block_size());
}

ssize_t PATADiskDevice::write(FileDescription&, size_t offset, const u8* inbuf, ssize_t len)
KResultOr<size_t> PATADiskDevice::write(FileDescription&, size_t offset, const u8* inbuf, size_t len)
{
unsigned index = offset / block_size();
u16 whole_blocks = len / block_size();
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/PATADiskDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ class PATADiskDevice final : public BlockDevice {
void set_drive_geometry(u16, u16, u16);

// ^BlockDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;

protected:
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/PS2MouseDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ bool PS2MouseDevice::can_read(const FileDescription&, size_t) const
return !m_queue.is_empty();
}

ssize_t PS2MouseDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> PS2MouseDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ASSERT(size > 0);
size_t nread = 0;
Expand All @@ -344,7 +344,7 @@ ssize_t PS2MouseDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
return nread;
}

ssize_t PS2MouseDevice::write(FileDescription&, size_t, const u8*, ssize_t)
KResultOr<size_t> PS2MouseDevice::write(FileDescription&, size_t, const u8*, size_t)
{
return 0;
}
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/PS2MouseDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ class PS2MouseDevice final : public IRQHandler

// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }

virtual const char* purpose() const override { return class_name(); }
Expand Down
6 changes: 3 additions & 3 deletions Kernel/Devices/RandomDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,16 @@ bool RandomDevice::can_read(const FileDescription&, size_t) const
return true;
}

ssize_t RandomDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> RandomDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
get_good_random_bytes(buffer, size);
return size;
}

ssize_t RandomDevice::write(FileDescription&, size_t, const u8*, ssize_t size)
KResultOr<size_t> RandomDevice::write(FileDescription&, size_t, const u8*, size_t size)
{
// FIXME: Use input for entropy? I guess that could be a neat feature?
return min(static_cast<ssize_t>(PAGE_SIZE), size);
return min(static_cast<size_t>(PAGE_SIZE), size);
}

}
4 changes: 2 additions & 2 deletions Kernel/Devices/RandomDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ class RandomDevice final : public CharacterDevice {

private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual const char* class_name() const override { return "RandomDevice"; }
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/SB16.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ bool SB16::can_read(const FileDescription&, size_t) const
return false;
}

ssize_t SB16::read(FileDescription&, size_t, u8*, ssize_t)
KResultOr<size_t> SB16::read(FileDescription&, size_t, u8*, size_t)
{
return 0;
}
Expand Down Expand Up @@ -226,7 +226,7 @@ void SB16::wait_for_irq()
disable_irq();
}

ssize_t SB16::write(FileDescription&, size_t, const u8* data, ssize_t length)
KResultOr<size_t> SB16::write(FileDescription&, size_t, const u8* data, size_t length)
{
if (!m_dma_region) {
auto page = MM.allocate_supervisor_physical_page();
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/SB16.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ class SB16 final : public IRQHandler

// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }

virtual const char* purpose() const override { return class_name(); }
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/SerialDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ bool SerialDevice::can_read(const FileDescription&, size_t) const
return (get_line_status() & DataReady) != 0;
}

ssize_t SerialDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> SerialDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
if (!size)
return 0;
Expand All @@ -63,7 +63,7 @@ bool SerialDevice::can_write(const FileDescription&, size_t) const
return (get_line_status() & EmptyTransmitterHoldingRegister) != 0;
}

ssize_t SerialDevice::write(FileDescription&, size_t, const u8* buffer, ssize_t size)
KResultOr<size_t> SerialDevice::write(FileDescription&, size_t, const u8* buffer, size_t size)
{
if (!size)
return 0;
Expand Down
4 changes: 2 additions & 2 deletions Kernel/Devices/SerialDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ class SerialDevice final : public CharacterDevice {

// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;

enum InterruptEnable {
LowPowerMode = 0x01 << 5,
Expand Down
10 changes: 5 additions & 5 deletions Kernel/Devices/ZeroDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,16 @@ bool ZeroDevice::can_read(const FileDescription&, size_t) const
return true;
}

ssize_t ZeroDevice::read(FileDescription&, size_t, u8* buffer, ssize_t size)
KResultOr<size_t> ZeroDevice::read(FileDescription&, size_t, u8* buffer, size_t size)
{
ssize_t count = min(static_cast<ssize_t>(PAGE_SIZE), size);
memset(buffer, 0, (size_t)count);
ssize_t count = min(static_cast<size_t>(PAGE_SIZE), size);
memset(buffer, 0, count);
return count;
}

ssize_t ZeroDevice::write(FileDescription&, size_t, const u8*, ssize_t size)
KResultOr<size_t> ZeroDevice::write(FileDescription&, size_t, const u8*, size_t size)
{
return min(static_cast<ssize_t>(PAGE_SIZE), size);
return min(static_cast<size_t>(PAGE_SIZE), size);
}

}
4 changes: 2 additions & 2 deletions Kernel/Devices/ZeroDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ class ZeroDevice final : public CharacterDevice {

private:
// ^CharacterDevice
virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
virtual KResultOr<size_t> read(FileDescription&, size_t, u8*, size_t) override;
virtual KResultOr<size_t> write(FileDescription&, size_t, const u8*, size_t) override;
virtual bool can_read(const FileDescription&, size_t) const override;
virtual bool can_write(const FileDescription&, size_t) const override { return true; }
virtual const char* class_name() const override { return "ZeroDevice"; }
Expand Down
8 changes: 4 additions & 4 deletions Kernel/DoubleBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,21 @@ void DoubleBuffer::flip()
compute_lockfree_metadata();
}

ssize_t DoubleBuffer::write(const u8* data, ssize_t size)
size_t DoubleBuffer::write(const u8* data, size_t size)
{
if (!size)
return 0;
ASSERT(size > 0);
LOCKER(m_lock);
ssize_t bytes_to_write = min(static_cast<size_t>(size), m_space_for_writing);
size_t bytes_to_write = min(size, m_space_for_writing);
u8* write_ptr = m_write_buffer->data + m_write_buffer->size;
m_write_buffer->size += bytes_to_write;
compute_lockfree_metadata();
memcpy(write_ptr, data, bytes_to_write);
return bytes_to_write;
}

ssize_t DoubleBuffer::read(u8* data, ssize_t size)
size_t DoubleBuffer::read(u8* data, size_t size)
{
if (!size)
return 0;
Expand All @@ -82,7 +82,7 @@ ssize_t DoubleBuffer::read(u8* data, ssize_t size)
flip();
if (m_read_buffer_index >= m_read_buffer->size)
return 0;
ssize_t nread = min((ssize_t)m_read_buffer->size - (ssize_t)m_read_buffer_index, size);
size_t nread = min(m_read_buffer->size - m_read_buffer_index, size);
memcpy(data, m_read_buffer->data + m_read_buffer_index, nread);
m_read_buffer_index += nread;
compute_lockfree_metadata();
Expand Down
Loading

0 comments on commit 7a3ab6c

Please sign in to comment.