瀏覽代碼

Kernel: Add STORAGE_DEVICE_GET_SIZE ioctl request

This ioctl request makes it possible to get the size of a storage device
that has not yet been mounted.
David Isaksson 3 年之前
父節點
當前提交
3b089032f4
共有 3 個文件被更改,包括 20 次插入1 次删除
  1. 14 0
      Kernel/Storage/StorageDevice.cpp
  2. 3 0
      Kernel/Storage/StorageDevice.h
  3. 3 1
      Userland/Libraries/LibC/sys/ioctl_numbers.h

+ 14 - 0
Kernel/Storage/StorageDevice.cpp

@@ -10,6 +10,7 @@
 #include <Kernel/FileSystem/OpenFileDescription.h>
 #include <Kernel/FileSystem/OpenFileDescription.h>
 #include <Kernel/Storage/StorageDevice.h>
 #include <Kernel/Storage/StorageDevice.h>
 #include <Kernel/Storage/StorageManagement.h>
 #include <Kernel/Storage/StorageManagement.h>
+#include <LibC/sys/ioctl_numbers.h>
 
 
 namespace Kernel {
 namespace Kernel {
 
 
@@ -187,4 +188,17 @@ bool StorageDevice::can_write(const OpenFileDescription&, size_t offset) const
     return offset < (max_addressable_block() * block_size());
     return offset < (max_addressable_block() * block_size());
 }
 }
 
 
+KResult StorageDevice::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
+{
+    switch (request) {
+    case STORAGE_DEVICE_GET_SIZE: {
+        size_t disk_size = m_max_addressable_block * block_size();
+        return copy_to_user(Userspace<size_t*>(arg), &disk_size);
+        break;
+    }
+    default:
+        return EINVAL;
+    }
+}
+
 }
 }

+ 3 - 0
Kernel/Storage/StorageDevice.h

@@ -50,6 +50,9 @@ public:
 
 
     virtual CommandSet command_set() const = 0;
     virtual CommandSet command_set() const = 0;
 
 
+    // ^File
+    virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) final;
+
 protected:
 protected:
     StorageDevice(int, int, size_t, u64, NonnullOwnPtr<KString>);
     StorageDevice(int, int, size_t, u64, NonnullOwnPtr<KString>);
     // ^DiskDevice
     // ^DiskDevice

+ 3 - 1
Userland/Libraries/LibC/sys/ioctl_numbers.h

@@ -88,7 +88,8 @@ enum IOCtlNumber {
     KCOV_ENABLE,
     KCOV_ENABLE,
     KCOV_DISABLE,
     KCOV_DISABLE,
     SOUNDCARD_IOCTL_SET_SAMPLE_RATE,
     SOUNDCARD_IOCTL_SET_SAMPLE_RATE,
-    SOUNDCARD_IOCTL_GET_SAMPLE_RATE
+    SOUNDCARD_IOCTL_GET_SAMPLE_RATE,
+    STORAGE_DEVICE_GET_SIZE,
 };
 };
 
 
 #define TIOCGPGRP TIOCGPGRP
 #define TIOCGPGRP TIOCGPGRP
@@ -132,3 +133,4 @@ enum IOCtlNumber {
 #define FIONREAD FIONREAD
 #define FIONREAD FIONREAD
 #define SOUNDCARD_IOCTL_SET_SAMPLE_RATE SOUNDCARD_IOCTL_SET_SAMPLE_RATE
 #define SOUNDCARD_IOCTL_SET_SAMPLE_RATE SOUNDCARD_IOCTL_SET_SAMPLE_RATE
 #define SOUNDCARD_IOCTL_GET_SAMPLE_RATE SOUNDCARD_IOCTL_GET_SAMPLE_RATE
 #define SOUNDCARD_IOCTL_GET_SAMPLE_RATE SOUNDCARD_IOCTL_GET_SAMPLE_RATE
+#define STORAGE_DEVICE_GET_SIZE STORAGE_DEVICE_GET_SIZE