diff --git a/Kernel/Storage/StorageDevice.cpp b/Kernel/Storage/StorageDevice.cpp index 217fc518104..4588f676178 100644 --- a/Kernel/Storage/StorageDevice.cpp +++ b/Kernel/Storage/StorageDevice.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Kernel { @@ -187,4 +188,17 @@ bool StorageDevice::can_write(const OpenFileDescription&, size_t offset) const return offset < (max_addressable_block() * block_size()); } +KResult StorageDevice::ioctl(OpenFileDescription&, unsigned request, Userspace arg) +{ + switch (request) { + case STORAGE_DEVICE_GET_SIZE: { + size_t disk_size = m_max_addressable_block * block_size(); + return copy_to_user(Userspace(arg), &disk_size); + break; + } + default: + return EINVAL; + } +} + } diff --git a/Kernel/Storage/StorageDevice.h b/Kernel/Storage/StorageDevice.h index 9eaa1e5a959..86b1b38d488 100644 --- a/Kernel/Storage/StorageDevice.h +++ b/Kernel/Storage/StorageDevice.h @@ -50,6 +50,9 @@ public: virtual CommandSet command_set() const = 0; + // ^File + virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace arg) final; + protected: StorageDevice(int, int, size_t, u64, NonnullOwnPtr); // ^DiskDevice diff --git a/Userland/Libraries/LibC/sys/ioctl_numbers.h b/Userland/Libraries/LibC/sys/ioctl_numbers.h index 577e912ecbf..1fa706f02f8 100644 --- a/Userland/Libraries/LibC/sys/ioctl_numbers.h +++ b/Userland/Libraries/LibC/sys/ioctl_numbers.h @@ -88,7 +88,8 @@ enum IOCtlNumber { KCOV_ENABLE, KCOV_DISABLE, SOUNDCARD_IOCTL_SET_SAMPLE_RATE, - SOUNDCARD_IOCTL_GET_SAMPLE_RATE + SOUNDCARD_IOCTL_GET_SAMPLE_RATE, + STORAGE_DEVICE_GET_SIZE, }; #define TIOCGPGRP TIOCGPGRP @@ -132,3 +133,4 @@ enum IOCtlNumber { #define FIONREAD FIONREAD #define SOUNDCARD_IOCTL_SET_SAMPLE_RATE SOUNDCARD_IOCTL_SET_SAMPLE_RATE #define SOUNDCARD_IOCTL_GET_SAMPLE_RATE SOUNDCARD_IOCTL_GET_SAMPLE_RATE +#define STORAGE_DEVICE_GET_SIZE STORAGE_DEVICE_GET_SIZE