1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:27:35 +00:00

Kernel/SysFS: Add /sys/devices/storage directory

This change in fact does the following:
1. Use support for symlinks between /sys/dev/block/ storage device
identifier nodes and devices in /sys/devices/storage/{LUN}.
2. Add basic nodes in a /sys/devices/storage/{LUN} directory, to let
userspace to know about the device and its details.
This commit is contained in:
Liav A 2022-04-23 11:48:40 +03:00 committed by Andreas Kling
parent 22335e53e0
commit 1dbd32488f
19 changed files with 450 additions and 1 deletions

View file

@ -13,7 +13,11 @@
namespace Kernel {
class Device;
class StorageDevice;
class SysFSBlockDevicesDirectory final : public SysFSDirectory {
friend class Device;
friend class StorageDevice;
public:
virtual StringView name() const override { return "block"sv; }
static NonnullRefPtr<SysFSBlockDevicesDirectory> must_create(SysFSDeviceIdentifiersDirectory const&);

View file

@ -12,6 +12,14 @@
namespace Kernel {
static SysFSDeviceIdentifiersDirectory* s_the { nullptr };
SysFSDeviceIdentifiersDirectory& SysFSDeviceIdentifiersDirectory::the()
{
VERIFY(s_the);
return *s_the;
}
UNMAP_AFTER_INIT NonnullRefPtr<SysFSDeviceIdentifiersDirectory> SysFSDeviceIdentifiersDirectory::must_create(SysFSRootDirectory const& root_directory)
{
auto devices_directory = adopt_ref_if_nonnull(new SysFSDeviceIdentifiersDirectory(root_directory)).release_nonnull();
@ -20,7 +28,7 @@ UNMAP_AFTER_INIT NonnullRefPtr<SysFSDeviceIdentifiersDirectory> SysFSDeviceIdent
list.append(SysFSCharacterDevicesDirectory::must_create(*devices_directory));
return {};
}));
s_the = devices_directory;
return devices_directory;
}
SysFSDeviceIdentifiersDirectory::SysFSDeviceIdentifiersDirectory(SysFSRootDirectory const& root_directory)

View file

@ -16,6 +16,8 @@ public:
virtual StringView name() const override { return "dev"sv; }
static NonnullRefPtr<SysFSDeviceIdentifiersDirectory> must_create(SysFSRootDirectory const&);
static SysFSDeviceIdentifiersDirectory& the();
private:
explicit SysFSDeviceIdentifiersDirectory(SysFSRootDirectory const&);
};

View file

@ -0,0 +1,27 @@
/*
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <Kernel/Devices/Device.h>
#include <Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.h>
#include <Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h>
#include <Kernel/Sections.h>
namespace Kernel {
ErrorOr<NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> SysFSSymbolicLinkDeviceComponent::try_create(SysFSDeviceIdentifiersDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component)
{
auto device_name = TRY(KString::formatted("{}:{}", device.major(), device.minor()));
return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSSymbolicLinkDeviceComponent(parent_directory, move(device_name), device, pointed_component));
}
SysFSSymbolicLinkDeviceComponent::SysFSSymbolicLinkDeviceComponent(SysFSDeviceIdentifiersDirectory const& parent_directory, NonnullOwnPtr<KString> major_minor_formatted_device_name, Device const& device, SysFSComponent const& pointed_component)
: SysFSSymbolicLink(parent_directory, pointed_component)
, m_block_device(device.is_block_device())
, m_major_minor_formatted_device_name(move(major_minor_formatted_device_name))
{
VERIFY(device.is_block_device() || device.is_character_device());
}
}

View file

@ -0,0 +1,33 @@
/*
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/IntrusiveList.h>
#include <Kernel/FileSystem/SysFS/Component.h>
#include <Kernel/KString.h>
namespace Kernel {
class SysFSDeviceIdentifiersDirectory;
class SysFSSymbolicLinkDeviceComponent final
: public SysFSSymbolicLink
, public Weakable<SysFSSymbolicLinkDeviceComponent> {
friend class SysFSComponentRegistry;
public:
static ErrorOr<NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> try_create(SysFSDeviceIdentifiersDirectory const& parent_directory, Device const&, SysFSComponent const& pointed_component);
virtual StringView name() const override { return m_major_minor_formatted_device_name->view(); }
bool is_block_device() const { return m_block_device; }
private:
SysFSSymbolicLinkDeviceComponent(SysFSDeviceIdentifiersDirectory const& parent_directory, NonnullOwnPtr<KString> major_minor_formatted_device_name, Device const&, SysFSComponent const& pointed_component);
IntrusiveListNode<SysFSSymbolicLinkDeviceComponent, NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> m_list_node;
bool const m_block_device { false };
NonnullOwnPtr<KString> m_major_minor_formatted_device_name;
};
}