mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
4744ccbff0
LUN address is essentially how people used to address SCSI devices back in the day we had these devices more in use. However, SCSI was taken as an abstraction layer for many Unix and Unix-like systems, so it still common to see LUN addresses in use. In Serenity, we don't really provide such abstraction layer, and therefore until now, we didn't use LUNs too. However (again), this changes, as we want to let users to address their devices under SysFS easily. LUNs make sense in that regard, because they can be easily adapted to different interfaces besides SCSI. For example, for legacy ATA hard drive being connected to the first IDE controller which was enumerated on the PCI bus, and then to the primary channel as slave device, the LUN address would be 0:0:1. To make this happen, we add unique ID number to each StorageController, which increments by 1 for each new instance of StorageController. Then, we adapt the ATA and NVMe devices to use these numbers and generate LUN in the construction time.
60 lines
1.6 KiB
C++
60 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2020-2022, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/IntrusiveList.h>
|
|
#include <AK/NonnullRefPtr.h>
|
|
#include <AK/NonnullRefPtrVector.h>
|
|
#include <AK/Types.h>
|
|
#include <Kernel/FileSystem/FileSystem.h>
|
|
#include <Kernel/Storage/Partition/DiskPartition.h>
|
|
#include <Kernel/Storage/StorageController.h>
|
|
#include <Kernel/Storage/StorageDevice.h>
|
|
|
|
namespace Kernel {
|
|
|
|
class PartitionTable;
|
|
class StorageManagement {
|
|
|
|
public:
|
|
StorageManagement();
|
|
static bool initialized();
|
|
void initialize(StringView boot_argument, bool force_pio, bool nvme_poll);
|
|
static StorageManagement& the();
|
|
|
|
NonnullRefPtr<FileSystem> root_filesystem() const;
|
|
|
|
static MajorNumber storage_type_major_number();
|
|
static MinorNumber generate_storage_minor_number();
|
|
|
|
static u32 generate_controller_id();
|
|
|
|
void remove_device(StorageDevice&);
|
|
|
|
private:
|
|
bool boot_argument_contains_partition_uuid();
|
|
|
|
void enumerate_pci_controllers(bool force_pio, bool nvme_poll);
|
|
void enumerate_storage_devices();
|
|
void enumerate_disk_partitions();
|
|
|
|
void determine_boot_device();
|
|
void determine_boot_device_with_partition_uuid();
|
|
|
|
void dump_storage_devices_and_partitions() const;
|
|
|
|
ErrorOr<NonnullOwnPtr<PartitionTable>> try_to_initialize_partition_table(StorageDevice const&) const;
|
|
|
|
RefPtr<BlockDevice> boot_block_device() const;
|
|
|
|
StringView m_boot_argument;
|
|
WeakPtr<BlockDevice> m_boot_block_device;
|
|
NonnullRefPtrVector<StorageController> m_controllers;
|
|
IntrusiveList<&StorageDevice::m_list_node> m_storage_devices;
|
|
};
|
|
|
|
}
|