Ver Fonte

LibPartition: Make PartitionTable kernel/userland agnostic

Previously, PartitionTable was constructed using a Kernel::StorageDevice
making it only usable in the kernel. This commit adds a new constructor
that takes a Core::File instead, making it usable in userland as well.

This also adds the m_block_size field which stores the block size of the
underlying device obtained by calling StorageDevice::block_size() in the
kernel or by using the STORAGE_DEVICE_GET_BLOCK_SIZE ioctl in userland.
This avoids the need for an #ifdef every time block size is needed.
Samuel Bowman há 3 anos atrás
pai
commit
6a1c85aa61

+ 1 - 0
Userland/Libraries/LibPartition/CMakeLists.txt

@@ -7,3 +7,4 @@ set(SOURCES
 )
 
 serenity_lib(LibPartition partition)
+target_link_libraries(LibPartition LibCore)

+ 14 - 1
Userland/Libraries/LibPartition/PartitionTable.cpp

@@ -6,14 +6,27 @@
 
 #include <LibPartition/PartitionTable.h>
 
+#ifndef KERNEL
+#    include <sys/ioctl.h>
+#endif
+
 namespace Partition {
 
+#ifdef KERNEL
 PartitionTable::PartitionTable(Kernel::StorageDevice const& device)
     : m_device(device)
+    , m_block_size(device.block_size())
+{
+}
+#else
+PartitionTable::PartitionTable(NonnullRefPtr<Core::File> device_file)
+    : m_device_file(device_file)
 {
+    VERIFY(ioctl(m_device_file->leak_fd(), STORAGE_DEVICE_GET_BLOCK_SIZE, &m_block_size) >= 0);
 }
+#endif
 
-Optional<DiskPartitionMetadata> PartitionTable::partition(unsigned index)
+Optional<DiskPartitionMetadata> PartitionTable::partition(unsigned index) const
 {
     if (index > partitions_count())
         return {};

+ 15 - 3
Userland/Libraries/LibPartition/PartitionTable.h

@@ -6,25 +6,37 @@
 
 #pragma once
 
-#include <Kernel/Storage/StorageDevice.h>
 #include <LibPartition/DiskPartitionMetadata.h>
 
+#ifdef KERNEL
+#    include <Kernel/Storage/StorageDevice.h>
+#else
+#    include <LibCore/File.h>
+#endif
+
 namespace Partition {
 
 class PartitionTable {
 public:
-    Optional<DiskPartitionMetadata> partition(unsigned index);
+    Optional<DiskPartitionMetadata> partition(unsigned index) const;
     size_t partitions_count() const { return m_partitions.size(); }
     virtual ~PartitionTable() = default;
     virtual bool is_valid() const = 0;
 
     Vector<DiskPartitionMetadata> partitions() const { return m_partitions; }
+    size_t block_size() const { return m_block_size; }
 
 protected:
+#ifdef KERNEL
     explicit PartitionTable(Kernel::StorageDevice const&);
-
     NonnullRefPtr<Kernel::StorageDevice> m_device;
+#else
+    explicit PartitionTable(NonnullRefPtr<Core::File>);
+    NonnullRefPtr<Core::File> m_device_file;
+#endif
+
     Vector<DiskPartitionMetadata> m_partitions;
+    size_t m_block_size;
 };
 
 }