From 4e0f85432a5d7b53555da25c39dee6f6d093f1b9 Mon Sep 17 00:00:00 2001 From: Liav A Date: Wed, 10 Aug 2022 22:08:41 +0300 Subject: [PATCH] Kernel/Storage: Remove the ramdisk implementation Nobody uses this because the x86 prekernel environment is corrupting the ramdisk image prior to running the actual kernel. In the future we can ensure that the prekernel doesn't corrupt the ramdisk if we want to bring support back. In addition to that, we could just use a RAM based filesystem to load whatever is needed like in Linux, without the need of additional filesystem driver. For the mentioned corruption problem, look at issue #9893. --- Kernel/CMakeLists.txt | 2 - Kernel/Storage/Ramdisk/Controller.cpp | 67 --------------------------- Kernel/Storage/Ramdisk/Controller.h | 36 -------------- Kernel/Storage/Ramdisk/Device.cpp | 60 ------------------------ Kernel/Storage/Ramdisk/Device.h | 41 ---------------- Kernel/Storage/StorageDevice.cpp | 2 - Kernel/Storage/StorageDevice.h | 1 - Kernel/Storage/StorageManagement.cpp | 17 ------- Kernel/Storage/StorageManagement.h | 1 - 9 files changed, 227 deletions(-) delete mode 100644 Kernel/Storage/Ramdisk/Controller.cpp delete mode 100644 Kernel/Storage/Ramdisk/Controller.h delete mode 100644 Kernel/Storage/Ramdisk/Device.cpp delete mode 100644 Kernel/Storage/Ramdisk/Device.h diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 777086cf6f..7a9d2cd397 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -100,8 +100,6 @@ set(KERNEL_SOURCES Storage/NVMe/NVMeInterruptQueue.cpp Storage/NVMe/NVMePollQueue.cpp Storage/NVMe/NVMeQueue.cpp - Storage/Ramdisk/Controller.cpp - Storage/Ramdisk/Device.cpp Storage/DiskPartition.cpp Storage/StorageController.cpp Storage/StorageDevice.cpp diff --git a/Kernel/Storage/Ramdisk/Controller.cpp b/Kernel/Storage/Ramdisk/Controller.cpp deleted file mode 100644 index 495c070836..0000000000 --- a/Kernel/Storage/Ramdisk/Controller.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2021, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include - -namespace Kernel { - -NonnullLockRefPtr RamdiskController::initialize() -{ - return adopt_lock_ref(*new RamdiskController()); -} - -bool RamdiskController::reset() -{ - TODO(); -} - -bool RamdiskController::shutdown() -{ - TODO(); -} - -size_t RamdiskController::devices_count() const -{ - return m_devices.size(); -} - -void RamdiskController::complete_current_request(AsyncDeviceRequest::RequestResult) -{ - VERIFY_NOT_REACHED(); -} - -RamdiskController::RamdiskController() - : StorageController(0) -{ - // Populate ramdisk controllers from Multiboot boot modules, if any. - size_t count = 0; - MM.for_each_used_memory_range([&](auto& used_memory_range) { - if (used_memory_range.type == Memory::UsedMemoryRangeType::BootModule) { - size_t length = Memory::page_round_up(used_memory_range.end.get()).release_value_but_fixme_should_propagate_errors() - used_memory_range.start.get(); - auto region_or_error = MM.allocate_kernel_region(used_memory_range.start, length, "Ramdisk"sv, Memory::Region::Access::ReadWrite); - if (region_or_error.is_error()) { - dmesgln("RamdiskController: Failed to allocate kernel region of size {}", length); - } else { - m_devices.append(RamdiskDevice::create(*this, region_or_error.release_value(), 6, count)); - } - count++; - } - }); -} - -RamdiskController::~RamdiskController() = default; - -LockRefPtr RamdiskController::device(u32 index) const -{ - if (index >= m_devices.size()) - return nullptr; - return m_devices[index]; -} - -} diff --git a/Kernel/Storage/Ramdisk/Controller.h b/Kernel/Storage/Ramdisk/Controller.h deleted file mode 100644 index 56c31a0c03..0000000000 --- a/Kernel/Storage/Ramdisk/Controller.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2021, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace Kernel { - -class AsyncBlockDeviceRequest; - -class RamdiskController final : public StorageController { -public: - static NonnullLockRefPtr initialize(); - virtual ~RamdiskController() override; - - virtual LockRefPtr device(u32 index) const override; - virtual bool reset() override; - virtual bool shutdown() override; - virtual size_t devices_count() const override; - virtual void complete_current_request(AsyncDeviceRequest::RequestResult) override; - -private: - RamdiskController(); - - NonnullLockRefPtrVector m_devices; -}; -} diff --git a/Kernel/Storage/Ramdisk/Device.cpp b/Kernel/Storage/Ramdisk/Device.cpp deleted file mode 100644 index 08033bb0a1..0000000000 --- a/Kernel/Storage/Ramdisk/Device.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2021, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include -#include - -namespace Kernel { - -NonnullLockRefPtr RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr&& region, int major, int minor) -{ - auto device_or_error = DeviceManagement::try_create_device(controller, move(region), major, minor); - // FIXME: Find a way to propagate errors - VERIFY(!device_or_error.is_error()); - return device_or_error.release_value(); -} - -RamdiskDevice::RamdiskDevice(RamdiskController const& controller, NonnullOwnPtr&& region, int major, int minor) - : StorageDevice({}, LUNAddress { controller.controller_id(), 0, 0 }, 0, major, minor, 512, region->size() / 512) - , m_region(move(region)) -{ - dmesgln("Ramdisk: Device #{} @ {}, Capacity={}", minor, m_region->vaddr(), max_addressable_block() * 512); -} - -RamdiskDevice::~RamdiskDevice() = default; - -StringView RamdiskDevice::class_name() const -{ - return "RamdiskDevice"sv; -} - -void RamdiskDevice::start_request(AsyncBlockDeviceRequest& request) -{ - MutexLocker locker(m_lock); - - u8* base = m_region->vaddr().as_ptr(); - size_t size = m_region->size(); - u8* offset = base + request.block_index() * request.block_size(); - size_t length = request.buffer_size(); - - if ((offset + length > base + size) || (offset + length < base)) { - request.complete(AsyncDeviceRequest::Failure); - } else { - ErrorOr result; - if (request.request_type() == AsyncBlockDeviceRequest::Read) { - result = request.buffer().write(offset, length); - } else { - result = request.buffer().read(offset, length); - } - request.complete(!result.is_error() ? AsyncDeviceRequest::Success : AsyncDeviceRequest::MemoryFault); - } -} - -} diff --git a/Kernel/Storage/Ramdisk/Device.h b/Kernel/Storage/Ramdisk/Device.h deleted file mode 100644 index 28759bbc9a..0000000000 --- a/Kernel/Storage/Ramdisk/Device.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2021, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include - -namespace Kernel { - -class RamdiskController; - -class RamdiskDevice final : public StorageDevice { - friend class RamdiskController; - friend class DeviceManagement; - -public: - static NonnullLockRefPtr create(RamdiskController const&, NonnullOwnPtr&& region, int major, int minor); - virtual ~RamdiskDevice() override; - - // ^DiskDevice - virtual StringView class_name() const override; - -private: - RamdiskDevice(RamdiskController const&, NonnullOwnPtr&&, int major, int minor); - - // ^BlockDevice - virtual void start_request(AsyncBlockDeviceRequest&) override; - - // ^StorageDevice - virtual CommandSet command_set() const override { return CommandSet::PlainMemory; } - - Mutex m_lock { "RamdiskDevice"sv }; - - NonnullOwnPtr m_region; -}; - -} diff --git a/Kernel/Storage/StorageDevice.cpp b/Kernel/Storage/StorageDevice.cpp index 267319632e..485fa47a47 100644 --- a/Kernel/Storage/StorageDevice.cpp +++ b/Kernel/Storage/StorageDevice.cpp @@ -66,8 +66,6 @@ StringView StorageDevice::class_name() const StringView StorageDevice::command_set_to_string_view() const { switch (command_set()) { - case CommandSet::PlainMemory: - return "memory"sv; case CommandSet::SCSI: return "scsi"sv; case CommandSet::ATA: diff --git a/Kernel/Storage/StorageDevice.h b/Kernel/Storage/StorageDevice.h index 6f99e053e4..2732c44709 100644 --- a/Kernel/Storage/StorageDevice.h +++ b/Kernel/Storage/StorageDevice.h @@ -34,7 +34,6 @@ public: // and ATAPI is the exception to no-distinction rule. If we ever put SCSI support in the kernel, // we can create another enum class to put the distinction. enum class CommandSet { - PlainMemory, SCSI, ATA, NVMe, diff --git a/Kernel/Storage/StorageManagement.cpp b/Kernel/Storage/StorageManagement.cpp index a6f6c5996b..cf84c090ff 100644 --- a/Kernel/Storage/StorageManagement.cpp +++ b/Kernel/Storage/StorageManagement.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -48,7 +47,6 @@ static constexpr StringView block_device_prefix = "block"sv; static constexpr StringView ata_device_prefix = "ata"sv; static constexpr StringView nvme_device_prefix = "nvme"sv; -static constexpr StringView ramdisk_device_prefix = "ramdisk"sv; static constexpr StringView logical_unit_number_device_prefix = "lun"sv; UNMAP_AFTER_INIT StorageManagement::StorageManagement() @@ -289,13 +287,6 @@ UNMAP_AFTER_INIT void StorageManagement::determine_nvme_boot_device() }); } -UNMAP_AFTER_INIT void StorageManagement::determine_ramdisk_boot_device() -{ - determine_hardware_relative_boot_device(ramdisk_device_prefix, [](StorageDevice const& device) -> bool { - return device.command_set() == StorageDevice::CommandSet::PlainMemory; - }); -} - UNMAP_AFTER_INIT void StorageManagement::determine_block_boot_device() { VERIFY(m_boot_argument.starts_with(block_device_prefix)); @@ -355,11 +346,6 @@ UNMAP_AFTER_INIT void StorageManagement::determine_boot_device() return; } - if (m_boot_argument.starts_with(ramdisk_device_prefix)) { - determine_ramdisk_boot_device(); - return; - } - if (m_boot_argument.starts_with(nvme_device_prefix)) { determine_nvme_boot_device(); return; @@ -442,9 +428,6 @@ UNMAP_AFTER_INIT void StorageManagement::initialize(StringView root_device, bool } else { enumerate_pci_controllers(force_pio, poll); } - // Note: Whether PCI bus is present on the system or not, always try to attach - // a given ramdisk. - m_controllers.append(RamdiskController::initialize()); enumerate_storage_devices(); enumerate_disk_partitions(); diff --git a/Kernel/Storage/StorageManagement.h b/Kernel/Storage/StorageManagement.h index 81ae90ccca..9772115901 100644 --- a/Kernel/Storage/StorageManagement.h +++ b/Kernel/Storage/StorageManagement.h @@ -55,7 +55,6 @@ private: void resolve_partition_from_boot_device_parameter(StorageDevice const& chosen_storage_device, StringView boot_device_prefix); void determine_boot_device_with_logical_unit_number(); void determine_block_boot_device(); - void determine_ramdisk_boot_device(); void determine_nvme_boot_device(); void determine_ata_boot_device(); void determine_hardware_relative_boot_device(StringView relative_hardware_prefix, Function filter_device_callback);