2020-01-18 05:38:21 -03:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
|
|
|
*
|
2021-04-22 05:24:48 -03:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2020-01-18 05:38:21 -03:00
|
|
|
*/
|
|
|
|
|
|
2020-08-24 22:35:19 -03:00
|
|
|
#include <AK/Singleton.h>
|
2019-04-28 23:55:54 -03:00
|
|
|
#include <Kernel/Devices/Device.h>
|
2021-09-11 03:19:20 -03:00
|
|
|
#include <Kernel/Devices/DeviceManagement.h>
|
2020-01-22 18:23:50 -03:00
|
|
|
#include <Kernel/FileSystem/InodeMetadata.h>
|
2022-10-23 15:51:56 -03:00
|
|
|
#include <Kernel/FileSystem/SysFS/Component.h>
|
2022-04-22 18:26:36 -03:00
|
|
|
#include <Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.h>
|
|
|
|
|
#include <Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.h>
|
2021-08-14 04:13:27 -03:00
|
|
|
#include <Kernel/Sections.h>
|
2019-02-15 21:47:20 -02:00
|
|
|
|
2020-02-15 21:27:42 -03:00
|
|
|
namespace Kernel {
|
|
|
|
|
|
2021-12-23 15:08:18 -03:00
|
|
|
Device::Device(MajorNumber major, MinorNumber minor)
|
2019-06-07 06:43:58 -03:00
|
|
|
: m_major(major)
|
|
|
|
|
, m_minor(minor)
|
2019-02-17 06:38:07 -03:00
|
|
|
{
|
2021-09-10 08:44:46 -03:00
|
|
|
}
|
|
|
|
|
|
2022-04-23 05:19:02 -03:00
|
|
|
void Device::before_will_be_destroyed_remove_from_device_management()
|
|
|
|
|
{
|
|
|
|
|
DeviceManagement::the().before_device_removal({}, *this);
|
|
|
|
|
m_state = State::BeingRemoved;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Device::after_inserting_add_to_device_management()
|
2021-09-10 08:44:46 -03:00
|
|
|
{
|
2021-09-11 03:19:20 -03:00
|
|
|
DeviceManagement::the().after_inserting_device({}, *this);
|
2022-04-23 05:19:02 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Device::after_inserting()
|
|
|
|
|
{
|
|
|
|
|
after_inserting_add_to_device_management();
|
2021-09-10 08:44:46 -03:00
|
|
|
VERIFY(!m_sysfs_component);
|
2021-08-14 05:40:37 -03:00
|
|
|
auto sys_fs_component = SysFSDeviceComponent::must_create(*this);
|
|
|
|
|
m_sysfs_component = sys_fs_component;
|
2022-07-16 04:39:57 -03:00
|
|
|
after_inserting_add_to_device_identifier_directory();
|
2021-08-14 05:40:37 -03:00
|
|
|
}
|
|
|
|
|
|
2021-12-28 20:00:29 -03:00
|
|
|
void Device::will_be_destroyed()
|
2021-08-14 05:40:37 -03:00
|
|
|
{
|
2021-09-10 08:44:46 -03:00
|
|
|
VERIFY(m_sysfs_component);
|
2022-07-16 04:39:57 -03:00
|
|
|
before_will_be_destroyed_remove_from_device_identifier_directory();
|
2022-04-23 05:19:02 -03:00
|
|
|
before_will_be_destroyed_remove_from_device_management();
|
2019-02-17 06:38:07 -03:00
|
|
|
}
|
|
|
|
|
|
2019-02-15 21:47:20 -02:00
|
|
|
Device::~Device()
|
|
|
|
|
{
|
2021-08-14 05:40:37 -03:00
|
|
|
VERIFY(m_state == State::BeingRemoved);
|
2019-02-15 21:47:20 -02:00
|
|
|
}
|
|
|
|
|
|
2022-04-01 14:58:27 -03:00
|
|
|
ErrorOr<NonnullOwnPtr<KString>> Device::pseudo_path(OpenFileDescription const&) const
|
2019-02-15 21:47:20 -02:00
|
|
|
{
|
2021-11-29 08:03:33 -03:00
|
|
|
return KString::formatted("device:{},{}", major(), minor());
|
2019-08-17 06:17:36 -03:00
|
|
|
}
|
2020-02-15 21:27:42 -03:00
|
|
|
|
2022-04-01 14:58:27 -03:00
|
|
|
void Device::process_next_queued_request(Badge<AsyncDeviceRequest>, AsyncDeviceRequest const& completed_request)
|
2020-11-02 15:16:01 -03:00
|
|
|
{
|
2021-08-21 20:49:22 -03:00
|
|
|
SpinlockLocker lock(m_requests_lock);
|
2021-02-06 20:59:32 -03:00
|
|
|
VERIFY(!m_requests.is_empty());
|
|
|
|
|
VERIFY(m_requests.first().ptr() == &completed_request);
|
|
|
|
|
m_requests.remove(m_requests.begin());
|
|
|
|
|
if (!m_requests.is_empty()) {
|
|
|
|
|
auto* next_request = m_requests.first().ptr();
|
|
|
|
|
next_request->do_start(move(lock));
|
2020-11-02 15:16:01 -03:00
|
|
|
}
|
|
|
|
|
|
2020-11-29 20:05:27 -03:00
|
|
|
evaluate_block_conditions();
|
2020-11-02 15:16:01 -03:00
|
|
|
}
|
|
|
|
|
|
2020-02-15 21:27:42 -03:00
|
|
|
}
|