mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:38:11 +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:
parent
22335e53e0
commit
1dbd32488f
19 changed files with 450 additions and 1 deletions
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <Kernel/Bus/PCI/API.h>
|
||||
#include <Kernel/Bus/PCI/Access.h>
|
||||
#include <Kernel/Debug.h>
|
||||
#include <Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.h>
|
||||
#include <Kernel/Sections.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
StringView StorageDeviceAttributeSysFSComponent::name() const
|
||||
{
|
||||
switch (m_type) {
|
||||
case Type::EndLBA:
|
||||
return "last_lba"sv;
|
||||
case Type::SectorSize:
|
||||
return "sector_size"sv;
|
||||
case Type::CommandSet:
|
||||
return "command_set"sv;
|
||||
case Type::InterfaceType:
|
||||
return "interface_type"sv;
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
NonnullRefPtr<StorageDeviceAttributeSysFSComponent> StorageDeviceAttributeSysFSComponent::must_create(StorageDeviceSysFSDirectory const& device_directory, Type type)
|
||||
{
|
||||
return adopt_ref(*new (nothrow) StorageDeviceAttributeSysFSComponent(device_directory, type));
|
||||
}
|
||||
|
||||
StorageDeviceAttributeSysFSComponent::StorageDeviceAttributeSysFSComponent(StorageDeviceSysFSDirectory const& device_directory, Type type)
|
||||
: SysFSComponent()
|
||||
, m_device(device_directory.device({}))
|
||||
, m_type(type)
|
||||
{
|
||||
}
|
||||
|
||||
ErrorOr<size_t> StorageDeviceAttributeSysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const
|
||||
{
|
||||
auto blob = TRY(try_to_generate_buffer());
|
||||
|
||||
if ((size_t)offset >= blob->size())
|
||||
return 0;
|
||||
|
||||
ssize_t nread = min(static_cast<off_t>(blob->size() - offset), static_cast<off_t>(count));
|
||||
TRY(buffer.write(blob->data() + offset, nread));
|
||||
return nread;
|
||||
}
|
||||
|
||||
ErrorOr<NonnullOwnPtr<KBuffer>> StorageDeviceAttributeSysFSComponent::try_to_generate_buffer() const
|
||||
{
|
||||
OwnPtr<KString> value;
|
||||
switch (m_type) {
|
||||
case Type::EndLBA:
|
||||
value = TRY(KString::formatted("{}", m_device->max_addressable_block()));
|
||||
break;
|
||||
case Type::SectorSize:
|
||||
value = TRY(KString::formatted("{}", m_device->block_size()));
|
||||
break;
|
||||
case Type::CommandSet:
|
||||
value = TRY(KString::formatted("{}", m_device->command_set_to_string_view()));
|
||||
break;
|
||||
case Type::InterfaceType:
|
||||
value = TRY(KString::formatted("{}", m_device->interface_type_to_string_view()));
|
||||
break;
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
return KBuffer::try_create_with_bytes("SysFS StorageDeviceAttributeComponent buffer"sv, value->view().bytes());
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue