|
@@ -13,107 +13,6 @@
|
|
|
|
|
|
namespace Kernel {
|
|
namespace Kernel {
|
|
|
|
|
|
-NonnullRefPtr<SysFSDeviceComponent> SysFSDeviceComponent::must_create(Device const& device)
|
|
|
|
-{
|
|
|
|
- // FIXME: Handle allocation failure gracefully
|
|
|
|
- auto device_name = MUST(KString::formatted("{}:{}", device.major(), device.minor()));
|
|
|
|
- return adopt_ref_if_nonnull(new SysFSDeviceComponent(move(device_name), device)).release_nonnull();
|
|
|
|
-}
|
|
|
|
-SysFSDeviceComponent::SysFSDeviceComponent(NonnullOwnPtr<KString> major_minor_formatted_device_name, Device const& device)
|
|
|
|
- : SysFSComponent()
|
|
|
|
- , 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());
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-UNMAP_AFTER_INIT NonnullRefPtr<SysFSDevicesDirectory> SysFSDevicesDirectory::must_create(SysFSRootDirectory const& root_directory)
|
|
|
|
-{
|
|
|
|
- auto devices_directory = adopt_ref_if_nonnull(new SysFSDevicesDirectory(root_directory)).release_nonnull();
|
|
|
|
- devices_directory->m_components.append(SysFSBlockDevicesDirectory::must_create(*devices_directory));
|
|
|
|
- devices_directory->m_components.append(SysFSCharacterDevicesDirectory::must_create(*devices_directory));
|
|
|
|
- return devices_directory;
|
|
|
|
-}
|
|
|
|
-SysFSDevicesDirectory::SysFSDevicesDirectory(SysFSRootDirectory const& root_directory)
|
|
|
|
- : SysFSDirectory(root_directory)
|
|
|
|
-{
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-NonnullRefPtr<SysFSBlockDevicesDirectory> SysFSBlockDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory)
|
|
|
|
-{
|
|
|
|
- return adopt_ref_if_nonnull(new SysFSBlockDevicesDirectory(devices_directory)).release_nonnull();
|
|
|
|
-}
|
|
|
|
-SysFSBlockDevicesDirectory::SysFSBlockDevicesDirectory(SysFSDevicesDirectory const& devices_directory)
|
|
|
|
- : SysFSDirectory(devices_directory)
|
|
|
|
-{
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-ErrorOr<void> SysFSBlockDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
|
|
|
|
-{
|
|
|
|
- VERIFY(m_parent_directory);
|
|
|
|
- TRY(callback({ ".", { fsid, component_index() }, 0 }));
|
|
|
|
- TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 }));
|
|
|
|
-
|
|
|
|
- return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr<void> {
|
|
|
|
- for (auto& exposed_device : list) {
|
|
|
|
- if (!exposed_device.is_block_device())
|
|
|
|
- continue;
|
|
|
|
- TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 }));
|
|
|
|
- }
|
|
|
|
- return {};
|
|
|
|
- });
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-RefPtr<SysFSComponent> SysFSBlockDevicesDirectory::lookup(StringView name)
|
|
|
|
-{
|
|
|
|
- return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr<SysFSComponent> {
|
|
|
|
- for (auto& exposed_device : list) {
|
|
|
|
- if (!exposed_device.is_block_device())
|
|
|
|
- continue;
|
|
|
|
- if (exposed_device.name() == name)
|
|
|
|
- return exposed_device;
|
|
|
|
- }
|
|
|
|
- return nullptr;
|
|
|
|
- });
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-NonnullRefPtr<SysFSCharacterDevicesDirectory> SysFSCharacterDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory)
|
|
|
|
-{
|
|
|
|
- return adopt_ref_if_nonnull(new SysFSCharacterDevicesDirectory(devices_directory)).release_nonnull();
|
|
|
|
-}
|
|
|
|
-SysFSCharacterDevicesDirectory::SysFSCharacterDevicesDirectory(SysFSDevicesDirectory const& devices_directory)
|
|
|
|
- : SysFSDirectory(devices_directory)
|
|
|
|
-{
|
|
|
|
-}
|
|
|
|
-ErrorOr<void> SysFSCharacterDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const
|
|
|
|
-{
|
|
|
|
- VERIFY(m_parent_directory);
|
|
|
|
- TRY(callback({ ".", { fsid, component_index() }, 0 }));
|
|
|
|
- TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 }));
|
|
|
|
-
|
|
|
|
- return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr<void> {
|
|
|
|
- for (auto& exposed_device : list) {
|
|
|
|
- if (exposed_device.is_block_device())
|
|
|
|
- continue;
|
|
|
|
- TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 }));
|
|
|
|
- }
|
|
|
|
- return {};
|
|
|
|
- });
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-RefPtr<SysFSComponent> SysFSCharacterDevicesDirectory::lookup(StringView name)
|
|
|
|
-{
|
|
|
|
- return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr<SysFSComponent> {
|
|
|
|
- for (auto& exposed_device : list) {
|
|
|
|
- if (exposed_device.is_block_device())
|
|
|
|
- continue;
|
|
|
|
- if (exposed_device.name() == name)
|
|
|
|
- return exposed_device;
|
|
|
|
- }
|
|
|
|
- return nullptr;
|
|
|
|
- });
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
Device::Device(MajorNumber major, MinorNumber minor)
|
|
Device::Device(MajorNumber major, MinorNumber minor)
|
|
: m_major(major)
|
|
: m_major(major)
|
|
, m_minor(minor)
|
|
, m_minor(minor)
|